Laden...

datagridview Werte übernehmen klappt nur nach Lust und Laune

Erstellt von shufflekeks vor 9 Jahren Letzter Beitrag vor 9 Jahren 1.928 Views
S
shufflekeks Themenstarter:in
14 Beiträge seit 2014
vor 9 Jahren
datagridview Werte übernehmen klappt nur nach Lust und Laune

Hallo Community,
ich bin mal wieder verwundert. (Entschuldigung für dieses Thema, aber mir viel absolut nichts passendes ein)

Ich habe ein Grid, wo ich nun ein ContextMenu eingefügt habe. Dort kann man den ersten Wert im Grid ("Telegramm auswählen") false oder true setzen.
Angehen wollte ich es so:

private void TSItemtelegramman_Click(object sender, EventArgs e)
        {
            foreach (DataGridViewRow row in dataGridView1.SelectedRows)
            {
                row.Cells["Telegramm auswählen"].Value = true;
            }
        }

Das bringt mich zu dem Problem, das wenn nur eine Zeile ausgewählt ist, der wert erst übernommen wird, nachdem ich in eine andere Zelle (außerhalb der Zeile) klicke.
Sind mehrere Zeilen ausgewählt, so werden bis auf die letzte Zeile alle Werte auf true gesetzt.
Dieses Phänomen tritt aber nur manchmal auf. Manchmal klappt es, manchmal wird der Wert auch garnicht gesetzt, ich kann es mir nicht erklären.
Versuche wie

telegrammeTableAdapter.Update(seKonVorlageDataSet);

//oder
dataGridView1.Rows[row.Index].SetValues(new object[] { true });

//oder
seKonVorlageDataSet.Telegramme.Rows[row.Index].CancelEdit();

//oder
dataGridView1.ClearSelection();

brachten keinen Erfolg.
Teilweise bekomme ich sogar eine Exception beim Update (Parallelitätsverletzung).

Ich weiß, dass ich normalerweise nur Werte im DataSet ändern soll und nicht im Grid.
Allerdings habe ich noch keine saubere Möglichkeit gefunden von den SelectedRows auf die Datensätze im DataSet zu schließen.

Danke im Voraus für eure Mühe

Gruß
shufflekeks

S
shufflekeks Themenstarter:in
14 Beiträge seit 2014
vor 9 Jahren

Klappt nun.
Natürlich lag der Kniff, wie vermutet, beim ändern des DataSets.

private void TSItemtelegramman_Click(object sender, EventArgs e)
{
       foreach (DataGridViewRow row in dataGridView1.SelectedRows)
       {
            int ID = (int) row.Cells["IDDatei"].Value;
            SeKonVorlageDataSet.TelegrammeRow zeile = seKonVorlageDataSet.Telegramme.FindByIDDatei(ID);
            zeile.Telegramm_auswählen = true;
        }
}
189 Beiträge seit 2014
vor 9 Jahren

Hallo shufflekeks,

dein riesen großer Fehler (weil Grundlage!) ist, dass foreach nur den lesenden Zugriff ermöglicht!

Eine for-Schleife löst dein Problem wesentlich eleganter.

4.939 Beiträge seit 2008
vor 9 Jahren

Sorry Ezio, aber deine Aussage stimmt hier nicht, da ja nicht die Collection (SelectedRows) selbst hier geändert wird, sondern nur die Inhalte.
Und generell ist eine foreach-Schleife eleganter als eine for-Schleife. 😉

S
shufflekeks Themenstarter:in
14 Beiträge seit 2014
vor 9 Jahren

Hallo Ezio,

The foreach statement repeats a group of embedded statements for each element in an array or an object collection that implements the System.Collections.IEnumerable or System.Collections.Generic.IEnumerable<T> interface. The foreach statement is used to iterate through the collection to get the information that you want, but can not be used to add or remove items from the source collection to avoid unpredictable side effects. If you need to add or remove items from the source collection, use a for loop.

Meinst du das?
Ich kann dort lediglich etwas von hinzufügen bzw löschen lesen, aber nichts von ändern. Aber ich werde mich schlau machen, Schande über mein Haupt! 😉

@TH69
Das war ja der Grund für das Benutzen der foreach-Schleife. 😃

189 Beiträge seit 2014
vor 9 Jahren

Hallo nochmal,

@Th69:
Danke, du hast Recht! Da habe ich wohl nicht ganz aufgepasst!
Natürlich ist foreach eleganter. Aber -wovon ich fälschlicherweise ausgegangen bin - wenn foreach nicht direkt möglich ist, sollte man lieber for nehmen als irgendwas zu basteln. =)
@shufflekeks:
Naja, du änderst nicht das Element selbst (new DataGridRow(), .add, .remove, o.ä.) und damit die Collection, sondern veränderst nur eine Eigenschaft. Und das ist selbstverständlich möglich.

Grüße, Ezio