Autor |
Beitrag |
chip777
      
Beiträge: 127
Win 7 Prof
C# VS 2008
|
Verfasst: Mi 28.04.10 10:57
Ich versuche gerade eine neue Zeile in ein DataGridView einzufügen, dies soll mit folgendem Code geschehen:
C#-Quelltext 1:
| dataGridView2.Rows.Insert(x, 1); |
Während der Programmlaufzeit tritt folgender Fehler auf:"Zeilen können nicht automatisch zur Zeilenauflistung der DataGridView hinzugefügt werden, wenn das Steuerelement datengebunden ist."
Hier der Code indem das DataGridView beschrieben wird:
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| System.Data.OleDb.OleDbConnection MyConnection; System.Data.DataSet DtSet; System.Data.OleDb.OleDbDataAdapter MyCommand; string Name = Projektpfad + "\\" + "Daten.xls"; MyConnection = new System.Data.OleDb.OleDbConnection("provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + Name + ";Extended Properties=Excel 8.0;"); MyCommand = new System.Data.OleDb.OleDbDataAdapter("select * from [Tabelle1$]", MyConnection); MyCommand.TableMappings.Add("Table", "TestTable"); DtSet = new System.Data.DataSet(); MyCommand.Fill(DtSet); dataGridView2.DataSource = DtSet.Tables[0]; MyConnection.Close(); |
Deshalb muss ich jetzt wissen, wie ich entweder eine neue Zeile trotz Datenbindung reinbekomme, oder wie ich die Daten stattdessen in den Table bekomme.
Martin
|
|
Kha
      
Beiträge: 3803
Erhaltene Danke: 176
Arch Linux
Python, C, C++ (vim)
|
Verfasst: Mi 28.04.10 11:19
chip777 hat folgendes geschrieben : | oder wie ich die Daten stattdessen in den Table bekomme. | deineDataTable.Rows.Add/InsertAt?
_________________ >λ=
Zuletzt bearbeitet von Kha am Mi 28.04.10 11:19, insgesamt 1-mal bearbeitet
|
|
danielf
      
Beiträge: 1012
Erhaltene Danke: 24
Windows XP
C#, Visual Studio
|
Verfasst: Mi 28.04.10 11:19
Hallo,
du sollst keine Zeile in das DataGridView bekommen, sondern eine Zeile deiner Data hinzufügen. Welche Datenstruktur liegt deinem DataGridView zu Grunde? FÜge dort die Zeile hinzu.
|
|
chip777 
      
Beiträge: 127
Win 7 Prof
C# VS 2008
|
Verfasst: Mi 28.04.10 11:35
Zitat: | du sollst keine Zeile in das DataGridView bekommen, sondern eine Zeile deiner Data hinzufügen. Welche Datenstruktur liegt deinem DataGridView zu Grunde? FÜge dort die Zeile hinzu. |
Zu Grunde liegt eine Excel Datei, in die will ich immer erst am Ende schreiben, wenn mein DGV komplett editiert ist, nicht jedesmal wenn eine Zeile geändert wird.
Zitat: | deineDataTable.Rows.Add/InsertAt? |
Das ist mir durchaus bewusst, leider weiß ich nciht wie mein DataTable heißt, der Quellcode von oben ist aus dem Internet um eine Excel Datei in ein DataGridView zu bekommen, aber ich kann leider nicht erkennen, wie der Name des DataTable ist, bzw. wenn ich das richtig sehe, ist das ganze in einem DataSet gespeichert.
Und auf das DataSet kann ich ja nicht zugreifen das dieses in einer anderen Methode deklariert wurde, oder soll ich das übergeben?
Sry, wie gesagt ich bin noch ein ziemlicher Anfänger, aber ich versuch mein Bestes um schnell mehr Wissen über C# zu erlangen und somit nicht mehr soviele Fragen stellen zu müssen.
|
|
danielf
      
Beiträge: 1012
Erhaltene Danke: 24
Windows XP
C#, Visual Studio
|
Verfasst: Mi 28.04.10 11:39
Die Fragen sind nicht das Problem
Was meinst du du versuchst es so schnell wie möglich zu lernen?
Hast du dir den Code den du aus dem Internet hast mal angeschaut (Zeile für Zeile)?
Bitte füge bei dem Code mal Kommentare ein, damit du dir klar machst, was in den Zeilen passiert. Dann überlege was du machen willst, überlege was du brauchst und was du hast. Poste den Code wie weit du gekommen bist (mit Kommentare) und dann ist es ein leichtes für uns dir zu helfen
Gruß
|
|
chip777 
      
Beiträge: 127
Win 7 Prof
C# VS 2008
|
Verfasst: Mi 28.04.10 13:10
Zitat: |
Was meinst du du versuchst es so schnell wie möglich zu lernen?
|
Ich lese immer wenn ich Zeit hab im Buch "Visual C# 2008 Schritt für Schritt", damit ich meine Programmiermöglichkeiten erweitern kann. Leider ist es nicht möglich das Buch komplett zu lesen und danach erst anzufangen das Programm zu schreiben, also versuch ich es mit einem Kompromiss, indem ich schon programmiere und in meiner Freizeit lese.
Zitat: |
Hast du dir den Code den du aus dem Internet hast mal angeschaut (Zeile für Zeile)?
|
Ja das habe ich, hier ist er nochmal mit Kommentaren:
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| System.Data.OleDb.OleDbConnection MyConnection; System.Data.DataSet DtSet; System.Data.OleDb.OleDbDataAdapter MyCommand; string Name = Projektpfad + "\\" + "Daten.xls"; MyConnection = new System.Data.OleDb.OleDbConnection("provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + Name + ";Extended Properties=Excel 8.0;"); MyCommand = new System.Data.OleDb.OleDbDataAdapter("select * from [Tabelle1$]", MyConnection); MyCommand.TableMappings.Add("Table", "TestTable"); DtSet = new System.Data.DataSet(); MyCommand.Fill(DtSet); dataGridView2.DataSource = DtSet.Tables[0]; MyConnection.Close(); ErstellenBaumdiagramm(); |
Zitat: |
überlege was du machen willst
|
Ich will eine Zeile einfügen um neue Daten darin anufzunehmen, und zwar an einer bestimmten Stelle, dies sollte meiner Meinung nach über DtSet.Tables[0] passieren, da dort wenn ich alles richtig verstabnde hab, die Daten gespeichert sind
Zitat: |
überlege was du brauchst
|
Eine Verbindung um die Daten zu übergeben, da dies nicht über das DataGridView funktiniert muss ich es in die Quelle schreiben aus der das DGV seine Daten bezieht.
Ich hab ein DataGridView und ein DataSet, ich werd jetzt erstmal in die MSDN schauen wie der Zugriff auf ein DataSet erfolgen kann.
Zitat: |
Poste den Code wie weit du gekommen bist (mit Kommentare) und dann ist es ein leichtes für uns dir zu helfen
|
Im Moment hab ich noch keinen Code, da ich keine Ahnung habe, wie ich das DataSet aus der anderen Methode in meine bekomme, da die zweite Methode nicht von der ersten aufgerufen wird.
Ich hab zwar versucht das DataSet global anzulegen, damit ich von überall darauf zugreifen kann, aber das ist mir leider nicht gelungen.
Gruß,
Martin
|
|
danielf
      
Beiträge: 1012
Erhaltene Danke: 24
Windows XP
C#, Visual Studio
|
Verfasst: Mi 28.04.10 13:32
Okay, Danke für deine Bemühungen.
Fürs Erste kannst du den Code in Methoden zerstückeln, dass du eine schöne Trennung hinbekommst:
1) Daten aus dem Excel file lesen:
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| public DataSet ReadExcelFile(string file) { System.Data.OleDb.OleDbConnection MyConnection = new System.Data.OleDb.OleDbConnection("provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + file + ";Extended Properties=Excel 8.0;"); System.Data.OleDb.OleDbDataAdapter MyCommand = new System.Data.OleDb.OleDbDataAdapter("select * from [Tabelle1$]", MyConnection); Command.TableMappings.Add("Table", "TestTable"); System.Data.DataSet DtSet = new System.Data.DataSet(); MyCommand.Fill(DtSet); MyConnection.Close(); return dtSet; } |
2) Daten anzeigen:
C#-Quelltext 1: 2: 3: 4:
| public void ShowTable(DataTable table) { dataGridView2.DataSource = table; } |
Dann hast du die Einleseroutine und die Darstellung erstmal getrennt. Im "Zusammenspiel" könnte es dann so aussehen:
C#-Quelltext 1: 2: 3: 4: 5: 6:
| DataSet data = ReadExcelFile("blahblub.xls");
ShowTable(data.Tables["Test"]);
data.Tables["Test"].Rows.Add("blah", "blub"); |
Bringt dich das weiter?
|
|
chip777 
      
Beiträge: 127
Win 7 Prof
C# VS 2008
|
Verfasst: Mi 28.04.10 14:04
Das bringt mich ein ganzes Stück weiter und es ist echt eine gute Idee, das Programm so aufzuteilen.
Allerdings bekomme ich eine Fehlermeldung wenn ich eine neue Zeile anlegen will:
C#-Quelltext 1:
| data.Tables["Test"].Rows.Insert(x, 1); |
Fehler: Der Name "data" ist im aktuellen Kontext nicht vorhanden.
Und mal ganz am Rande, ich muss mich für deine Bemühungen bedanken und nicht andersherum. Ohne dieses Forum würde ich das Programm glaub ich nie fertig bekommen.
In diesem Sinne schonmal vielen Dank
Wenn dann jetzt noch das einfügen der Zeile passt, dann komm ich wieder ein ganzes Stück weiter.
Martin
|
|
danielf
      
Beiträge: 1012
Erhaltene Danke: 24
Windows XP
C#, Visual Studio
|
Verfasst: Mi 28.04.10 14:16
Sichtbarkeit in einer objektorientierten Sprache ist halt so eine Sache.
Schau dir mal das Kapitel 6 101 von C# an. Da gehen sie auf die Grundgerüst einer Klasse ein.
Bei dir wäre das Gerüst ungefähr:
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22:
| public class Blub { private DataSet _data; public DataSet Data { get { return _data; } set { if (_data != value) { _data = value; } } }
public void ShowTable(string tablename) { dataGridView2.DataSource = Data.Tables[tablename]; } } |
|
|
chip777 
      
Beiträge: 127
Win 7 Prof
C# VS 2008
|
Verfasst: Mi 28.04.10 14:39
Ich hab DataSet data jetzt global vereinbart, damit funktioniert es jetzt. Da das nicht optimal ist, werd ich es nochmal so versuchen wie du es beschrieben hast, sobald ich den Artikel komplett gelesen und verstanden habe.
Allerdings will der Compiler jetzt ein Argument haben, und ich versteh nicht so richtig wie ich das übergeben kann.
C#-Quelltext 1: 2: 3:
| DataRow y ; data.Tables[0].Rows.InsertAt(y, x); |
Ich schau mal in die MSDN unter DataRow, wahrscheinlich komm ich damit schon weiter.
edit: mit DataRow y= null; funktioniert es. Leider hab ich irgendwas im Programm gerade so geändert das es nicht mehr richtig lädt, also werd ich erstmal versuchen das hinzubekommen.
Zuletzt bearbeitet von chip777 am Mi 28.04.10 14:52, 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: Mi 28.04.10 14:41
Hallo,
ich möchte mich jetzt nicht in eure Überlegungen einmischen, sondern nur eine Kleinigkeit ergänzen:
Du hattest oben nach dem Namen der DataTable gefragt. Damals hieß sie:
C#-Quelltext
Nach der Umstrukturierung wird sie etwas anders heißen, aber die Situation ist die gleiche.
Den Code für das Einfügen einer neuen Zeile hatte Sebastian sehr verkürzt angegeben. Es geht etwa so:
C#-Quelltext 1: 2: 3: 4:
| DataRow newrow = DtSet.Tables[0].NewRow(); newrow["ID"] = 1; newrow["Name"] = "JüTho"; DtSet.Tables[0].Rows.Add(newrow); |
Übrigens gilt: Eine DataTable ist eine unsortierte Datenmenge. Du kannst zwar an eine spezielle Stelle die Zeile einfügen; aber das ist nur eine temporäre Maßnahme. Sortierungen gehen über eine DataView.
Gruß Jürgen
|
|
chip777 
      
Beiträge: 127
Win 7 Prof
C# VS 2008
|
Verfasst: Mi 28.04.10 15:24
Vielen Dank ihr beiden für eure Hilfe, ich hab jetzt beides kombiniert und es funktioniert.
Nachdem ich nun Zeilen einfügen kann, werd ich mich darum kümmern, dass ich auch wieder Zeilen löschen kann, da das aber genauso funktionieren sollte denke ich das ich das alleine hinbekomme.
Hier noch der Code mit dem ich eine neue Zeile anlege und initialisiere:
C#-Quelltext 1: 2: 3: 4: 5: 6:
| DataRow newrow = data.Tables[0].NewRow(); newrow["NameRoboter"] = ""; newrow["VorgaengerRoboter"] = treeView1.SelectedNode.Parent.Text; newrow["IdVorgang"] = 0; data.Tables[0].Rows.Add(newrow); |
Gruß,
Martin
Edit: Jürgens Vorschläge eingebunden.( das // neue Zeile in DGV anlegen, war nur noch drin weil das vorher so war und ich den Kommentar noch nicht geändert hatte.
Zuletzt bearbeitet von chip777 am Do 29.04.10 08:03, insgesamt 1-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: Mi 28.04.10 17:56
Na also.
Die globale Variable solltest du baldmöglichst korrigieren. Und Code, den du hier einstellst, kannst du gerne auf die relevanten Zeilen kürzen: NewRow, zwei Werte, Add - der ganze Zwischenteil bläht es nur auf.
Aber ich werde ärgerlich, wenn ich immer noch so etwas lese:
Zitat: | //neue Zeile im DGV anlegen |
Es wird keine neue Zeile im DGV angelegt, sondern in der DataTable!
Gruß Jürgen
|
|