| Autor |
Beitrag |
theend
      
Beiträge: 56
|
Verfasst: Di 16.10.07 08:28
hy,
Ich hoffe das passt in WinForms obwohl einiges an ADO dahintersteckt
Vorweg gleich mal ich bein ein absoluter c# neuling, hab zwar erfarhungen in PHP und java aber das stellt mich gerade vor eine große herausforderung
Ich würde euren rat/hilfe bruachen bei folgendem:
Benutzte IDE -> SharpDevelop 2.2
Ich habe eine access 2003 Datenbank die wie folgt aussieht
Table: coulmn, column
klasse: ID, klasse
schueler: ID, name
faecher: ID, fach
plaene: ID, key, beschreibung
gruppen: ID, gruppen
stationen: ID, stations_name
klassen_plaene: ID, plan_key, fach_name, klassen_klasse, stations_name, untergruppen_name, max_aufgaben
schueler_werte: ID, schueler_name, klassen_plaene_id, wert, fehler, bemerkungen
mit diesen daten will ich nun in meinem WinForms arbeiten und zwar wie folgt:
Ich habe mehrere ListBox 'en:
listBoxKlasse; listBoxSchüler, listBoxFach, listBoxPlan, listBoxGruppe
listBoxKlasse; listBoxSchüler, => werden immer befüllt mit den werten aus der Tabelle Klasse(mit den werten der column klasse) und Schueler(mit den werten der column name)
listBoxFach => soll aufgrund der angegebenen Klasse befüllt werden (also wenn ich in der listBoxKlasse den wert 1 anklicken, folglich die erste schulstufe, sollen alle faecher der ersten klasse in listboxFach geladen werden) die verbindung besteht in der tabelle klassen_plaene (SQL: Select fach_name from klassen_plaene where klassen_klasse = listBoxKlasse.Text)
listBoxPlan => wie bei listBoxFach soll diese mit allen plaenen zu der ausgewählten klasse und dem fach anzeigen
listBoxGruppe => soll alle gruppen in listBoxGruppe anzeigen die mit der klasse, fach und plan übereinstimmen
sobald ich eine Gruppe aus listBoxGruppe gewählt habe soll folgendes passieren:
Ich habe eine GroupBox (ugBox1, ugBox2 ......, ugBox8) darin befinden sich die felder
Textbox: maxBox1.....maxBox8
Textbox: atmBox1.....atmBox8
Textbox: errorBox1...errorBox8
TextBox: schreibBox1...schreibBox8
nun sollen soviele ugBox'es freigeschalten werden wie ich rows habe durch die auswahl in der listBoxGruppe ( SQL: Select * from klassen_plaene where klassen_klasse = listBoxKlasse.text and fach_name = listBoxFach .text and plan_key = listBoxPlan.text and stations_name = listBoxGruppe.text )
nun sind zb. 2 ugBox' en freigeschalten (visible = true)
und die ugBox bekommt den anzeige namen der untergruppen_name (aus tabelle klassen_plaene)
nun sollen in die felder
maxBox1 = max_aufgaben (aus tabelle klassen_plaene)
atmBox1 = wert (aus tabelle schueler_werte)
errorBox1 = fehler (aus tabelle schueler_werte)
schreibBox1 = beschreibung (aus tabelle schueler_werte)
Umsetzung:
Ich habe bis jetzt Folgendes Verbrochen
Ich lade alles derzeit in dataSet's
function:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97:
| private void GetData(string act, string tab) { string db = Environment.CurrentDirectory + "\\2007-2011.mdb"; OleDbConnection con = new OleDbConnection( @"Provider=Microsoft.Jet.OLEDB.4.0; Data Source=2007-2011.mdb");
OleDbCommand command = con.CreateCommand(); con.Open(); if(tab.Equals(tabArbeitsbereich.Text)) { if(listBoxKlasse.Text == "") { listBoxKlasse.Text = "0"; } if(act.Equals("getschüler") || act.Equals("all")) { dataSetSchüler.Clear();
command.CommandText = "SELECT * FROM schueler"; OleDbDataAdapter adapter = new OleDbDataAdapter(command); adapter.TableMappings.Add("Table", "schueler"); adapter.Fill(dataSetSchüler); } if(act.Equals("getklasse") || act.Equals("all")) { dataSetKlasse.Clear(); command.CommandText = "SELECT * FROM klasse"; OleDbDataAdapter adapter = new OleDbDataAdapter(command); adapter.TableMappings.Add("Table", "klasse"); adapter.Fill(dataSetKlasse); } if(act.Equals("getfach") || act.Equals("all")) { dataSetFach.Clear(); command.CommandText = "SELECT DISTINCT fach_name FROM klassen_plaene " + "WHERE klassen_klasse ="+ listBoxKlasse.Text; OleDbDataAdapter adapter = new OleDbDataAdapter(command); adapter.TableMappings.Add("Table", "faecher"); adapter.Fill(dataSetFach); } if(act.Equals("getplan")) { dataSetPlan.Clear(); command.CommandText = "SELECT DISTINCT plan_key FROM klassen_plaene " + "WHERE klassen_klasse = " + listBoxKlasse.Text + " " + "AND fach_name = \"" + listBoxFach.Text + "\""; OleDbDataAdapter adapter = new OleDbDataAdapter(command); adapter.TableMappings.Add("Table", "plan"); adapter.Fill(dataSetPlan); } if(act.Equals("getgruppe")) { dataSetGruppe.Clear(); command.CommandText = "SELECT DISTINCT stations_name FROM klassen_plaene " + "WHERE klassen_klasse = " + listBoxKlasse.Text + " " + "AND fach_name = \"" + listBoxFach.Text + "\" " + "AND plan_key = \"" + listBoxPlan.Text + "\""; OleDbDataAdapter adapter = new OleDbDataAdapter(command); adapter.TableMappings.Add("Table", "gruppe"); adapter.Fill(dataSetGruppe); } if(act.Equals("getuntergruppe")) { dataSetUnterGruppe.Clear(); command.CommandText = "SELECT * FROM klassen_plaene " + "WHERE klassen_klasse = " + listBoxKlasse.Text + " " + "AND fach_name = \"" + listBoxFach.Text + "\" " + "AND plan_key = \"" + listBoxPlan.Text + "\" " + "AND stations_name = \"" + listBoxGruppe.Text + "\""; OleDbDataAdapter adapter = new OleDbDataAdapter(command); adapter.TableMappings.Add("Table", "untergruppe"); adapter.Fill(dataSetUnterGruppe); } if(act.Equals("getschueler_werte")) { dataSetSchuelerWerte.Clear(); command.CommandText = "SELECT * FROM schueler_werte " + "WHERE schueler_name = \"" + listBoxSchüler.Text + "\" "; OleDbDataAdapter adapter = new OleDbDataAdapter(command); adapter.TableMappings.Add("Table", "schueler_werte"); adapter.Fill(dataSetSchuelerWerte); } } con.Close(); } |
Und ich rufe dan die sachen wie folgt auf:
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27:
| void TabArbeitsbereichEnter(object sender, System.EventArgs e) { GetData("all", tabArbeitsbereich.Text); listBoxKlasse.DataSource = dataSetKlasse.Tables["klasse"]; listBoxKlasse.DisplayMember = "klasse"; listBoxSchüler.DataSource = dataSetSchüler.Tables["schueler"]; listBoxSchüler.DisplayMember = "name"; }
void ListBoxKlasseSelectedValueChanged(object sender, EventArgs e) { GetData("getfach", tabArbeitsbereich.Text); listBoxFach.DataSource = dataSetFach.Tables["faecher"]; listBoxFach.DisplayMember = "fach_name"; } void ListBoxFachSelectedValueChanged(object sender, EventArgs e) { GetData("getplan", tabArbeitsbereich.Text); listBoxPlan.DataSource = dataSetPlan.Tables["plan"]; listBoxPlan.DisplayMember = "plan_key"; } void ListBoxPlanSelectedValueChanged(object sender, EventArgs e) { GetData("getgruppe", tabArbeitsbereich.Text); listBoxGruppe.DataSource = dataSetGruppe.Tables["gruppe"]; listBoxGruppe.DisplayMember = "stations_name"; } |
so nun habe ich alle auswahlen in den listboxes getroffen
nun will ich die sachen in die ugBox 'en laden dies versuche ich so
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74:
| void TabControl2Enter(object sender, EventArgs e) { int i=0; ugBox1.Visible = false;ugBox2.Visible = false;ugBox3.Visible = false; ugBox4.Visible = false;ugBox5.Visible = false;ugBox6.Visible = false; ugBox7.Visible = false;ugBox8.Visible = false; GetData("getuntergruppe", tabArbeitsbereich.Text); if(i < dataSetUnterGruppe.Tables["untergruppe"].Rows.Count) { ugBox1.Visible = true; ugBox1.Text = dataSetUnterGruppe.Tables["untergruppe"].Rows[i]["untergruppen_name"].ToString(); IDBox1.Text = dataSetUnterGruppe.Tables["untergruppe"].Rows[i]["ID"].ToString(); maxBox1.Text = dataSetUnterGruppe.Tables["untergruppe"].Rows[i]["max_aufgaben"].ToString(); i++; } if(i < dataSetUnterGruppe.Tables["untergruppe"].Rows.Count) { ugBox2.Visible = true; IDBox2.Text = dataSetUnterGruppe.Tables["untergruppe"].Rows[i]["ID"].ToString(); i++; } if(i < dataSetUnterGruppe.Tables["untergruppe"].Rows.Count) { ugBox3.Visible = true; IDBox3.Text = dataSetUnterGruppe.Tables["untergruppe"].Rows[i]["ID"].ToString(); i++; } if(i < dataSetUnterGruppe.Tables["untergruppe"].Rows.Count) { ugBox4.Visible = true; IDBox4.Text = dataSetUnterGruppe.Tables["untergruppe"].Rows[i]["ID"].ToString(); i++; } if(i < dataSetUnterGruppe.Tables["untergruppe"].Rows.Count) { ugBox5.Visible = true; IDBox5.Text = dataSetUnterGruppe.Tables["untergruppe"].Rows[i]["ID"].ToString(); i++; } if(i < dataSetUnterGruppe.Tables["untergruppe"].Rows.Count) { ugBox6.Visible = true; IDBox6.Text = dataSetUnterGruppe.Tables["untergruppe"].Rows[i]["ID"].ToString(); i++; } if(i < dataSetUnterGruppe.Tables["untergruppe"].Rows.Count) { ugBox7.Visible = true; IDBox7.Text = dataSetUnterGruppe.Tables["untergruppe"].Rows[i]["ID"].ToString(); i++; } if(i < dataSetUnterGruppe.Tables["untergruppe"].Rows.Count) { ugBox8.Visible = true; IDBox8.Text = dataSetUnterGruppe.Tables["untergruppe"].Rows[i]["ID"].ToString(); i++; } } |
so meine frage nun wäre, ist mein ansatz komplett falsch?
hab ihr ein paar ideenen wie ich meine code verbessern kann?
muss ich wirklcih so viele datasets verwenden wie ich benutze?
wie bekomme ich die werte für die errorBox und schreibBox usw in meinene TextBoxen, ich habe es noch nicht geschaft auf ein dataset zuzugreifen das ich mit einem join SQL gefüllt habe.
Ich hoffe das ist nicht zu viel zum lesen und das mir vielleicht der eine oder andere helfen kann.
THX
theend
-> imanhang hab ich mal meinen source + db dazugeladen, fals sich jemand die zeit nehmen will und sich das genauer anschauen möchte
Moderiert von jasocul: Code- durch C#-Tags ersetzt
//EDIT: danke jasocul für das ausbessern der c# -Tags, hatte ich voll übersehen
//EDIT2: Style anpassungen um es etwas leserlicher zu machen
Zuletzt bearbeitet von theend am Di 16.10.07 09:06, insgesamt 2-mal bearbeitet
|
|
JüTho
      
