Entwickler-Ecke

Basistechnologien - DataGridView alle markieren Zeilen in DataTable


Talemantros - Di 14.04.15 07:57
Titel: DataGridView alle markieren Zeilen in DataTable
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:

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


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 - 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 - 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


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 - 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 - 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 - 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 - 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

C#-Quelltext
1:
2:
                bsOktabiner.DataSource = OktabinerMethods.GetDataTableOktabinerForRecycler(10);
                dgvUebersicht.DataSource = bsOktabiner;


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


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?


Ralf Jansen - 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 - Fr 17.04.15 13:29

Hallo Ralf,
vielen Dank.

VG und schönes Wochenende