4

我创建了一个具有多个属性的自定义用户控件。一个指定我希望控件访问哪个数据库。我希望能够向控件的用户显示一个下拉列表,他可以从中选择控件将与哪个数据库进行交互。

如何让下拉菜单工作?我可以获得默认值,但还没有弄清楚如何获得可选列表。

任何帮助表示赞赏。

谢谢。

马歇尔

4

4 回答 4

3

您只需要将自己的 TypeConverter 附加到您的财产。您将覆盖GetStandardValuesSupportedGetStandardValues方法(也可能是GetStandardValuesExclusive)以返回要显示的数据库列表。

如果您不熟悉 PropertyGrid 和 TypeConverter,这里有一个文档

于 2010-01-08T16:09:23.400 回答
1

事实证明它比我想象的要简单。

我为该属性设置了一个枚举,但在将其用于属性类型时遇到了麻烦。说它在课堂外无法访问。

然后我有一个“duh”的时刻并将枚举从 Friend 更改为 Public,然后我能够使用枚举作为属性类型。因此,当我查看控件的该属性的值时,枚举中的值会列在下拉列表中。

感谢所有回答。

马歇尔

于 2010-01-08T16:32:52.177 回答
0

我对你的问题有点困惑。

如果您的用户控件包含 DropDownList 控件,只需在用户控件的某个位置进行初始化。

最简单的方法是在用户控件的代码隐藏中,只需执行 DropDownList.Items.Add() 或添加项目的任何语法。

于 2010-01-08T15:52:43.880 回答
0

这是我用来为组合框创建自定义数据源的模板:

    Private Class Listing

    Private _List As New ArrayList

    Public Sub Add(ByVal ItemNumber As Integer, ByVal ItemName As String)

        _List.Add(New dataItem(ItemNumber, ItemName))

    End Sub

    Public ReadOnly Property List() As ArrayList
        Get
            Return _List
        End Get
    End Property

End Class

Private Class dataItem
    Private _ItemNumber As Integer
    Private _ItemName As String

    Public Sub New(ByVal intItemNumber As Integer, ByVal strItemName As String)
        Me._ItemNumber = intItemNumber
        Me._ItemName = strItemName
    End Sub

    Public ReadOnly Property ItemName() As String
        Get
            Return _ItemName
        End Get
    End Property

    Public ReadOnly Property ItemNumber() As Integer
        Get
            Return _ItemNumber
        End Get
    End Property

    Public ReadOnly Property DisplayValue() As String

        Get
            Return CStr(Me._ItemNumber).Trim & " - " & _ItemName.Trim
        End Get

    End Property

    Public Overrides Function ToString() As String

        Return CStr(Me._ItemNumber).Trim & " - " & _ItemName.Trim

    End Function

End Class

这就是我加载它的方式:

    ListBindSource = New Listing

    Me.BindingSource.MoveFirst()
    For Each Row As DataRowView In Me.BindingSource.List
        Dim strName As String = String.Empty
        Dim intPos As Integer = Me.BindingSource.Find("Number", Row("Number"))
        If intPos > -1 Then
            Me.BindingSource.Position = intPos
            strName = Me.BindingSource.Current("Name")
        End If
        ListBindSource.Add(Row("Number"), strName)
    Next

    cboNumber.DataSource = ListBindSource.POList
    cboNumber.DisplayMember = "DisplayValue"
    cboNumber.ValueMember = "Number"
    AddHandler cboNumber.SelectedIndexChanged, AddressOf _
            cboNumber_SelectedIndexChanged

希望这可以帮助。要记住的一件事是,如果 cboNumber 已经为 SelectedIndexchanged 事件分配了一个处理程序,您将遇到问题。所以不要创建默认事件。

于 2010-03-08T19:50:35.533 回答