Beiträge: 2021
Erhaltene Danke: 6
Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
|
Verfasst: Di 16.10.07 08:54
Titel: Re: Dynamisches laden von ListBoxen
theend hat folgendes geschrieben: | so meine frage nun wäre, ist mein ansatz komplett falsch?
hab ihr ein paar ideenen wie ich meine code verbessern kann?
muss ich wirklcih so viele datasets verwenden wie ich benutze?
wie bekomme ich die werte für die errorBox und schreibBox usw in meinene TextBoxen, ich habe es noch nicht geschaft auf ein dataset zuzugreifen das ich mit einem join SQL gefüllt habe.
Ich hoffe das ist nicht zu viel zum lesen und das mir vielleicht der eine oder andere helfen kann. |
Doch, das ist zuviel zum Lesen. Aber ein paar Hinweise kann ich geben, ohne alles zu untersuchen:
- Ein DataSet genügt für alle Abfragen. Ich habe mir angewöhnt, eine 1:1-Verbindung zwischen Datenbank und DataSet sowie DB-Tabelle und DataTable zu verwenden. Das Ergebnis einer jeden Abfrage kommt in eine DataTable; bei Bedarf werden die vorherigen Zeilen gelöscht, überschrieben oder ergänzt.
- JOIN-Abfragen solltest Du vermeiden: Zum einen beeinflusst das die Struktur der DataTables (aus meiner Sicht unpraktisch). Zum anderen können Datenänderungen per DbDataAdapter.Update() nur gespeichert werden, wenn ein PrimaryKey genutzt wird und sich die Inhalte der DataTable auf genau eine DB-Tabelle beziehen.
- Erforderliche Verknüpfungen zwischen verschiedenen DataTables können durch DataRelations nachgebildet werden.
Auch wenn typisierte DataSets "Monster an Quellcode" sind, haben sie in dieser Hinsicht Vorteile. Wenn Dir das Stichwort noch nichts sagt, lies zunächst die Artikel in der SDK-Doku.
Viel Erfolg! Jürgen
|
|
theend 
      
