【问题标题】:Create a dropdown list of valid property values for a custom control为自定义控件创建有效属性值的下拉列表
【发布时间】:2010-01-08 14:59:42
【问题描述】:

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

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

感谢任何帮助。

谢谢。

马歇尔

【问题讨论】:

    标签: vb.net user-controls propertygrid


    【解决方案1】:

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

    如果您不熟悉 PropertyGrid 和 TypeConverter,这里是 document。

    【讨论】:

      【解决方案2】:

      结果比我想象的要简单。

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

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

      感谢所有回答。

      马歇尔

      【讨论】:

      • 知道如何在组合框中显示推荐值对我来说非常有趣。就我而言,我想从数据库中提取它们。
      • 如果我想要一些动态值,我应该怎么做?值来自某个类文件,但我无法对其进行枚举。
      • 谢谢,您的回答对我帮助很大!
      【解决方案3】:

      我对你的问题有点困惑。

      如果您的用户控件包含 DropDownList 控件,只需在用户控件中的某处初始化即可。

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

      【讨论】:

      • 我不是在谈论在用户控件本身中使用组合框。我说的是在控件的属性框中使用它。我在那里有一个属性,我想限制它的有效值。我之前在属性页面中看到过下拉菜单,并试图复制该行为。
      【解决方案4】:

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

          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 事件分配了一个处理程序,您将遇到问题。所以不要创建默认事件。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-12-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多