2015-04-16 4 views
0

Я работаю над настольным приложением, разработанным на vb.net. Я пытаюсь выбрать элементы в checklistbox в зависимости от значений, которые я получаю из базы данных. Ниже приведен код для заполнения checkedlistboxesФормы Windows CheckedListBox issue

Private Sub LoadDisapprovalList() 

    cblFedralReasons.Items.Clear() 
    cblStateReasons.Items.Clear() 

    cblFedralReasons.DataSource = Main.DataClient.DisapprovalReasonList_Get(FedralReason) 
    cblFedralReasons.DisplayMember = "DisapprovalReasonTypeDesc" 
    cblFedralReasons.ValueMember = "DisapprovalReasonTypeGenId" 

    cblStateReasons.DataSource = Main.DataClient.DisapprovalReasonList_Get(StateReason) 
    cblStateReasons.DisplayMember = "DisapprovalReasonTypeDesc" 
    cblStateReasons.ValueMember = "DisapprovalReasonTypeGenId" 

End Sub 

После того, что я пытаюсь выбрать элементы на основе значений из базы данных. Вот код

Private Sub LoadApplicationDisapprovalReasons() 
    Dim lstApplicationDisapprovalReasons As New List(Of DataService.usp_ApplicationDisapprovalReason_Get_Result) 
    lstApplicationDisapprovalReasons = Main.DataClient.ApplicationDisapprovalReason_Get(_SeqID) 

    If lstApplicationDisapprovalReasons.Count > 0 Then 

     For Each item In lstApplicationDisapprovalReasons 

      Dim selectedDisapprovalId As Integer = item.DisapprovalReasonTypeGenId 
      Select Case item.DisapprovalReasonType 
       Case FedralReason  
        Dim selectedIndex = cblFedralReasons.Items.IndexOf(selectedDisapprovalId) 
        cblFedralReasons.SetItemCheckState(selectedIndex, CheckState.Checked) 

       Case StateReason 

        Dim selectedIndex = cblStateReasons.Items.IndexOf(selectedDisapprovalId) 
        cblStateReasons.SetItemCheckState(selectedIndex, CheckState.Checked) 

      End Select 

     Next 

    End If 

End Sub 

Но проблема cblFedralReasons.Items.IndexOf всегда возвращает -1. Все данные из базы данных поступают правильно, но что-то странное происходит с checklistbox, который я не мог понять.

EDIT: Также, когда я пытаюсь получить текст элемента, используя следующий код, он возвращает мне имя моих коллекций, а не текст.

cblFedralReasons.items(1).tostring 

возвращает

DisapprovalReasonList 

, а не текст этого пункта!

+0

Похоже, что CLB работает с другим набором объектов, чем в списке. Что возвращает 'DisapprovalReasonList_Get' (точный тип)? ToString возвращает имя типа, если класс не переопределяет его. – Plutonix

+0

Это список типов List (Of DataService.usp_DisapprovalReasonList_Get) – user615611

ответ

0

Я попытаюсь объяснить, что я думаю об этом:

Если cblFedralReasons имеет в Datasource в списка (DataService.usp_DisapprovalReasonList), если вы выполняете поиск selectedDisapprovalId Vía IndexOf прохождение Целое число в списке .... что -1 значение возвращается, его когерентный.
IndexOf, на коллекцию, внутренне делают Равновесие сравнение. Таким образом, вы сравниваете разные типы: Целое число vs a DataService.usp_DisapprovalReasonList.

Существует множество способов получить правильный объект из коллекции.

Одна идея может сделать переопределение Object.equals в своем классе:

Public Overrides Function Equals(ByVal p_oAnotherObject As Object) As Boolean 
    If TypeOf p_oAnotherObject Is DataService.usp_DisapprovalReasonList AndAlso Me.GetType.Equals(p_oAnotherObject.GetType) Then 
     Return Me.DisapprovalReasonTypeGenId.Equals(DirectCast(p_oAnotherObject, DataService.usp_DisapprovalReasonList).DisapprovalReasonTypeGenId) 
    Else 
     Return False 
    End If 
End Function 

Если у вас есть конструктор, принимающий идентификатор, теперь вы можете это сделать:

cblFedralReasons.Items.IndexOf(New DataService.usp_DisapprovalReasonList(selectedDisapprovalId)) 

, и тогда вы его получите.

Наконец, cblFedralReasons.items (1) .tostring, вы получаете значение GetType.Name по умолчанию. Сделайте это в своем классе, затем:

Public Overrides Function ToString() As String 
    Return DisapprovalReasonTypeDesc 
End Function 

Надеюсь, что я объяснил.