Beiträge: 56
|
Verfasst: Di 16.10.07 09:02
vorweg gleich mal sry für den vielen text aber ich dachte mir es wäre sinvoll das Problem gleich genau zu beschreiben.
wenn ich das richitg verstehe muss ich oder besser sollte ich mit dem DataSet in bezug auf die realtions usw. meine Datenbank Struktur darin nocheinmal abblilden um dan damit in c# selber zu arbeiten?
| Zitat: |
typisierte DataSets
|
danke für den tip, ich werd mir das mal anschaun und einlesen
|
|
JüTho
      
Beiträge: 2021
Erhaltene Danke: 6
Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
|
Verfasst: Di 16.10.07 10:05
theend hat folgendes geschrieben: | | vorweg gleich mal sry für den vielen text aber ich dachte mir es wäre sinvoll das Problem gleich genau zu beschreiben. |
Das ist immer ein praktisches Problem: Schreibt man zuwenig, ist es falsch; schreibt man zuviel, ist es auch nicht recht.
theend hat folgendes geschrieben: | | wenn ich das richitg verstehe muss ich oder besser sollte ich mit dem DataSet in bezug auf die realtions usw. meine Datenbank Struktur darin nocheinmal abblilden um dan damit in c# selber zu arbeiten? |
Genauso würde ich es machen.
Es kommt immer auf den Einsatzzweck an: Bei einer Kunden-Datenbank mit 10.000 oder mehr Kunden werden (fast) immer nur die Daten eines einzelnen Kunden eingelesen. Nachschlagetabellen (z.B. für mögliche Anreden) werden am Anfang komplett bereitgestellt. Die Nachschlagetabelle "PLZ/Ortsname" mit 40.000 PLZ und 110.000 Orten ist ein Grenzfall. Bei Deinem Projekt spricht wahrscheinlich nichts dagegen, immer alle Daten komplett einzulesen.
Gruß Jürgen
|
|
theend 
      
