2009-05-28 70 views
1

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

我有一个checklistbox控制,

Friend WithEvents clstTasks As System.Windows.Forms.CheckedListBox 

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

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

这样做的最好方法是什么?

我能想到的最好的方法是定义一个属性,该属性在GUI层中设置,然后由ToString函数用于确定它在调用时应该如何表现。如果控制属性设置为一个值,则ToString将返回Name,否则它将返回Name,后跟可选标志的值。这似乎与我有点分离。

另一个看起来有点矫枉过正的方法是定义一个继承自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 

回答

1

你可以做以下

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

编辑:您将需要设置的_optional值在构造函数,这是在您提供的代码所缺少。

+0

这就是我的预期,但并不真正喜欢。我希望ListItemPreRender这样的事件可以在ListItem上设置Text属性。对于文本属性来说,从列表控件中控制而不是依赖类的ToString函数似乎更合适。 我想我会添加一个属性,枚举ToString函数应该如何表现。 公共财产ToStringBehaviour作为ToStringBehaviourEnum 公共枚举ToStringBehaviourEnum作为整数 DisplayNameOnly DisplayNameAndOptional “允许将来的变化 结束枚举 – ChadD 2009-05-28 10:42:33

2

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

假设你创建了以下属性:

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

,那么你可以设置显示部件是这样的:当您设置一个显示部件

clstTasks.DisplayMember = "NameOptional" 

,此属性将显示而不是ToString值。

+0

注意,这是一个WinForm的例子,而不是Web窗体。 CheckList控件上没有DisplayMember属性。我相信你在考虑网页控制。 – ChadD 2009-05-29 02:12:15

相关问题