Laden...

ComboBox-Bindung: Nach Auswahl in der ersten Box in zweiter Box die zugehörigen Werte anzeigen

Erstellt von dinazavric vor 12 Jahren Letzter Beitrag vor 12 Jahren 6.754 Views
Thema geschlossen
D
dinazavric Themenstarter:in
40 Beiträge seit 2011
vor 12 Jahren
ComboBox-Bindung: Nach Auswahl in der ersten Box in zweiter Box die zugehörigen Werte anzeigen

Hallo,

als Anfänger habe ich eine Frage zur Data binding für ComboBox. Wie es für eine ComboBox funkzioniert habe ich schon rausgefunden:


P1_Name.DataSource = dataSet2.Tables["Parameters"].DefaultView;
P1_Name.DisplayMember = "Parameter Name";

Was muss ich aber nun tun, wenn eine weitere ComboBox habe, die je nach Auswahl der P1_Name bspw. dazu gehörigen Werte beinhalten soll?

Ich habe damit versucht:


P1_Value.DataBindings.Add("Items", dataSet2.Tables["Parameter Values"].DefaultView, "Value Defenition");

kriege aber den Fehler: > Fehlermeldung:

An die Eigenschaft Items kann nicht gebunden werden, da sie schreibgeschützt ist. Wie kann ich es sonst machen?

Vielen Dank im Voraus!

1.552 Beiträge seit 2010
vor 12 Jahren

Hallo dinazavric, du musst an ItemsSource binden. Bei Items kannst du nur manuell mit Items.Clear Items.Add ect die Collection ändern.
BTW: warum machst du dies nicht in XAML (falls du es in WPF erstellst)

Mein Blog
Meine WPF-Druckbibliothek: auf Wordpress, myCSharp

D
dinazavric Themenstarter:in
40 Beiträge seit 2011
vor 12 Jahren

Hallo dinazavric, du musst an ItemsSource binden. Bei Items kannst du nur manuell mit Items.Clear Items.Add ect die Collection ändern.
BTW: warum machst du dies nicht in XAML (falls du es in WPF erstellst)

Danke! Ich habe es jetzt so gemacht:


P1_Value.DataBindings.Add("ItemsSource", dataSet2.Tables["Parameter Values"].DefaultView, "Value Defenition");

Da kommt aber wieder der Fehler: > Fehlermeldung:

An die Eigenschaft ItemsSource für das Zielsteuerelement kann nicht gebunden werden...

1.552 Beiträge seit 2010
vor 12 Jahren

Dann liegt das Problem dass du WinForms benutzt und dort ItemsSource nicht existiert. Andernfalls (WPF) sollte es funktionieren. Vielleicht bist du so nett und verratest uns welche Technologie du benutzt.

WPF: ItemsSource:
WinForms: DataContext

Hinweis von herbivore vor 12 Jahren

Die verwendete Technologie ergibt sich aus dem Forum, in dem der Thread erstellt wurde: "GUI: Windows Forms" und sollte nur in Frage gestellt werden, wenn begründete Zweifel bestehen, dass der Thread versehentlich im falschen Forum erstellt wurde.

Mein Blog
Meine WPF-Druckbibliothek: auf Wordpress, myCSharp

D
dinazavric Themenstarter:in
40 Beiträge seit 2011
vor 12 Jahren

Vielleicht bist du so nett und verratest uns welche Technologie du benutzt.

Achso... Ich denke, dass ich WinForms benutze... wie gesagt, bin ein Anfänger und nehme an, dass es WInForms sind, da ich von WPF bis jetzt nichts gehört habe 🤔

Da kommt aber der gleiche Fehler...

D
dinazavric Themenstarter:in
40 Beiträge seit 2011
vor 12 Jahren

Vielleicht muss ich noch dazu sagen, dass ich im dataSet2 zwei Tabellen habe, die voher schon über Relations verbunden wurden. Hier muss ich ja auch die Rows aus unterschiedlichen Tables verbinden... Was ich unter dem Strich brauche ist, dass bei der Auswahl won einem Parameter (Tabelle 1) die dazu gehörigen Eigenschaften aufgelistet werden (Tabelle 2). Da gilt aber sie Relation von voher noch oder?

p.s.: Sorry, falls die Frage dumm ist =)

D
dinazavric Themenstarter:in
40 Beiträge seit 2011
vor 12 Jahren

Ich habe es nun so versucht:


            P1_Name.DataSource = dataSet2.Tables["Parameters"].DefaultView;
            P1_Name.DisplayMember = "Parameter Name";

            P1_Value.DataSource = dataSet2.Tables["Parameter Values"].DefaultView;
            P1_Value.DisplayMember = "Value Defenition";

Da kriege ich aber in der "P1_Value"-ComboBox alle möglichen Values aufgelistet, nicht aber die, die zum ausgewählten Parameter gehören...