Beiträge: 56
|
Verfasst: Di 16.10.07 14:39
Ich habe mir jetzt mit Visual Studio 2005 Express Edition mal ein Typisiertes DataSet mit tabellen und adaptern zusammen gebastelt (glaube ich zumindest)
da ich das direkt aus dem DAtenbankExplorer gemacht habe und mir die daten aus der DB geholt habe wäre jetzt die frage, muss ich da im source dieses DataSet neubefüllen also verbindung aufbauen und dan daten einlesen?
ich vermute mal ja, dan wäre mein frage, wie machen ich das jetzt bei diesem Typisierten DataSet?
bzw. wie kann auch auf diesen adapter zugreifen für die tabelle ohne das alles selber noch einmal im sourcecode neuzuschrieben oder muss ich das sowieso im source selber nochmal machen?
ich häng das mal an
//EDIT: ich kom mir da grade wieder vor wie der ärgste anfänger
//EDIT2:
ok ich glaub ich habs , ja ich muss da alles quasi nochmal ein lesen bzw. eigentlich die nur die daten einlesen aus den tabellen
dann kann ich auch mit
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| string db = Environment.CurrentDirectory + "\\2007-2011.mdb"; OleDbConnection con = new OleDbConnection( @"Provider=Microsoft.Jet.OLEDB.4.0; Data Source=2007-2011.mdb");
con.Open(); OleDbDataAdapter klassen = new OleDbDataAdapter("SELECT * from klassen", con); klassen.Fill(dataSet21, "klassen");
con.Close(); listBox1.DataSource = dataSet21.klassen; listBox1.DisplayMember = "klasse"; |
die sachen angezeigt bekommen
|
|
theend 
      
