C# DataGridView bejárása DisplayIndex szerint.
2017-09-24T23:24:25+02:00
2017-09-26T21:19:01+02:00
2022-08-10T19:35:30+02:00
GZolee79
Sziasztok!

Van egy problémám amit nem sikerül megoldani. Adott egy DataGridView amit feltöltöttem egy SQL adatbázisból.
Az oszlopok sorrendjét megváltoztattam a DisplayIndex segítségével.
Ezután az a DataGridView tartalmát kimentem egy Excel táblába. Először egy DataTable-t készítek belőle. Úgy szeretném, hogy az Excelben az oszlopok olyan sorrendben jelenjenek meg, ahogy a Displayindex segítségével beállítottam.
A forráskód részlet:

foreach (DataGridViewRow row in this.dataGridView1.Rows) { DataRow drow = dt.NewRow(); int i = 0; foreach (DataGridViewCell cell in row.Cells) { if (cell.Visible) { drow[i] = cell.Value; i++; } } dt.Rows.Add(drow); }
Ez így működik csak a sorrend nem jó...

Hogy kellene displayindex szerint bejárnom? Vagy más megoldás?
Előre is köszi a válaszokat!

Z.
Mutasd a teljes hozzászólást!
Szia,

ha jól értem a cellákat a displayindex szerint akarod bejárni. Szóval a foreachen belül kellene egy belső ciklusban bejárnod az oszlopok neveit a megfelelő sorrendben.

Például így:

foreach (DataGridViewRow row in this.dataGridView1.Rows) { DataRow drow = dt.NewRow(); int i = 0; foreach (var column in dataGridView1.Columns.Cast<DataGridViewColumn>().Where(q => q.Visible).OrderBy(q => q.DisplayIndex)) { drow[i] = row.Cells[column.Name].Value; i++; } dt.Rows.Add(drow); }
Mutasd a teljes hozzászólást!

  • Köszi!

    Ez működik! :). Csak az a baj nem teljesen értem.

    El tudnád kicsit részletesebben ezt a sort?

    foreach (var column in dataGridView1.Columns.Cast<DataGridViewColumn>().Where(q => q.Visible).OrderBy(q => q.DisplayIndex))

    Az elejét értem, hogy létrehozol egy DataGridViewColumn változót, de a .Cast-tó,l kezdve nem igazán tiszta. Pl a "q" változó mikor deklarálódik?
    Mutasd a teljes hozzászólást!
  • Persze, ez egy LinQ lekérdezés amit ott látsz. A LinQ-t kicsit úgy képzeld el, mint egy SQL lekérdezést, csak jelenleg egy objektum listából szelektálsz, nem pedig adatbázisból.

    Jelen feladatban adott egy listád, jelen esetben a datagridview.Columns. Ez a lista ugye tartalmazza az oszlopaidat és azok minden tulajdonságát. Amit írtam neked lekérdezést, ezt a listát fogja leszűrni (Where - Visible == true) a látható oszlopokra, majd rendezni (OrderBy) a DisplayIndex alapján.

    A q egy lambda kifejezés, minden iterációban példányosodik. Írok neked egy példát ami szemlélteti, hogy mit is csinál. Mind a két változat teljesen ugyanazt csinálja.

    linq változat:

    var input = List<DataGridViewColumn() <- grided oszlopait tartalmazó lista; var output = input.Where(q => q.Visible);
    foreach változat:
    var input = List<DataGridViewColumn>() <- grided oszlopait tartalmazó lista; var output = new List<DataGridViewColumn>(); foreach (var row in input) { if (row.Visible) { output.Add(row); } }
    Mutasd a teljes hozzászólást!
  • Köszi!

    Azt hiszem értem. Sajnos még sosem hallottam erről a LinQ lekérdezésről, de úgy látom jobban bele kellene ásnom magam.
    Igen, azt észrevettem, hogy hasonlít egy SQL-lekérdezésre,de nem értettem, hogyan működik.

    Szóval, még egyszer köszönöm!

    Üdv:

    Zoli
    Mutasd a teljes hozzászólást!
  • Mutasd a teljes hozzászólást!
  • Köszi!

    Megnézem :)
    Mutasd a teljes hozzászólást!
abcd