Es muss doch ganz easy sein, das weis ich. Ich bitte um Hilfe X(

1.552 Beiträge seit 2010
vor 12 Jahren

Ich mach es grundsätzlich immer so:
Firma : Ferrari, VW, OPEL
Auto: FF, Golf, Corsa
Die Combobox Firmen hat die Firmenliste,
die Combobox Autos beinhaltet die Autos zur ausgewählten Firma, welche Firma ausgewählt ist findest du über SelectedItem heraus.

Aber wie gesagt, Binding mache ich nie über Code, und in Verbindung von Binding und WinForms habe ich so gut wie keine Erfahrung. Mach nur WPF. Vielleicht kann dir einer der diesbezüglich mehr Wissen hat mehr helfen.

Mein Blog
Meine WPF-Druckbibliothek: auf Wordpress, myCSharp

S
178 Beiträge seit 2009
vor 12 Jahren

Du musst wahrscheinlich noch den DataMember mit angeben, das ist z.B. eine ID-Spalte einer Tabelle aus dem Dataset, während DisplayMember nur angibt welche Spalte angezeigt wird.

Am einfachsten ist es du machst das DataBinding bein WinForms über den Assistenten

D
dinazavric Themenstarter:in
40 Beiträge seit 2011
vor 12 Jahren

Danke an alle, ich werde es morgen ausprobieren und dann hier posten was rauskamm =)

D
dinazavric Themenstarter:in
40 Beiträge seit 2011
vor 12 Jahren

Du musst wahrscheinlich noch den DataMember mit angeben, das ist z.B. eine ID-Spalte einer Tabelle aus dem Dataset, während DisplayMember nur angibt welche Spalte angezeigt wird.

Am einfachsten ist es du machst das DataBinding bein WinForms über den Assistenten

Also.... DataSet hat keinen DataMember und über Assistenten habe ich die möglichkeit gefunden ein neues DataSet anzubinden, aber kein Vorhandenes....

D
dinazavric Themenstarter:in
40 Beiträge seit 2011
vor 12 Jahren

Nun habe ich folgendes versucht:


private void P1_Name_SelectedIndexChanged(object sender, EventArgs e)
{
   String selected = P1_Name.SelectedItem.ToString();
   DataView dataView = P1_Value.DataSource as DataView;
   dataView.RowFilter = "Parameters = " + selected;
}

kriege aber wider einen Fehler: > Fehlermeldung:

Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt

und zwer bei der ersten Zuweisung... EDIT: Ich meine natürlich bei der Definition vom String...

49.485 Beiträge seit 2005
vor 12 Jahren

Hallo dinazavric,

ob nun DataBinding oder nicht, die Vorgehensweise ist immer die gleiche: [FAQ] NullReferenceException: Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt [finden und beheben]

herbivore

4.221 Beiträge seit 2005
vor 12 Jahren

Schau Dir dies hier mal an:

Problem mit Relation

Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...

D
dinazavric Themenstarter:in
40 Beiträge seit 2011
vor 12 Jahren

Nach einigen hin und her habe ich meinen Code dazu gebracht, dass die ComboBox doch was anzeigt. Hier ist der Code:


                dataSet2.Relations.Add("ParameterProperties", dataSet2.Tables["Parameters"].Columns["Parameter Name"], dataSet2.Tables["Parameter Values"].Columns["Parameter Name"]);
                P1_Value.DisplayMember = "ParameterProperties";
                P1_Value.ValueMember = "Parameter Name";
                P1_Value.DataSource = dataSet2.Tables["Parameter Values"].DefaultView;
                String selected = P1_Name.SelectedValue.ToString();
                Test.Text = P1_Name.SelectedIndex.ToString();
                DataView dataView = P1_Value.DataSource as DataView;
                dataView.RowFilter = "Parameter Name = '" + selected + "'";

Die P1_Value-ComboBox zeigt aber nur laute System.Data.DataRowView's und zwar so viele, wie viele Values ich insgesammt habe, d.h. es wird immer noch nicht gefiltert. Bei einem Parameter sollten so 3-5 Vlaues kommen

4.221 Beiträge seit 2005
vor 12 Jahren

Scheinbar hast Du meinen Link nicht beachtet.

Es ist ganz einfach.

Ich habe ein DataSet mit den Tabellen

OneTable (Key / Text)
NTable (Key / FKOneTable / Text)

zwischen den Tabellen besteht eine Relation mit dem Namen: FK_OneTable_NTable

Dann bindest Du folgendes: (kannst Du alles im Designer machen !!!)

cboOneTable:
this.cboOne.DisplayMember = "OneTable.Text";
this.cboOne.ValueMember = "OneTable.Key";
this.cboOne.DataSource = this.testDataSet1;