Beiträge: 56
|
Verfasst: Mi 17.10.07 08:58
So, JüTho erstmal schon aller herzlichsten danke für deine hilfe
und jetzt hätte ich noch 2 fragen:
| Zitat: |
Erforderliche Verknüpfungen zwischen verschiedenen DataTables können durch DataRelations nachgebildet werden.
|
1) kann ich an eine listbox zb. den namen eines faches übergeben und dahinter aber auch die ID des faches speichern(ablegen)
2) oder kann ich das mit den DataRelations machen, bzw wie könnte ich das einsetzen?
SQL-Anweisung 1: 2: 3: 4: 5: 6:
| Fächer Klassen fächer_klassen ID|fach ID|klasse ID|fächer_id|klassen_id ----------- ---------- ----------------------- 01|deutsch 01|1a 01|1 |1 02|mathe 02|1b 02|1 |2 03|2 |1 |
so jetzt hätte cih zb. mathe und deutsch in der 1 klasse und in der 2 klasse hab ich nur mathe
ich hab jetzt auch die beidne listboxes für klassen (listBoxKlassen) und eine für fächer ( listBoxFach)
wenn ich jetzt auf eine klassen in der listBoxKlasse klicke, will ich das mir alle fächer die diese klasse hat in der listBoxFach angezeigt werden.
wie mach ich das am besten?
1) ich werde dazu das SelectedValueChanged evet verwenden müssen
2) ich muss aufgrund meiner klasse (zb 1a; was die ID 1 in klassen wäre) auf die fächer kommen
ich hätte derzeit keine idee wie ich das programiertechnisch umsetzten könnte
sql wäre einfach
SQL-Anweisung 1: 2: 3: 4: 5:
| SELECT f.fach FROM fächer f, klassen k, fächer_klassen fk WHERE k.klasse = listBoxklasse.Text AND k.id = fk.klassen_id AND fk.fächer_id = f.id |
Noch eine Frage:
Wie kann ich es um gehen das wenn ich eine listbox mit folgendem code befülle
C#-Quelltext 1: 2:
| listBoxSchueler.DataSource = dataSet21.schueler; listBoxSchueler.DisplayMember = "name"; |
das beim befüllen jedesmal das SelecedValueChanged event aufgerufen wird?
bzw. gibt es ein anderes EVENT das greift wenn ich einen anderen eintrag in der listbox anklicke?
|
|
JüTho
      
