Frage

Ich fülle Elemente aus einer XML -Datei mit einem DataTable in meinem Combobox aus. Derzeit habe ich es so eingestellt, dass eine Spalte Combobox's DisplayMember und eine andere das Value -Mitglied ist. Dies funktioniert jedoch möglicherweise nicht immer für mich, da ich den Parameter SelectedItem festlegen muss und das Value -Mitglied möglicherweise nicht eindeutig ist.

Ich weiß nicht, ob es ein Duplikat des Wertes in der Tabelle gibt oder nicht. Meine Idee war, dass ich den gesamten Datarow als Wertmitglied des Comboboxs einfügen und dann Combobox verwenden würde. SelectedItem = (DataRow) SOLE_DATA_ROW; Für die Auswahl und würde immer das richtige Combobox -Objekt auswählen.

Wie würde ich das erreichen? Gibt es eine bessere Möglichkeit, dies zu tun? Ich bin offen für Vorschläge, es ist jedoch sehr wichtig, dass ich sowohl zu einem Mitglied als auch zu Value -Mitglied gelangen kann.

Danke für Ihre Hilfe!

BEARBEITEN: Vielleicht war ich vorher nicht klar genug, aber während ich frage, ob dies der beste Ansatz hier ist, frage ich auch wie um dies zu tun. Wenn ich den Parameter von Valuemember nicht festlegt, besteht das ausgewählte Type -Typ Ausnahme wird ausgelöst.

War es hilfreich?

Lösung 2

Zunächst danke Adam Robinson, ich bin mir sicher, dass Ihre Antwort richtig war, aber es war einfach nicht das, was ich hören wollte. Ich habe mein Problem anders gelöst und ich denke, es kann für jemand anderen nützlich sein, also poste ich es hier.

Was ich getan habe, war eine neue Klasse, in meinem Fall habe ich es ListObject genannt, das einen Eigenschaftsdatarow hatte (wie Sie später sehen werden, funktioniert es auch für andere Typen, ich habe es gerade verwendet, da dies das ist, was ich eigentlich als Artikel wollte Werteigenschaft). Es überschreibt auch Methoden:

  • String toString ()
  • bool gleich (Objekt OBJ)
  • Int Gethashcode () -wird in meinem Fall nicht benötigt, wie Visual Studio auch nicht
    warnt dich, es sollte überschrieben werden.

Die Idee war, dass ich Combobox.Items -Sammlungen mit Objekten meiner eigenen Klasse füllen konnte, eine benutzerdefinierte Zeichenfolge anzeigen (wenn ich sie nicht so ausgearbeitet hätte Datarow) und vergleichen Sie nur den Element einer Klasse (in meinem Fall Datarow).

Hier ist der Code und es funktioniert großartig (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 großartig, da ich die Combobox einfach mit einer Foreach -Erklärung füllen kann:

dtUsers.ReadXml(Program.Settings.xmlInputUsers);

foreach(DataRow dr in dtUsers.Rows) 
{
    cmbUser.Items.Add(new ListObject(dr, "Name"));
}

Und wenn ich den Datarow bekomme, den ich auswählen möchte, mache ich das einfach:

cmbUser.SelectedItem = new ListObject(dlg.SelectedDataRow);

Wo ich mir keine Sorgen um das DisplayMember usw. machen muss, da nur DataSarow verglichen werden und Ihre Anzeigeparameter weiterhin aus dem Zeitpunkt des gefüllten Comboboxs festgelegt werden. Auch da die ToString -Methode überschrieben wird, können Sie Ihre Ausgabe wirklich anpassen.

Das Erstellen dieser Klasse war nur aufgrund des MSDN -Artikel über möglich Combobox.SelectedItem -Eigentum In dem festgestellt wurde, dass diese ausgewählte Eigenschaft mit der Index -Methode funktioniert. Diese Methode verwendet die Equals -Methode, um die Gleichheit zu bestimmen.

Andere Tipps

Wenn Sie a binden ListBox zu einem DataTable, du bist es tatsächlich an a DataView das repräsentiert das DataTable (DataTable Geräte IListSource, und das gibt a zurück DataView). Sie können nicht direkt einstellen SelectedItem zu einem DataRow Beispiel müssen Sie es auf a setzen DataRowView Beispiel. Leider gibt es keine einfache Möglichkeit, eine zu erhalten DataRowView von einem DataRow.

Sie sollten es besser machen, alle Ihre Interaktionen durch a zu machen DataRowView. Auf diese Weise können Sie einstellen SelectedItem ausdrücklich.

Sie können die nicht verwenden SelectedValue Eigenschaft, Sie müssen verwenden SelectedItem dafür.

Dies ist der einfachste Weg, um einen Combobox zu datieren

private void load() { 
DataTable dt = // get data from DB 
comboBox1.ValueMember = null; // allows you to get all fields in the obj to combobox
comboBox1.DisplayMember = "ccType";//label displayed from dt
comboBox1.DataSource = dt;
}
//to test 
private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
    {

        DataRowView current = (DataRowView)comboBox1.SelectedValue;
        string drs = current.Row["ID"].ToString();

    }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top