none
ComboBox in DataGrid in codebehind mit Daten aus Sqltabelle bestücken RRS feed

  • Frage

  • Hallo, ich experimentiere gerade am DataGrid herum.

    Ich möchte in einem DataGrid das Daten aus Abfragen darstellt noch eine Spalte mit ComboBox zufügen. Diese ComboBox soll mit Maschinennummern aus einer Tabelle bestückt werden, wo man dann einfach auswählt. Jetzt habe ich das mal bei "AutoGeneratingColumn" abgefangen, und wollte der DataGridComboBoxColumn noch über ItemsSource an die Tabelle binden. Dann sind zwar Einträge in der ComboBox vorhanden, aber leider nur mit dem Text "DataRowView" und halt nicht die Namen.

    Wie mache ich das in COdeBehind korrekt? Hier mal mein jetziger Code:

     private void dg_unten_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
            {
                if (e.PropertyName == "ParaNo")
                {
                    DataGridComboBoxColumn dataGridComboBox = new DataGridComboBoxColumn() {Width = new DataGridLength(100) ,ItemsSource = _tblMaschinen.AsEnumerable().ToList()};
                    
                    e.Column.Header = "ParameterNummer";
                    e.Column = dataGridComboBox;
                }
    }


    oema von MSDN

    Dienstag, 24. Juli 2012 06:42

Antworten