Beiträge: 2021
Erhaltene Danke: 6
Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
|
Verfasst: Mi 17.10.07 12:08
Ich bitte um Entschuldigung - ich habe zurzeit nicht den Kopf frei für derartig komplexe Fragen. Deshalb nur kurz soviel:
Prüfe zusätzlich zu DisplayMember auch ValueMember; das könnte einiges klären.
Nachschlagetabellen sollten am Anfang vollständig geladen werden. In dieser Zeit kann ein Ereignis, z.B. SelectedValueChanged, etwa so unterdrückt werden:
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| bool dataLoading = false;
dataLoading = true; dataLoading = false;
void SelectedValueChanged(...) { if (!dataLoading) { } } |
DataRelations: Hast Du jetzt ein typisiertes DataSet vorbereitet? Dann sind die "automatisch" erzeugt.
Mit einer ListBox habe ich bisher noch nicht gearbeitet. Vielleicht hilft Dir aber meine Erläuterung zur DataGridViewComboBoxColumn
Gruß Jürgen
|
|
theend 
      
Beiträge: 56
|
Verfasst: Mi 17.10.07 13:52
| Zitat: |
Prüfe zusätzlich zu DisplayMember auch ValueMember; das könnte einiges klären.
|
ja das mit den ValueMember hab ich jetzt endlich verstanden wie ich das anwenden muss, bzw wie ich da mit dem wert dan arbeiten kann
C#-Quelltext 1: 2:
| if (listBoxKlassen.SelectedIndex != -1) textBox1.Text = listBoxKlassen.SelectedValue.ToString(); |
| Zitat: |
n dieser Zeit kann ein Ereignis, z.B. SelectedValueChanged, etwa so unterdrückt werden:
|
das is mir jetzt peinlich, daruf hätte ich eigenltich selbe kommen müssen
Link zu DataRelations:
das müste eig. genau das sein was ich brauche, wenn ich das mit DataViews komibiniere wollte ich das bekommen was ich brauche.
|
|
theend 
      
Beiträge: 56
|
Verfasst: Mi 17.10.07 21:29
Zu meinen Problem mit den Relations, ich habe mich da jetzt 2er DataViews beholfen
und zwar so:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34:
| if (!dataLoading && listBoxGruppe.SelectedIndex != -1 && listBoxSchueler.SelectedIndex != -1) { DataView klassen_plaeneView = new DataView(this.dataSet21.klassen_plaene); klassen_plaeneView.RowFilter = "gruppen_id = " + listBoxGruppe.SelectedValue.ToString(); String Filter = ""; foreach (DataRowView tmp in klassen_plaeneView) { Filter += tmp["id"] + ","; } if (klassen_plaeneView.Count != 0) { DataView nextView = new DataView(this.dataSet21.schueler_werte); nextView.RowFilter = "klassen_plaene_id in (" + Filter + ") AND " + "schueler_id = " + listBoxSchueler.SelectedValue.ToString(); dataLoading = true; dataGridView1.DataSource = nextView; dataLoading = false; } } |
somit bekomme ich alle gruppen einträge in schueler_werte die zu den angegebenen schülern und der gruppe passt
Neue Frage:
Wenn ich jetzt nicht unbedingt dataGridViews benutzen will um daten anzuzeigen bzw. zu bearbeiten wie gebe ich dan diese daten zurück in das dataSet?
mal angenommen ich lade mir diese daten anstatt eine dataGridView in mehrere textBoxen wie kann ich dan die veränderten daten wieder in das DataSet zurück schrieben?
|
|
JüTho
      
