2009-05-28 9 views
1

Ich versuche herauszufinden, wie der Wert des Textes, der für jedes Element eines Listensteuerelements angezeigt wird, z. B. eine Checkbox-Liste, aber das gilt wirklich für die meisten Listensteuerelemente, nicht nur das Checklistenbox-Steuerelement.Wie Sie den Text der Listenelemente in Windows Forms festlegen

ich eine CheckListBox Kontrolle haben,

Friend WithEvents clstTasks As System.Windows.Forms.CheckedListBox 

, die ich in der Regel mit einer Liste von Aufgabennamen ausfüllen möchten. Ich rufe die add-Methode auf, um der Liste ein Task-Objekt hinzuzufügen. Ich weiß, dass, wenn ich die ToString-Methode überschreibe, welcher Wert von dieser Funktion zurückgegeben wird, wird als der Text für das Listenelement angezeigt.

In seltenen Situationen möchte ich jedoch etwas anderes als nur den Namen anzeigen. Vielleicht möchte ich beispielsweise den Namen und den Wert einer anderen Eigenschaft anzeigen, z. B. den Wert der booleschen Eigenschaft "Optional" in Klammern nach dem Namen.

Was ist der beste Weg, dies zu tun?

Das Beste, was mir einfällt, ist die Definition einer Eigenschaft, die in der GUI-Ebene festgelegt und dann von der ToString-Funktion verwendet wird, um festzulegen, wie sie sich beim Aufruf verhalten soll. Wenn die controlling -Eigenschaft auf einen Wert festgelegt ist, gibt der ToString den Namen zurück, andernfalls wird der Name gefolgt vom Wert des optionalen Flags zurückgegeben. Das scheint etwas unzusammenhängend zu sein. Die andere Alternative, die etwas übertrieben erscheint, ist die Definition einer neuen Klasse, die von Task erbt, z. B. TaskOptional, die die Tostring-Methode für die Basisklasse überschreibt. In dieser Unterklasse würde die ToString-Funktion den Name/Optional-Flag-Wert zurückgeben. Dies scheint jedoch ein wenig verrückt zu sein, um mit einer neuen Klasse zu kommen, nur um zu modifizieren, wie der Text in der Präsentationsebene angezeigt wird. Ich bin der Meinung, dass ich dies in der Präsentationsschicht steuern könnte, ohne das Geschäftsobjekt zu ändern oder ein neues abgeleitetes Objekt zu erstellen.

Was ist der beste Weg, dies zu erreichen?

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 

Antwort

1

Sie können die folgenden

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

EDIT tun: Sie werden den Wert von _Optional im Konstruktor festgelegt haben, die in dem Code fehlen Sie bereitgestellt haben.

+0

Das habe ich erwartet, aber nicht wirklich gemocht. Ich hatte auf ein Ereignis wie ListItemPreRender gehofft, wo ich die Text-Eigenschaft für ein ListItem festlegen konnte. Es schien nur angemessener, dass die Texteigenschaft über das Listensteuerelement gesteuert werden konnte, anstatt sich auf die ToString-Funktion der Klasse zu verlassen. Ich denke, ich werde eine Eigenschaft hinzufügen, die aufzählt, wie sich die ToString-Funktion verhalten sollte. Public Property ToStringBehaviour Als ToStringBehaviourEnum öffentliche Enum ToStringBehaviourEnum As Integer DisplayNameOnly DisplayNameAndOptional ‚Allow für Zukunft Variationen End Enum – ChadD

2

Sie können die DisplayMember-Eigenschaft Ihrer CheckedListBox auf den Namen einer Eigenschaft Ihrer benutzerdefinierten Klasse festlegen.

Angenommen, Sie haben eine Eigenschaft erstellen wie folgt aus:

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

dann können Sie das Anzeigeelement wie folgt festgelegt:

clstTasks.DisplayMember = "NameOptional" 

Wenn Sie ein Anzeigeelement gesetzt ist, wird diese Eigenschaft angezeigt anstelle des ToString-Werts.

+0

Beachten Sie, dass dies ein Winform Beispiel ist, nicht WebForms. Es gibt keine DisplayMember-Eigenschaft für das CheckList-Steuerelement. Ich glaube, Sie haben Webkontrollen gedacht. – ChadD

+0

MSDN sagt sonst ... http://msdn.microsoft.com/en-us/library/yx9dzztb.aspx Ich sehe, dass das Browsable-Attribut auf false festgelegt ist, so dass es möglich ist, dass Sie es nicht sehen können in der Liste der Eigenschaften, aber kann es immer noch in Code festlegen. –

Verwandte Themen