Alle Antworten

  • Schau Dir mal die Wirkungsweise von DisplayMember an. Für die DataGridComboBoxColumn wäre das die die DisplayMemberPath-Eigenschaft.
     
    --
    Viele Gruesse
    Peter
    Dienstag, 24. Juli 2012 07:53
  • OK, das geht nun. Wenn ich dann einen Eintrag auswähle und die Combobox verlasse, dann ist das Feld wieder leer. Fehlt da noch ein Bindigng?

     if (e.PropertyName == "ParaNo")
                {
                    DataGridComboBoxColumn dataGridComboBox = new DataGridComboBoxColumn() { Width = new DataGridLength(100), ItemsSource = _tblMaschinen.AsDataView(), DisplayMemberPath = "NeuerMaschinenname" };
                    
                    e.Column.Header = "ParameterNummer";
                    e.Column = dataGridComboBox;
                }


    oema von MSDN

    Dienstag, 24. Juli 2012 11:05
  • Muss die Spalte nicht noch an ein Feld der Datenquelle des Grids gebunden werden?
     
    --
    Viele Gruesse
    Peter
    Dienstag, 24. Juli 2012 11:26
  • Ja, das sollte sie. Die ausgewählten Daten der Combobox sollten ja dann auch in jedem Datensatz gespeichert werden können. Das Grid hängt über DataGrid.ItemSource = tabelle.AsDataView() an der Tabelle.

    oema von MSDN

    Dienstag, 24. Juli 2012 11:39
  • Schau Dir mal die Hilfe an, dort die SelectedItemBinding-Eigenschaft.
     
    --
    Viele Gruesse
    Peter
    Dienstag, 24. Juli 2012 12:34
  • Hallo oema,

    Ich gehe davon aus, dass die Antworten Dir weitergeholfen haben.
    Solltest Du noch "Rückfragen" dazu haben, so gib uns bitte Bescheid.

    Grüße,
    Robert


    Robert Breitenhofer, MICROSOFT  Twitter Facebook
    Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „Entwickler helfen Entwickler“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.

    Freitag, 3. August 2012 12:03
    Moderator
  • Hallo Robert, ich brauche nochmal Hilfe zum Thema und hänge mich unten dran. Bisher hat das soweit geklappt.

    Jetzt habe ich noch ein Problem. Die Bindung der Tabelle "MaschinenNamen" mit der ComboBox funktioniert, aber die Bindung an das DataGrid ist das Problem. Wenn ich eine andere Maschine anwähle und nicht ausdrücklich mit der "Return-Taste" bestätige, wird die ausgewählte Maschinennummer nicht abgespeichert. Nun mal die Frage: Mache ich die Bindungen korrekt, da ich ja alles als Code-Behind mache wegen dynamischer  Anpassungen?

    Hier mal der Code und ein Bild:

     private void dg_Visudaten_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
            {
                //// Feststellen der Spalte
                dg_Filterdaten.FrozenColumnCount = 2;
                //// Größenanpassung
                if (e.Column.Header.ToString() == "Auftragsnummer")
                    e.Column.Width = 150;
                if (e.PropertyName == "Maschine")
                {
                    DataGridComboBoxCol = new DataGridComboBoxColumn()
                    {
                        Header = "Maschine",
                        Width = new DataGridLength(150),
                        ItemsSource = MaschinenNamen.AsDataView(),
                        DisplayMemberPath = MaschinenNamen.Columns["NeuerMaschinenname"].ToString(),
                        SelectedValueBinding = new Binding("ID"),
                        TextBinding = new Binding("Maschine")
                    };
                    //// Zuweisen der ComboBox an die DataGrid-Spalte
                    e.Column = DataGridComboBoxCol;
                                }
            }


    oema von MSDN

    Dienstag, 18. September 2012 13:23
  • Hallo, auf meine Frage wurde noch nicht geantwortet. Da ergab sich noch ein weiteres Problem. Wenn ich bei einem Datensatz in Spalte "Maschine" eine Maschine  auswähle, in der vorher noch keine gesetzt war, bekomme ich die gesetzte Maschine nicht her wenn ich bei dem Ereignis ColumnChanging diese Feld abfrage.

    Also nochmal genauer definiert: Ich wähle in einer Zeile einen Eintrag in der Spalte "Maschine" aus, in der zuvor noch nichts eingetragen war. Dann mache ich einen Eintrag in Spalte "Geplant". da reagiere ich aber auf das Event "ColumnChanging", da ich noch wissen möchte, welche Maschine betroffen ist. Ich bekomme aber leider keinen Eintrag aus der e.Row["Maschine"]. Der Eintrag ist "null". Das hängt doch irgendwie damit zusammen, weil die Spalte "Maschine" als DataGridColumnCombobox eingebunden ist und auf eine eigene Tabelle gebunden ist. Wie bekomme ich da den Wert für die Spalte "Maschine" ?


    oema von MSDN

    Donnerstag, 24. Januar 2013 23:15
  • Hi,
    das Problem lässt sich einfach lösen, indem eine Listenanzeige zum Lesen (ReadOnly) und eine Detailansicht des aktuell selektierten Datenobjektes zum Ändern/Erfassen genutzt wird.
     
    --
    Peter Fleischer
    Freitag, 25. Januar 2013 06:00
  • Hi,
    das Problem lässt sich einfach lösen, indem eine Listenanzeige zum Lesen (ReadOnly) und eine Detailansicht des aktuell selektierten Datenobjektes zum Ändern/Erfassen genutzt wird.
    --
    Peter Fleischer

    Hallo Peter, kannst mir das näher erläutern, das verstehe ich so nicht wie du das meinst.

    oema von MSDN

    Freitag, 1. Februar 2013 15:26
  • Hi,
    Du bindest die Liste an ein DataGrid (im Nur-Lese-Modus). Als Quelle nimmst Du ein Objekt, welches ICollectionView implementiert. Von diesem Objekt nutzt Du das CurrentChanged-Ereignis. In der Ereignisroutine weist Du das ICollectionView.CurrentItem dem Container zu, der das konkrete Datenobjekt verwaltet (Detailansicht). In diesem Container kannst Du dann auch die ComboBox mit den Nachschlagewerten nutzen.
     
    Der Vorteil dieser Lösung ist, dass Du die Liste der ComboBox in Abhängigkeit von anderen Zuständen für jedes Datenobjekt separat befüllen kannst.
    --
    Peter Fleischer
    Samstag, 2. Februar 2013 11:08