DataBinding lösen?
-
Hallo,
ist es möglich ein Binding zu lösen?
Hier mal mein Problem
DataSet ds = CreateDataSource(iWert); textBox1.DataBindings.Add("Text", ds.Tables[0], "iWert");
In CreateDataSouce habe ich eine Datenbankabfrage, die mir ein DataSet zurück liefert.
Das DataSet möchte ich dann als Datenquelle für verschiedene Textboxen nutzen. (siehe Code)Den iWert ändere ich immer mit einer Auswahl einer Zahl über ein Dropdown.
Beim erstmaligen Aufruf klappt das auch, nur wenn ich erneut einen Wert selekteiere bzw. den Code von oben ausführen möchte, erhalte ich folgende Fehlermeldung:Dies führt dazu, dass sich zwei Bindungen der Auflistung an dieselbe Eigenschaft binden.
Parametername: binding
-
Ich habe zwar noch nie damit gearbeitet, aber ich würde mal sagen das "Text" eine property (Eigenschaft) ist, und du wie die Fehlermeldung sagt nur ein Binding auf eine Eigenschaft haben kannst.
-
Ich kann deinem Code Grundlegend nicht folgen.
DataSet ds = CreateDataSource(iWert); textBox1.DataBindings.Add("Text", ds.Tables[0], "iWert");
Du bindest mit dieser Zeile wenn ich das richtig sehe eine ganze DataTable an die Text-Property von textBox1. Das gibt keinen Sinn, was wird dir denn anschließend in der TextBox wirklich angezeigt?
Zu deiner Fehlermeldung, Resette die Bindung und binde dannach erneut.
-
Super, mit dem Reset.Clear() klappt es.
Hab es nach diesem Beispiel gemacht http://www.java2s.com/Code/CSharp/Database-ADO.net/BindDataSettoTextBox.htm
In der Textbox wird mit dann der Wertauf Feld iWert angezeigt.
Ist vielleicht verwirrend, da ich iWert übergebe und auch mein Datenbankfeld so heißt.Ist es nicht sinnvoll Textfelder über Datasets zu füllen?
Dachte, dass ich das dann bei einer Änderung in der Textboc einfach über ein Update wieder zurück in die Datenbank schreiben kann?
-
Mich irritiert eben die Zuweisung. Gehen wir von einer Tabelle mit mehreren Zeilen aus, woher weiß die Textbox welche Zeile sie anzeigen soll? Schließlich kennt sie nur eine Spalte, die eben gebunden wurde.
Im Grunde sieht es für mich zumindest so aus, dass das DataBinding so intelligent ist gleich die erste Zeile zu binden. - Aber als außenstehender der das sieht ist man halt ein wenig verwundert.
Was passiert denn wenn du plötzlich merkst, hach der Wert in der ersten Zeile stimmt ja garnicht.
-
Bisher hat die Zuweisung aus dem DataSet zu einem Control prima funktioniert.
Bspw.:textBox1.DataBindings.Add("Text", ds.Tables[0], "property_type");
Nun würde ich gerne noch folgendes umsetzten, weiß allerdings nicht wie
Mein DataSet enthält x Datensätze.
Diese sollen nun einem Dataset zugewiesen werden, nur wie???
So bleiben meine Felder jedenfalls immer leer ...dataGridView1.DataBindings.Add("Text", ds.Tables[0], "property_name");
Wie stelle ich zudem folgendes sicher (eher SQL spezifische):
Das SQL-Statement, mit dem ich die Daten abrufe haben besitzen zweimal das Feld property_name (aus 2 Tabellen ). Allerdings auch mit verschiedenen Inhalten.
D.h. Feldname ist beide Male identisch, Felder selbst haben aber unterschiedliche Bedeutungen und sind nicht verknüpft.
Genügt es, wenn ich bei setzen des DataBindings als Feldname a.property_name und c.property_name angebe? (a und c stehen für den Tabellennamen).Hoffe meine Fragen sind verständlich - und danke für die Hilfe!
-
Teilweise klappt es nun - der gridView wird gefüllt.
foreach (DataRow theRow in ds.Tables[0].Rows) { string[] row = new string[] { theRow["prototype_type"].ToString(), theRow["prototype_name"].ToString() }; dataGridView1.Rows.Add(row); }
Allerdings habe ich noch ein Problem: In dem gridView habe ich 2 Spalten die eine Checkbox enthalten.
Nun soll - je nach Wert der aus der Datenbank ausgelesen wird - entwerder in der ersten Spalte oder eben in der 2. Spalte ein Haken gesetzt werden.
Also
Datenbankwert = 1 => Spalte 1 anhaken
Datenbankwert = 2 => Saplte 2 anhakenWahrscheinlich geht dann nicht mehr über die String wie oben ??
Würde mich freuen, wenn mir dazu jemand einen Tipp geben könnte.
Danke Euch!
-
Hallo,
um eine DataGridViewCheckBoxCell anzuhaken, kannst es mal so versuchenif (row == "1") // Datenbankwert = 1 { // .Value = 1 ==> checked. // .Value = 0 ==> unchecked. dgPart.Rows[i].Cells[0].Value = 1; } if (row == "2") // Datenbankwert = 2 { dgPart.Rows[i].Cells[1].Value = 1; }
-
Leider klappt es doch noch nicht.
foreach (DataRow row in ds.Tables[0].Rows) { int r = ds.Tables[0].Rows.Count; for (int i = 0; i < r-1; i++) { string sType = row["TypeName"].ToString(); dataGridView1.Rows.Add(); if (sType != "") { if (sType == "1") { // .Value = 1 ==> checked. // .Value = 0 ==> unchecked. dataGridView1.Rows[i].Cells[0].Value = 1; } if (sType == "2") { dataGridView1.Rows[i].Cells[1].Value = 1; } string sValue = row["TypeValue"].ToString(); dataGridView1.Rows[i].Cells[2].Value = sValue; }
In der Tabelle sind eigentlich 5 verschiedene Datensätze, die danach im GridView angezeigt werden sollen.
Wenn ich den Code ohne verwenden, wird zwar die richtige Anzahl Datensätze angezeigt, aber immer mit dem selben Inhalt.
Also entweder wir die foreach Schleife nicht durchlaufen, oder es gibt ein anderes Problem.
Jedenfalls weiß ich nicht mehr weiter, was ich tun kann, damit wirklich jeder Datensatz angezeigt wird.
Würde mich freuen, wenn mir jemand helfen könnte.
-
Sonnenlichtfee schrieb:
Leider klappt es doch noch nicht.
foreach (DataRow row in ds.Tables[0].Rows) { int r = ds.Tables[0].Rows.Count; for (int i = 0; i < r-1; i++) { string sType = row["TypeName"].ToString(); dataGridView1.Rows.Add(); if (sType != "") { if (sType == "1") { // .Value = 1 ==> checked. // .Value = 0 ==> unchecked. dataGridView1.Rows[i].Cells[0].Value = 1; } if (sType == "2") { dataGridView1.Rows[i].Cells[1].Value = 1; } string sValue = row["TypeValue"].ToString(); dataGridView1.Rows[i].Cells[2].Value = sValue; }
Gibt dein Code Sinn? Das ist doch schmarn was du tust.
Du gehst deine Datenzeilen durch. Holst dir jedes mal ein Count und fügst für 5 Zeilen 25 ein. - Zumindest sagt das dein Code.
-
Ich geb dir recht - es ist ziemlicher schmarn was ich mache.
Momentan weiß ich allerdings, wie ich das problem beheben soll.Ich denke ohnehin, dass es eine for(each) zu viel ist?!
Aber zum einen benötige ich die "row" um den spaltennamen zu erhalten und für die checkbox benötige ich den druchlauf der for schleife.
-
In Pseudocode müsste dein Problem eigentlich folgendermaßen zu Lösen sein:
iteration über alle Zeilen der Tabelle Wert der Spalte Typename auslesen DataGridViewRow row = DataGridView.Rows.Add(); wenn Wert Spalte Typname = 1 row[0].Value = true; sonst row[1].Value = true; end
Was ich mich frage, warum hast du in der Datenbank einen Wert, der aber in der Darstellung auf zwei verschiedene Sachen geht?
Wäre es nicht sinnvoller, in der Datenbank 2 Spalten mit boolean Datentyp zu verwalten? Somit könntest du anschließend einfach mit DataBinding arbeiten.