【问题标题】:How to set the text of list items in Windows Forms如何在 Windows 窗体中设置列表项的文本
【发布时间】:2009-05-28 03:16:50
【问题描述】:

我试图弄清楚如何设置为列表控件(例如复选框列表)的每个项目显示的文本的值,但实际上这适用于大多数列表控件,而不仅仅是复选框控件。

我有一个复选框控件,

    Friend WithEvents clstTasks As System.Windows.Forms.CheckedListBox

我通常想用任务名称列表填充。我调用 add 方法将 Task 对象添加到列表中。我知道如果我重写 ToString 方法,该函数返回的任何值都将显示为列表项的文本。

但是,在极少数情况下,我希望显示除​​名称之外的其他内容。例如,也许我想显示另一个属性的名称和值,例如名称后面括号中显示的布尔属性“可选”的值。

最好的方法是什么?

我能想到的最好的方法是定义一个在 GUI 层中设置的属性,然后由 ToString 函数用于确定它在调用时的行为方式。如果控制属性设置为一个值,则 ToString 将返回 Name,否则它将返回 Name 后跟 Optional 标志的值。这对我来说似乎有点脱节。

另一个看起来有点过头的替代方法是定义一个继承自 Task 的新类,例如 TaskOptional,它覆盖了基类上的 Tostring 方法。在这个子类中,ToString 函数将返回 Name/Optional 标志值。然而,这似乎也有点疯狂,必须提出一个新类来修改文本在表示层中的显示方式。我觉得我应该能够在表示层中控制这一点,而无需更改业务对象或创建新的派生对象。

最好的方法是什么?

    For Each CurrentTask As Task In _MasterTaskList
        clstTasks.Items.Add(CurrentTask, True)
    Next

    Public Class Task

       Private _Name As String
       Private _Optional As Boolean

       Public Sub New (name As String, optional As Boolean)
           _Name = name
       End Sub

       Public Overrides Function ToString() As String
           Return _Name
           End If
       End Function

    End Class

【问题讨论】:

    标签: vb.net winforms


    【解决方案1】:

    您可以将 CheckedListBox 的 DisplayMember 属性设置为您的自定义类属性之一的名称。

    假设您创建了一个如下所示的属性:

    Public ReadOnly Property NameOptional() As String
      Return _Name & " (" & _Optional & ")"
    End Property
    

    那么你可以像这样设置显示成员:

    clstTasks.DisplayMember = "NameOptional"
    

    设置显示成员时,将显示此属性而不是 ToString 值。

    【讨论】:

    • 请注意,这是一个 Winform 示例,而不是 WebForms。 CheckList 控件上没有 DisplayMember 属性。我相信您在考虑 Web 控件。
    • MSDN 另有说法...msdn.microsoft.com/en-us/library/yx9dzztb.aspx 我看到browsable 属性设置为false,因此您可能在属性列表中看不到它,但仍然可以将其设置在代码。
    【解决方案2】:

    您可以执行以下操作

    Public Overrides Function ToString() As String
       Return string.Format("{0}{1}", _Name, IIF(_Optional, " (Optional)", ""))
    End Function

    编辑:您必须在构造函数中设置 _optional 的值,而您提供的代码中缺少该值。

    【讨论】:

    • 这是我所期望的,但不是很喜欢。我希望有一个事件,例如 ListItemPreRender,我可以在 ListItem 上设置 Text 属性。似乎更适合从列表控件控制文本属性,而不是依赖类的 ToString 函数。我想我会添加一个属性来枚举 ToString 函数的行为方式。公共属性 ToStringBehaviour As ToStringBehaviourEnum Public Enum ToStringBehaviourEnum As Integer DisplayNameOnly DisplayNameAndOptional '允许未来变化 End Enum
    猜你喜欢
    • 1970-01-01
    • 2015-01-07
    • 1970-01-01
    • 2012-03-12
    • 2010-11-24
    • 2016-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多