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
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