Beiträge: 2021
Erhaltene Danke: 6
Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
|
Verfasst: Do 18.10.07 08:53
Mit DataBinding, z.B.:
C#-Quelltext 1:
| TextBox1.DataBindings.Add("Text", tableSchueler, "Name"); |
Dann steht in der TextBox automatisch der Name, der zum aktuell ausgewählten Eintrag der Schüler-Tabelle gehört, und beim Wechseln des Datensatzes werden Änderungen in der DataTable automatisch gespeichert.
Das wird in der Praxis natürlich etwas komplizierter:
Zum einen unterstützt #D das Arbeiten mit Datenquellen nur begrenzt: Wenn die DataTable zum Formular gehört (wie es in einem einfachen Projekt möglich ist), dann kannst Du die Controls und die Datenquelle per IDE verbinden. Wenn die DataTable in einer getrennten Klasse steht (wie es bei jedem "fortgeschrittenen" Projekt sinnvoll ist), müssen die Verbindungen weitgehend per Code manuell erstellt werden.
Zum anderen muss zusätzlich das Navigieren innerhalb der Datenquelle sowie das Synchronisieren von DataGridView und TextBoxen geregelt werden. Siehe dazu z.B. OpenBook Visual C# Kap.26 mit den Stichworten "Datengebundene Controls" sowie BindingSource und BindingNavigator.
Gruß Jürgen
|
|
theend 
      
Beiträge: 56
|
Verfasst: Fr 19.10.07 08:22
C#-Quelltext 1: 2: 3: 4: 5: 6: 7:
| DataView schueler_werteView = new DataView(this.dataSet21.schueler_werte); schueler_werteView.RowFilter = "klassen_plaene_id in (" + Filter + ") AND " + "schueler_id = " + listBoxSchueler.SelectedValue.ToString();
atmBox1.DataBindings.Add("Text", schueler_werteView.Table, "wert"); |
Durch diesen Filter bekomme ich eigentlich nur 1 Zeile zurück z.b: Zeile 9
allerdings bekomme ich in der anzeige immer den eintrag aus Zeile 1
schau ich mir den wert in schueler_werteView.Table im debug an sehe ich die ganze tabelle obwohl nach dem filtern nur ein eintrag angezeigt werden sollte.
woran kan das liegen?
|
|
JüTho
      
Beiträge: 2021
Erhaltene Danke: 6
Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
|
Verfasst: Fr 19.10.07 08:51
Du willst nur den per View ausgewählten Datensatz sehen. Also musst Du die View als Datenquelle angeben:
C#-Quelltext 1:
| atmBox1.DataBindings.Add("Text", schueler_werteView, "wert"); |
Auch wenn die Verknüpfung zwischen Control und Datenquelle unter NET komplizierter wurde: es hat schon seine Vorteile, dass "ziemlich beliebige" Klassen als Datenquelle an jedes Control gebunden werden können.
Um späteren Missverständnissen vorzubeugen: Dabei wird der erste Datensatz der DataView angezeigt. Das klappt dann, wenn Du - wie hier - durch den passenden Filter dafür sorgst, dass das der gewünschte Eintrag ist.
Gruß Jürgen
|
|
theend 
      
