목록에 바인딩 된 목록 상자가 클래스입니다. 새 항목을 목록에 추가 할 때까지 모두 제대로 작동합니다. 이 과정에서 데이터 소스는 목록을 새로 고칠 수 없도록 설정되고 '새로 고침'은 처리하지 않습니다. 목록이 새로 고쳐지고 목록 상자 데이터에 바인딩 된 다른 컨트롤은 목록이 있고 올바르게 표시되지만 목록에 스크롤 막대가 표시 되어도 목록이 비어있는 것으로 표시됩니다. 나는 단지 글꼴 색을 바꾸려고 노력했다. 아무것도 없다!바운드 목록 상자는 데이터 새로 고침시 항목을 보이지 않게합니다. 왜?
누군가 이런 일이 발생하는 이유를 알고 있습니까? 그것을 고치는 방법? 또는 새로 고치는 더 좋은 방법?
코드 :
Private Sub btnNew_Click(sender As Object, e As EventArgs) Handles btnNew.Click
'lbNames is the listbox carrying all the data
Dim oContacts As List(Of clsContact) = lbNames.DataSource
lbNames.DataSource = Nothing
'Build the new Item, add it to the collection
Dim oNewCont As New clsContact
oNewCont.Editable = True
oNewCont.IsActive = True
oNewCont.Firstname = "Jimmy"
oNewCont.Lastname = "Smith"
oContacts.Add(oNewCont)
lbNames.Refresh()
' Re-Set up Autocomplete text box
Dim MySource As New AutoCompleteStringCollection()
For Each oc As clsContact In oContacts
MySource.Add(oc.FullName)
Next
txtName.AutoCompleteMode = AutoCompleteMode.Suggest
txtName.AutoCompleteCustomSource = MySource
txtName.AutoCompleteSource = AutoCompleteSource.CustomSource
'Set List Box data back to the collection
lbNames.DataSource = oContacts
lbNames.DisplayMember = "FullName"
End Sub
출발 LOAD : 당신은 잘못된 도구를 사용하고
Private Sub frmMain_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Dim oCont As List(Of clsContact)
lbNames.DrawMode = DrawMode.OwnerDrawVariable
Dim oTypes As List(Of clsPhoneType) = loadTypes()
cboPhoneType.DataSource = oTypes
cboPhoneType.DisplayMember = "Type"
cboPhoneType.ValueMember = "ID"
oCont = LoadNames()
lbNames.DataSource = oCont
lbNames.DisplayMember = "FullName"
Dim MySource As New AutoCompleteStringCollection()
For Each oc As clsContact In oCont
MySource.Add(oc.FullName)
Next
txtName.AutoCompleteMode = AutoCompleteMode.Suggest
txtName.AutoCompleteCustomSource = MySource
txtName.AutoCompleteSource = AutoCompleteSource.CustomSource
End Sub
Private Sub lbNames_DrawItem(ByVal sender As Object, ByVal e As System.Windows.Forms.DrawItemEventArgs) Handles lbNames.DrawItem
e.DrawBackground()
Dim textBrush As Brush = Brushes.Black
Dim drawFont As System.Drawing.Font = e.Font
If (e.State And DrawItemState.Selected) = DrawItemState.Selected Then
e.Graphics.FillRectangle(Brushes.WhiteSmoke, e.Bounds)
End If
Dim oCont As clsContact = DirectCast(sender, System.Windows.Forms.ListBox).Items(e.Index)
If oCont.IsActive Then
textBrush = Brushes.Black
If oCont.IsDirty Then textBrush = Brushes.LightCoral
Else
textBrush = Brushes.LightGray
End If
Dim str = oCont.FullName
e.Graphics.DrawString(str, e.Font, textBrush, e.Bounds, StringFormat.GenericDefault)
e.DrawFocusRectangle()
End Sub
당신이() lbNames.Refresh을 제거하기 위해 시도 할 수 있습니다 처리? – DevelopmentIsMyPassion
아무런 차이가 없습니다. – GDutton
'oCont' 만 FormLoad에 존재합니다 - 모듈 수준으로 만드십시오 var – Plutonix