【问题标题】:Windows forms CheckedListBox issueWindows 窗体 CheckedListBox 问题
【发布时间】:2015-04-16 14:40:48
【问题描述】:

我正在开发一个在 vb.net 中开发的桌面应用程序。我正在尝试根据从数据库中获得的值选择选中列表框中的项目。下面是填充选中列表框的代码

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 发生了一些奇怪的事情,我无法理解。

编辑: 此外,当我尝试使用以下代码获取项目的文本时,它会返回我的集合名称而不是文本。

cblFedralReasons.items(1).tostring

返回

DisapprovalReasonList 

而不是那个项目的文本!

【问题讨论】:

  • 听起来 CLB 正在使用与列表中不同的一组对象。 DisapprovalReasonList_Get 返回什么(确切的类型)? ToString 将返回类型名称,除非该类覆盖它。
  • 即List(Of DataService.usp_DisapprovalReasonList_Get)类型的列表

标签: vb.net winforms checkedlistbox


【解决方案1】:

我会试着解释一下我对此的看法:

如果 cblFedralReasons 有一个 List(Of DataService.usp_DisapprovalReasonList) 作为数据源,如果您通过 IndexOf 搜索 selectedDisapprovalId em> 在列表中传递一个 Integer....返回的 -1 值是一致的。
IndexOf,在集合上,在内部进行 Equals 比较.因此,您正在比较不同的类型:IntegerDataService.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

假设您有一个接受 ID 的构造函数,您现在可以这样做:

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

然后,你会得到它。

最后,cblFedralReasons.items(1).tostring,您将获得默认的 GetType.Name。在你的课堂上这样做,然后:

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

希望我已经解释过了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-06
    • 2011-02-24
    • 1970-01-01
    • 1970-01-01
    • 2012-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多