【发布时间】:2010-01-08 14:59:42
【问题描述】:
我创建了一个具有多个属性的自定义用户控件。一个指定我希望控件访问哪个数据库。我希望能够向控件的用户显示一个下拉列表,他可以从中选择控件将与哪个数据库进行交互。
如何让下拉菜单起作用?我可以获取默认值,但还没有弄清楚如何获取可选列表。
感谢任何帮助。
谢谢。
马歇尔
【问题讨论】:
标签: vb.net user-controls propertygrid
我创建了一个具有多个属性的自定义用户控件。一个指定我希望控件访问哪个数据库。我希望能够向控件的用户显示一个下拉列表,他可以从中选择控件将与哪个数据库进行交互。
如何让下拉菜单起作用?我可以获取默认值,但还没有弄清楚如何获取可选列表。
感谢任何帮助。
谢谢。
马歇尔
【问题讨论】:
标签: vb.net user-controls propertygrid
您只需要将自己的 TypeConverter 附加到您的属性。您将覆盖 GetStandardValuesSupported 和 GetStandardValues 方法(也可能是 GetStandardValuesExclusive)以返回您要显示的数据库列表。
如果您不熟悉 PropertyGrid 和 TypeConverter,这里是 document。
【讨论】:
结果比我想象的要简单。
我为该属性设置了一个枚举,但在将其用于该属性类型时遇到了问题。说在课堂外无法访问。
然后我有一个“duh”的时刻并将枚举从 Friend 更改为 Public,然后我能够使用枚举作为属性类型。因此,当我查看控件的该属性的值时,枚举中的值会列在下拉列表中。
感谢所有回答。
马歇尔
【讨论】:
我对你的问题有点困惑。
如果您的用户控件包含 DropDownList 控件,只需在用户控件中的某处初始化即可。
最简单的方法是在用户控件的代码隐藏中,只需执行 DropDownList.Items.Add() 或添加项目的任何语法。
【讨论】:
这是我用来为我的组合框创建自定义数据源的模板:
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 事件分配了一个处理程序,您将遇到问题。所以不要创建默认事件。
【讨论】: