Autor Beitrag
chip777
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 127

Win 7 Prof
C# VS 2008
BeitragVerfasst: Mi 28.04.10 10:57 
Ich versuche gerade eine neue Zeile in ein DataGridView einzufügen, dies soll mit folgendem Code geschehen:

ausblenden C#-Quelltext
1:
dataGridView2.Rows.Insert(x, 1); // x = Zeilennummer, 1 = Anzahl der neuen Zeilen					

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:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Mi 28.04.10 11:19 
user profile iconchip777 hat folgendes geschrieben Zum zitierten Posting springen:
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1012
Erhaltene Danke: 24

Windows XP
C#, Visual Studio
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 127

Win 7 Prof
C# VS 2008
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1012
Erhaltene Danke: 24

Windows XP
C#, Visual Studio
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 127

Win 7 Prof
C# VS 2008
BeitragVerfasst: 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:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
System.Data.OleDb.OleDbConnection MyConnection;         // Eine neue OleDb Verbindung wird erstellt/geöffnet
System.Data.DataSet DtSet;                              // Ein Dataset wird erzeugt
System.Data.OleDb.OleDbDataAdapter MyCommand;           // Ein Adapter wird erstellt um später auf Tabellenblätter zuzugreifen
string Name = Projektpfad + "\\" + "Daten.xls";         // Die Quelldatei wird mit Pfad im string Name gespeichert
MyConnection = new System.Data.OleDb.OleDbConnection("provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + Name + ";Extended Properties=Excel 8.0;"); //Die Quelldatei wird der Verbindung zugewiesen
MyCommand = new System.Data.OleDb.OleDbDataAdapter("select * from [Tabelle1$]", MyConnection);  // Das Tabellenblatt wird ausgewählt
MyCommand.TableMappings.Add("Table""TestTable");      // die Masterzuordnung wird zwischen den zurückgegebenen Datensätzen und dem DataSet hergestellt
DtSet = new System.Data.DataSet();                    // Ein neues DataSet mit Namen DtSet wird erstellt
MyCommand.Fill(DtSet);                                  // Die Daten werden ins DtSet gespeichert
dataGridView2.DataSource = DtSet.Tables[0];             // Die Datenquelle des DGV2 wird festgelegt
MyConnection.Close();                                   // Die Verbindung wird wieder geschlossen
ErstellenBaumdiagramm();                                // Methode um die Daten aus dem DGV2 ins TreeView zu bekommen

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.
Zitat:

und was du hast

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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1012
Erhaltene Danke: 24

Windows XP
C#, Visual Studio
BeitragVerfasst: 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:
ausblenden 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;"); //Die Quelldatei wird der Verbindung zugewiesen

System.Data.OleDb.OleDbDataAdapter MyCommand =
      new System.Data.OleDb.OleDbDataAdapter("select * from [Tabelle1$]", MyConnection);  // Das Tabellenblatt wird ausgewählt
   Command.TableMappings.Add("Table""TestTable");      // die Masterzuordnung wird zwischen den zurückgegebenen Datensätzen und dem DataSet hergestellt
   System.Data.DataSet DtSet = new System.Data.DataSet();                    // Ein neues DataSet mit Namen DtSet wird erstellt
   MyCommand.Fill(DtSet);
   MyConnection.Close();
   return dtSet;
}


2) Daten anzeigen:
ausblenden 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:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
DataSet data = ReadExcelFile("blahblub.xls");

ShowTable(data.Tables["Test"]);

// füge Zeile hinzu:
data.Tables["Test"].Rows.Add("blah""blub");


Bringt dich das weiter?
chip777 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 127

Win 7 Prof
C# VS 2008
BeitragVerfasst: 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:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1012
Erhaltene Danke: 24

Windows XP
C#, Visual Studio
BeitragVerfasst: 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:
ausblenden 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
{
    // klassen member mit den Daten
    private DataSet _data;
 
    // Property mit den Daten
    public DataSet Data { 
       get { return _data; }
       set
       {
          if (_data != value)
          {
             _data = value;
          }
       }
    }

    public void ShowTable(string tablename)
    {
        dataGridView2.DataSource = Data.Tables[tablename];
    }
}
chip777 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 127

Win 7 Prof
C# VS 2008
BeitragVerfasst: 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.
ausblenden C#-Quelltext
1:
2:
3:
DataRow y ;
data.Tables[0].Rows.InsertAt(y, x); //x steht für die Zeilennummer
//das y steht für DataRow, und da weiß ich nicht was da rein muss, ich will eigentlich nur eine Leerzeile erstellen.


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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
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
BeitragVerfasst: 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:
ausblenden C#-Quelltext
1:
DtSet.Tables[0];					

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:
ausblenden C#-Quelltext
1:
2:
3:
4:
DataRow newrow = DtSet.Tables[0].NewRow();
newrow["ID"] = 1;
newrow["Name"] = "JüTho";   // usw., zum Abschluss:
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 127

Win 7 Prof
C# VS 2008
BeitragVerfasst: 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:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
            //neue Zeile im DataTable anlegen
            DataRow newrow = data.Tables[0].NewRow();
            newrow["NameRoboter"] = "";
            newrow["VorgaengerRoboter"] = treeView1.SelectedNode.Parent.Text;
            newrow["IdVorgang"] = 0//usw. mit den nächsten Reihen
            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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
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
BeitragVerfasst: 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