Zunächst einmal danke Adam Robinson, ich bin sicher, deine Antwort war richtig, aber es war einfach nicht das, was ich hören wollte. Ich habe mein Problem auf eine andere Art und Weise gelöst und denke, dass es für jemand anderen nützlich sein könnte, also poste ich es hier.
Ich habe eine neue Klasse erstellt, in meinem Fall nannte ich sie ListObject, die eine Eigenschaft DataRow hatte (wie Sie später sehen werden, funktioniert es auch für andere Typen, ich habe das nur benutzt, weil ich das eigentlich bin wollte als meine Artikelwert-Eigenschaft). Er überschreibt auch Methoden:
- String toString()
- bool Equals (object obj)
- int GetHashCode() --is nicht in meinem Fall benötigt, aber Visual Studio
Sie warnt es sich, außer Kraft gesetzt.
Die Idee war, dass ich ComboBox.Items Sammlungen mit Objekten meiner eigenen Klasse füllen könnte, eine benutzerdefinierte Zeichenfolge angezeigt werden (wenn ich es nicht funktioniert hatte, wie dies aus, meine nächste Frage auf Stack-Überlauf wäre wahrscheinlich über das Anpassen DisplayMembers beim Lesen von Elementen aus einer DataRow) und vergleichen Sie nur das Element einer Klasse (in meinem Fall DataRow).
Also hier ist der Code und es funktioniert gut (zumindest für das, was ich damit machen wollte).
public class ListObject
{
public DataRow element;
public String DisplayObject = null;
public ListObject(DataRow dr)
{
element = dr;
}
public ListObject(DataRow dr, String dspObject)
{
element = dr;
DisplayObject = dspObject;
}
public override String ToString()
{
if (DisplayObject == null) throw new Exception("DisplayObject property was not set.");
return element[DisplayObject].ToString();
}
public override bool Equals(object obj)
{
if (obj.GetType() == typeof(ListObject))
return Equals(((ListObject)obj).element, this.element);
else return base.Equals(obj);
}
public override int GetHashCode()
{
return base.GetHashCode();
}
}
In meinem Fall funktioniert es super, weil ich einfach die mit einer foreach-Anweisung des ComboBox füllen:
dtUsers.ReadXml(Program.Settings.xmlInputUsers);
foreach(DataRow dr in dtUsers.Rows)
{
cmbUser.Items.Add(new ListObject(dr, "Name"));
}
Und wenn ich das DataRow bekommen wähle ich möchte ich dies nur tun:
cmbUser.SelectedItem = new ListObject(dlg.SelectedDataRow);
Wo ich mich nicht um das DisplayMember usw. kümmern muss, weil nur DataRows verglichen werden, und Ihre Anzeigeparameter werden immer noch festgelegt, wenn Sie die ComboBox.Items-Auflistung gefüllt haben. Da die toString-Methode außer Kraft gesetzt wird, können Sie Ihre Ausgabe wirklich anpassen.
diese Klasse herzustellen war nur möglich, weil der Msdn Artikel auf ComboBox.SelectedItem Property, in der darauf hingewiesen wurde, dass SelectedItem Eigenschaft funktioniert die IndexOf-Methode. Diese Methode verwendet die Equals-Methode zum Bestimmen der Gleichheit.