Beiträge: 56
|
Verfasst: Fr 19.10.07 09:00
hm, so hatte ich es am anfang und da ging es auch nicht´, des wegen habe ich es dan auf dieses umgebaut
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| DataRow row; row = schueler_werteView.Table.NewRow(); foreach (DataRowView tmp in schueler_werteView) { row = tmp.Row; } int i = schueler_werteView.Table.Rows.IndexOf(row);
atmBox1.DataBindings.Add("Text", schueler_werteView.Table.Rows[i], "wert"); |
das hat funktioniert
jetzt wo ich das bei dir lese und wieder zurückgestelt hab bekomm ich auch mit der zeile wo ich nur die view angebe den richigen wert.
ich glaube ich sollte mal ne pause machen ^^
aber eine frage hätte ich wieder
sollte ich jetzt meine daten in der DataView ändern und es besteht bereits ein binding von daten auf die textbox, wie kann ich das akuallisieren?
so in etwar hab ich das derzeit
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36:
| if (schueler_werteView.Count != -1) { ugBox1.Visible = true; ugBox1.Text = listBoxGruppe.Text; if (!setBinding) { setBinding = true; maxBox1.Text = klassen_plaeneView.Table.Rows[0]["max_aufgaben"].ToString(); atmBox1.DataBindings.Add("Text", schueler_werteView.Table.Rows[i], "wert"); errorBox1.DataBindings.Add("Text", schueler_werteView.Table.Rows[i], "fehler"); schreibBox1.DataBindings.Add("Text", schueler_werteView, "bemerkungen"); } } else { if (setBinding) { StatusLabel.Text = "Es konnten keine Werte für den Schüler " + listBoxSchueler.Text + " zu der gruppe " + listBoxGruppe.Text + "gefunden werden!"; setBinding = false; maxBox1.Text = null; atmBox1.DataBindings.Clear(); errorBox1.DataBindings.Clear(); } |
OK so kann ich die DataBindings updaten
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51:
| if (schueler_werteView.Count != -1) { ugBox1.Visible = true; ugBox1.Text = listBoxGruppe.Text; if (setBinding == 0) { setBinding = 1; maxBox1.Text = klassen_plaeneView.Table.Rows[0]["max_aufgaben"].ToString(); atmBox1.DataBindings.Add("Text", schueler_werteView, "wert"); errorBox1.DataBindings.Add("Text", schueler_werteView"fehler"); schreibBox1.DataBindings.Add("Text", schueler_werteView, "bemerkungen"); } if (setBinding > 0) { atmBox1.DataBindings.Clear(); errorBox1.DataBindings.Clear(); schreibBox1.DataBindings.Clear(); maxBox1.Text = klassen_plaeneView.Table.Rows[0]["max_aufgaben"].ToString(); atmBox1.DataBindings.Add("Text", schueler_werteView, "wert"); errorBox1.DataBindings.Add("Text", schueler_werteView"fehler"); schreibBox1.DataBindings.Add("Text", schueler_werteView, "bemerkungen"); } } else { if (setBinding > 0) { StatusLabel.Text = "Es konnten keine Werte für den Schüler " + listBoxSchueler.Text + " zu der gruppe " + listBoxGruppe.Text + "gefunden werden!"; setBinding = 0; maxBox1.Text = null; atmBox1.DataBindings.Clear(); errorBox1.DataBindings.Clear(); schreibBox1.DataBindings.Clear(); } } } |
|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Fr 19.10.07 09:53
Hallo!
Ich mache hier mal zu. Du hast nun schon mehrere Fragen nacheinander hier gestellt, bei uns gilt aber, dass nur eine Frage pro Thread behandelt wird. Dann kannst Du auch für jede Frage einen passenden Thread-Titel wählen und sie in der richtigen Sparte des Forums platzieren.
Erstelle also bitte einen neuen Thread für eine neue Frage. Danke!
Grüße
Christian
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
Dieses Thema ist gesperrt, Du kannst keine Beiträge editieren oder beantworten.
Das Thema wurde von einem Team-Mitglied geschlossen. Wenn du mit der Schließung des Themas nicht einverstanden bist, kontaktiere bitte das Team.
|
|