cboN:
this.cboN.DisplayMember = "OneTable.FK_OneTable_NTable.Text";
this.cboN.ValueMember = "OneTable.FK_OneTable_NTable.Key";
this.cboN.DataSource = this.testDataSet1;

Wenn Du in der cboOneTable einen anderen Record wählst, dann kriegt das auch die cboN mit (da diese eben nicht auf die ganze N-Tabelle sondern nur auf die Relation gebunden ist).

Da muss keine einzige Zeile von Hand geschrieben werden.

Gruss
Programmierhans

Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...

D
dinazavric Themenstarter:in
40 Beiträge seit 2011
vor 12 Jahren

Scheinbar hast Du meinen Link nicht beachtet.

doch, das habe ich =) und auch dadurch erst zimindest was nicht Fehlerhaftes bekommen! Danke für die weitere Erklärung, das brauche ich als Anfänger immer. Vom Typ her bin ich auch so, dass ich lieber alles per Hand schreibe, so verstehe ich es besser. Mit dem Designer habe ich mich nicht zurecht gefunden... 🤔

Also ich werde mein Code noch mal genauer anschauen und die Infos anwenden. Melde mich dann wieder =)

D
dinazavric Themenstarter:in
40 Beiträge seit 2011
vor 12 Jahren

hier ist also der Code, den ich nach den letzten Aufklärungen erstellt habe:


            dataSet2.Relations.Add("ParameterProperties", dataSet2.Tables["Parameters"].Columns["Parameter Name"], dataSet2.Tables["Parameter Values"].Columns["Parameter Name"]);

            P1_Name.DisplayMember = "Parameter Name";
            P1_Name.ValueMember = "Parameter Name";
            P1_Name.DataSource = this.dataSet2.Tables["Parameters"].DefaultView;

            P1_Value.DisplayMember = "ParameterProperties";
            P1_Value.ValueMember = "Value Name";
            P1_Value.DataSource = this.dataSet2.Tables["Parameters"].DefaultView;

Dabei kommt diese Fehlermeldung:> Fehlermeldung:

Eine Relation mit dem Namen 'ParameterProperties' ist bereits in diesem DataSet vorhanden

Irgendwas mache ich immernoch falsch 🤔

D
dinazavric Themenstarter:in
40 Beiträge seit 2011
vor 12 Jahren

Voher habe ich den Code im P_Name_List_SelectedIndexChanged plaziert, dadurch auch die Fehlermeldung bekommen.

Nun habe ich es im ProtocolGeneratorForm plaziert und krieg die meldung nicht mehr. Es wird auch die richtige Anzahl von Values im P1_Value angezeigt, leider aber nur wieder als "System.Data.DataRowView" X(

Was ich auch noch gemerkt habe, wenn ich in P1_Value-ComboBox was ändere, also die "System.Data.DataRowView" durch scrolle, dann ändern sich auch die Werte im P1_Name-ComboBox, was nicht der Fall sein soll. Jetzt blick ich nicht mehr durch! 🤔

4.221 Beiträge seit 2005
vor 12 Jahren
  
            dataSet2.Relations.Add("ParameterProperties", dataSet2.Tables["Parameters"].Columns["Parameter Name"], dataSet2.Tables["Parameter Values"].Columns["Parameter Name"]);  
  
            P1_Name.DisplayMember = "Parameter Name";  
            P1_Name.ValueMember = "Parameter Name";  
            P1_Name.DataSource = this.dataSet2.Tables["Parameters"].DefaultView;  
  
            P1_Value.DisplayMember = "ParameterProperties";  
            P1_Value.ValueMember = "Value Name";  
            P1_Value.DataSource = this.dataSet2.Tables["Parameters"].DefaultView;  
  

Gib Dir ein wenig Mühe und lies was ich Dir schreibe. Sonst lassen wir den Thread zumachen.

1.) DataSource ist nur das DataSet. (also keine Tabelle und kein View)
2.) DisplayMember der Parent-Tabelle ist TabellenName.FeldName
3). ValueMember der Parent-Tabelle ist TabellenName.FeldName
4). DisplayMember der Child-Tabelle ist ParentTabellenName.RelationName.FeldName

also in etwa so:


P1_Name.DisplayMember="Parameters.[Parameter Name]";
P1_Name.ValueMember="Parameters.[Parameter Name]";
P1_Name.DataSource=this.dataSet2;

P1_Value.DisplayMember="Parameters.ParameterProperties.[Parameter Name]";
P1_Value.ValueMember="Parameters.ParameterProperties.[Parameter Name]";
P1_Value.DataSource=this.dataSet2;


Und bitte gewöhn Dir sofort ab Spaces in Tabellen oder Feldnamen zu verwenden.

Gruss
Programmierhans

Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...

Thema geschlossen