Autor Beitrag
Talemantros
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 444
Erhaltene Danke: 2

Win7 Proff 64bit
C# (VS2013)
BeitragVerfasst: Di 14.04.15 07:57 
Hallo,
ich hätte da mal wieder eine Frage!
Wie die Überschrift es sagt, würde ich gern aus einem DataGridView alle markieren Zeilen in ein DataTable packen um dieses an eine Methode zu übergeben.

Mein Ansatz bisher:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
DataTable dt = new DataTable();
dt.Columns.Add("Oktabiner");
dt.Columns.Add("Brutto");
dt.Columns.Add("Netto");
dt.Columns.Add("Charge");

foreach (DataGridViewRow zeile in dgvUebersicht.SelectedRows)
{
    dt.Rows.Add((string)zeile.Cells[1].Value, (double)zeile.Cells[2].Value, (double)zeile.Cells[3].Value, (string)zeile.Cells[4].Value);
}


Geht das anders, oder ist es ok so etc?!

Vielen Dank

Viele Grüße
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4701
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Di 14.04.15 10:38 
Wenn die Quelle auch eine DataTable war und du eine genaue Kopie der Rows brauchst (du hast in deinem Code zumindest die erste Spalte weggelassen) dann
würde ich DataTable und DataRows kopieren.

ausblenden C#-Quelltext
1:
2:
3:
DataTable dt = (dgvUebersicht.DataSource as DataTable).Clone();
foreach (DataGridViewRow row in dgvUebersicht.SelectedRows)
    dt.ImportRow((row.DataBoundItem as DataRowView).Row);
Talemantros Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 444
Erhaltene Danke: 2

Win7 Proff 64bit
C# (VS2013)
BeitragVerfasst: Mi 15.04.15 12:11 
Hi,
danke!
Das schaue ich mir mal an.
Das "neue" DataTable will ich in eine ExcelDatei schreiben.
Die Spalte 0 des "alten" beinhaltet nur die ID aus der Datenbank.

Da ich das DataTable nach Excel mit einer Schleife schreibe, die jede Spalte durch geht. Könnte hier auch einfach den Schleifenzähler anpassen.

Danke

Viele grüße
Talemantros Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 444
Erhaltene Danke: 2

Win7 Proff 64bit
C# (VS2013)
BeitragVerfasst: Do 16.04.15 11:19 
Hallo,
ich habe es schon als erledigt markiert, habe jetzt aber das Problem beim Übernehmen des Quellcodes, dass er folgendes bemängelt:

Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt

Dies passiert nach auskommentieren und Testen in folgender Zeile

ausblenden C#-Quelltext
1:
                    DataTable dt = (dgvUebersicht.DataSource as DataTable).Clone();					


Ich kann damit leider gar nichts anfangen :-(

Würde ich über Hilfe freuen.

Gruß
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4701
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Do 16.04.15 11:33 
Was ist den in dgvUebersicht.DataSource für ein Typ?
Wenn das bei dir knallt beim dann könntest du beim debuggen doch einfach mal schnell gucken was in dgvUebersicht.DataSource drin steckt.

Ich war davon ausgegangen das es eine DataTable ist. Die Code funktioniert an dieser Stelle nur wenn DataSource nicht null ist und das zugewiesene Quell Object eine DataTable ist.
Talemantros Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 444
Erhaltene Danke: 2

Win7 Proff 64bit
C# (VS2013)
BeitragVerfasst: Do 16.04.15 11:58 
Also es wird von der Methode ein DataTable geliefert.
Das ist soweit ok.

user profile iconRalf Jansen hat folgendes geschrieben Zum zitierten Posting springen:

Wenn das bei dir knallt beim dann könntest du beim debuggen doch einfach mal schnell gucken was in dgvUebersicht.DataSource drin steckt.


*hust* Wie meinst du das?

Sorry, dass ich das gerade nicht verstehe :-(
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4701
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Do 16.04.15 12:05 
Du druckst in Visual Studio den Start Knopf (oder F5) dann läuft dein Programm im Debugger. Wenn jetzt die besagte Exception Auftriff wird Visual Studio an dieser Stelle anhalten. Jetzt gehst du mit der Maus über die Code Stelle wo dgvUebersicht.DataSource steht und solange du über DataSource hoverst wird dir Visual Studio anzeigen was da drin ist.
Debuggen ist eine absolute essentielle Fähigkeit beim programmieren wenn die dir abgeht sollte du die schnell angehen. Ist wichtiger als alle möglichen anderen Programmierfähigkeiten die man sonst noch so brauchen könnte. Nach dem ersten "Hallo Welt" Proggi sollte gleich ein "wie debug ich das" beim lernen kommen.
Talemantros Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 444
Erhaltene Danke: 2

Win7 Proff 64bit
C# (VS2013)
BeitragVerfasst: Do 16.04.15 13:55 
Hallo Ralf,
dann habe ich es vor meiner Frage doch richtig gemacht, aber dadurch, dass ich den Code in einem try-Catch Block hatte ging es nicht.
Das mit dem Debuggen muss ich mir noch mehr angewöhnen.
Habe den try-Catch mal entfernt und jetzt meldet er mir dies auch .
Siehe Anlage:

Das DataGrid ist nicht leer, daher ich verstehe ich nicht, dass es angeblich NULL sein soll.

EDIT:
Beim Laden des Forms habe ich
ausblenden C#-Quelltext
1:
2:
                bsOktabiner.DataSource = OktabinerMethods.GetDataTableOktabinerForRecycler(10);
                dgvUebersicht.DataSource = bsOktabiner;


Ich habe jetzt deinen Code wie folgt angepasst, dies würde funktionieren

ausblenden C#-Quelltext
1:
2:
3:
                    DataTable dt = (bsOktabiner.DataSource as DataTable).Clone();
                    foreach (DataGridViewRow row in dgvUebersicht.SelectedRows)
                        dt.ImportRow((row.DataBoundItem as DataRowView).Row);


Kann ich dies so lassen, oder übersehe ich was?
Einloggen, um Attachments anzusehen!
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4701
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Do 16.04.15 14:49 
Deine Datenquelle war im original Code dann keine DataTable sondern eine BindingSource.

Der as Operator versucht in den gewünschten Datentyp zu casten und wenn das nicht geht da es kein castbarere Typ ist kommt da null raus.
dgvUebersicht.DataSource as DataTable wird also zu null ausgewertertet da es ja eine BindingSource ist und keine DataTable (zumindest nicht direkt).
Und Clone() an null aufrufen knallt dann wie du festgestellt hast.

Auf bsOktabiner.DataSource direkt zuzugreifen ist dann genau das Richtige. Zumindest fällt mir da gerade auch nix besseres ein.

Edit: Nebenbei den try..catch mußt du nicht auskommentieren. In Visual Studio kann man im Exception Dialog steuern wie bzw. wo der Debugger anhalten soll wenn eine Exception auftritt (dort wo sie gefangen wird und/oder da wo sie geworfen wird). Im Menü unter Debug/Exceptions oder CTRL+D,E.
Talemantros Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 444
Erhaltene Danke: 2

Win7 Proff 64bit
C# (VS2013)
BeitragVerfasst: Fr 17.04.15 13:29 
Hallo Ralf,
vielen Dank.

VG und schönes Wochenende