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!
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)
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...
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
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.
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...
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 =)
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(
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.
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
Danke an alle, ich werde es morgen ausprobieren und dann hier posten was rauskamm =)
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....
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...
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
Schau Dir dies hier mal an:
Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...
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
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...
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 =)
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 🤔
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! 🤔
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...