Benutzer mit den meisten Antworten
Checkbox Abfrage bei DataGridView

Frage
-
Hallo,
in meinem alten Thread antwortet mir leider keiner mehr, daher stell ich hier meine Frage noch mal neu rein.
Ich habe eine DatatGridView an eine Access Datenbank gebunden, zusätlich habe ich manuell eine Checkbox eingefügt.
Der Benutzer kann über diese Checkbox verschiedene Protokoll Nummern auswählen, zu denen ein Bericht erzeugt werden soll.
Die Checkbox ist nicht an die Datenbank gebunden. Der Name lautet "Check"
Jetzt möchte ich die Werte abfragen, aber als Ausgabe bekomme ich nur die Selektierten Zeilen und nicht die gecheckten Häckchen.
Hier mein Code dazu.
//Gruppenbericht erstellen private void button8_Click(object sender, EventArgs e) { //Abrufen der ausgewählten Zeile in einem DataGridView-Steuerelement Int32 selectedRowCount = tbl_ProtokollDataGridView.Rows.GetRowCount(DataGridViewElementStates.Selected); if (selectedRowCount > 0) { System.Text.StringBuilder sb = new System.Text.StringBuilder(); DataRowView rowView1 = tbl_ProtokollDataGridView.SelectedRows[0].DataBoundItem as DataRowView; FassmessanlageDataSet.tbl_ProtokollRow rowGBericht = rowView1.Row as FassmessanlageDataSet.tbl_ProtokollRow; foreach (DataGridViewRow row in tbl_ProtokollDataGridView.Rows) if (row.Cells[0].Value == "1") sb.AppendFormat("Protokoll Nr: {0}\r\n", rowGBericht.Protokoll_Nr); MessageBox.Show(sb.ToString(), "Auswahl"); } }
Hierbei wird mir nur die selektierte Spalte angezeigt.
z.B. Wenn ich 3 Häckchen setze und der letzte Wert auf der Protokoll Nr. 8 steht, wird folgendes angezeigt.
Auswahlt
Protokoll Nr: 8
Protokoll Nr: 8
Protokoll Nr: 8
Zusätzlich möchte ich dem Benutzer über ein Label anzeigen, wieviele Auswahlen er noch treffen kann.
Das heißt, wenn ein Häckchen gesetzt wird, soll runtergezählt werden.
private void tbl_ProtokollDataGridView_CellStateChanged(object sender, DataGridViewCellStateChangedEventArgs e) { { int buffer = 0; for (int i = 0; i < this.tbl_ProtokollDataGridView.Rows.Count; i++) { buffer += System.Convert.ToInt32(tbl_ProtokollDataGridView.Rows[i].Cells[0].Value); } int ergebnis = 25 - buffer; label6.Text = ergebnis.ToString(); } }
Dieser Code wird zwar ausgeführt aber er zählt nicht richtig runter. Das heißt erst wenn das zweite Häckchen gesetzt wir fängt er an runter zu zählen.
Ist es falsch die Row's abzufragen? Muss ich meine Häckchenfeld (Check) abfragen?
Ich habe dies probiert, aber ich bekomme es leider net hin.
Habt ihr da ne Idee?
Danke Ciao Stefan
Antworten
-
Hallo Stefan,
Für die Abfrage einer zusätzlichen ungebundenen DataGridViewCheckBoxColumn gibt es normal zwei Verfahren:
- Man kann das zum einen über den VirtualMode machen und dann über CellValueNeeded gehen ...:
[DataGridView FAQ] siehe -> 20. How do I show unbound data along with bound data?
http://windowsclient.net/Samples/Go To Market/DataGridView/DataGridView FAQ.doc
- Zweitens über EditedFormattedValue:
[DataGridViewCell.EditedFormattedValue-Eigenschaft (System.Windows.Forms)]
http://msdn.microsoft.com/de-de/library/system.windows.forms.datagridviewcell.editedformattedvalue.aspx
Dazu habe ich im Folgenden ein Beispiel gemacht. Hier muss eben berücksichtigt werden, dass die Rows vorher auch anders sortiert sein könnten. Dies wird über den CurrencyManager gewährleistet, aus dem Du dann die auf zugehörige Zeile (deren Werte) zugreifen kannst:
// sei die Variable "MeineCheckBox" die DataGridViewCheckBox-Column DataGridView dgv; private void btnTest_Click(object sender, EventArgs e) { dgv = tbl_ProtokollDataGridView; CurrencyManager cm = BindingContext[dgv.DataSource, dgv.DataMember] as CurrencyManager; if (IstNull(cm, "Bindungskontext nicht implementiert")) return; StringBuilder sb = new StringBuilder("Abgehakte Zeilen sind Zeile: "); for (int i = 0; i < cm.List.Count; i++) { DataRowView drv = cm.List[i] as DataRowView; if (IstNull(drv, "Grid-Zeilen-Typ nicht unterstützt")) return; bool abgehakt = (bool)dgv[MeineCheckBox.Index, i].EditedFormattedValue; if (abgehakt) sb.Append(i+ ", "); } MessageBox.Show(sb.ToString()); } bool IstNull(object obj, string meldung) { if (obj != null) return false; MessageBox.Show(meldung); return true; }
ciao Frank
- Als Antwort markiert hk_1000 Sonntag, 9. Januar 2011 14:33
- Man kann das zum einen über den VirtualMode machen und dann über CellValueNeeded gehen ...:
-
Hallo HK.,
> Ich will nicht die SelectedRows[0] sondern die gecheckten Kästchen abfragen ...
dann brauchst Du doch nur in meinem (und von Dir jetzt übernommenen) Quellcode von der bereits berechneten DataRowView die Row benutzen:
if (abgehakt) { FassmessanlageDataSet.tbl_ProtokollRow rowGBericht = drv.Row as FassmessanlageDataSet.tbl_ProtokollRow; sb.AppendFormat("Protokoll Nr: {0}\r\n", rowGBericht.Protokoll_Nr); } // Hier testweise BreakPoint setzen
BTW: Damit SelectedRows[0] gefüllt ist (was Du ja aber nicht willst), müsste man ggf. etwas wie:dGV_gBericht.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
ciao Frank- Als Antwort markiert hk_1000 Sonntag, 9. Januar 2011 14:33
Alle Antworten
-
Ein DataGridView kann man nicht direkt an eine Access-Datei binden. DieDaten sind zuerst in einen Puffer zu laden. Jeder Datenzeile kann man einezusätzliche booleasche Eigenschaft verpassen, die dann im Grid als CheckBoxangezeigt wird. In einer Schleife kann man alle Datenzeilen durchlaufen undauf den Wert der booleaschen Eigenschaft prüfen.--Viele GrüßePeter
-
Da hab ich mich wohl etwas unklar ausgedrückt.
Ich habe die DataGridView über ein DataSet/TableAdapter/BindingSource an die Datenbank gebunden.
Die CheckBox habe ich auch in der DataGridView eingefügt, der Name lautet "Check".
Aber ich weiß net genau wie ich die ansprechen kann.
Der Obige Code gibt mir nur die zuletzt Selektierte Zeile aus aber nicht die restlichen gecheckten Zeilen.
-
Wenn Du ein DataSet als clientseitigen Datenpuffer nutzt, dann kannst Du dieRows-Auflistung der im DataSet enthaltenen DataTable durchlaufen und dieCheck-Spalte prüfen. wenn es die Check-Spalte nicht in der DataTable gibt,dann füge sie hinzu. Ggf. sind nach Ablauf einer Programmschleife vor dernächsten Nutzerauswahl die Inhalte der Feldwerte der DataRowszurückzusetzen.--Viele GrüßePeter
-
Hallo Stefan,
Für die Abfrage einer zusätzlichen ungebundenen DataGridViewCheckBoxColumn gibt es normal zwei Verfahren:
- Man kann das zum einen über den VirtualMode machen und dann über CellValueNeeded gehen ...:
[DataGridView FAQ] siehe -> 20. How do I show unbound data along with bound data?
http://windowsclient.net/Samples/Go To Market/DataGridView/DataGridView FAQ.doc
- Zweitens über EditedFormattedValue:
[DataGridViewCell.EditedFormattedValue-Eigenschaft (System.Windows.Forms)]
http://msdn.microsoft.com/de-de/library/system.windows.forms.datagridviewcell.editedformattedvalue.aspx
Dazu habe ich im Folgenden ein Beispiel gemacht. Hier muss eben berücksichtigt werden, dass die Rows vorher auch anders sortiert sein könnten. Dies wird über den CurrencyManager gewährleistet, aus dem Du dann die auf zugehörige Zeile (deren Werte) zugreifen kannst:
// sei die Variable "MeineCheckBox" die DataGridViewCheckBox-Column DataGridView dgv; private void btnTest_Click(object sender, EventArgs e) { dgv = tbl_ProtokollDataGridView; CurrencyManager cm = BindingContext[dgv.DataSource, dgv.DataMember] as CurrencyManager; if (IstNull(cm, "Bindungskontext nicht implementiert")) return; StringBuilder sb = new StringBuilder("Abgehakte Zeilen sind Zeile: "); for (int i = 0; i < cm.List.Count; i++) { DataRowView drv = cm.List[i] as DataRowView; if (IstNull(drv, "Grid-Zeilen-Typ nicht unterstützt")) return; bool abgehakt = (bool)dgv[MeineCheckBox.Index, i].EditedFormattedValue; if (abgehakt) sb.Append(i+ ", "); } MessageBox.Show(sb.ToString()); } bool IstNull(object obj, string meldung) { if (obj != null) return false; MessageBox.Show(meldung); return true; }
ciao Frank
- Als Antwort markiert hk_1000 Sonntag, 9. Januar 2011 14:33
- Man kann das zum einen über den VirtualMode machen und dann über CellValueNeeded gehen ...:
-
Vielen Dank schonmal, ich bekomme jetzt schon den Index der ausgewählten Kästchen angezeigt. Ich möchte aber die ausgewählten Protokoll Nr angezeigt bekommen. Und da habe ich noch ein kleines Problem. Hier erstmal der Code:
//Gruppenbericht erstellen private void button1_Click(object sender, EventArgs e) { //Abrufen der ausgewählten Zeile in einem DataGridView-Steuerelement CurrencyManager cm = BindingContext[dGV_gBericht.DataSource, dGV_gBericht.DataMember] as CurrencyManager; if (IstNull(cm, "Bindungskontext nicht implementiert")) return; StringBuilder sb = new StringBuilder(); DataRowView rowView1 = dGV_gBericht.SelectedRows[0].DataBoundItem as DataRowView; //Hier liegt der Fehler!!!! FassmessanlageDataSet.tbl_ProtokollRow rowGBericht = rowView1.Row as FassmessanlageDataSet.tbl_ProtokollRow; for (int i = 0; i < cm.List.Count; i++) { DataRowView drv = cm.List[i] as DataRowView; if (IstNull(drv, "Grid-Zeilen-Typ nicht unterstützt")) return; bool abgehakt = (bool)dGV_gBericht[Check.Index, i].EditedFormattedValue; if (abgehakt) //sb.AppendFormat("Protokoll Nr: {0}\r\n", i); sb.AppendFormat("Protokoll Nr: {0}\r\n", rowGBericht.Protokoll_Nr); } MessageBox.Show(sb.ToString(), "Auswahl"); } bool IstNull(object obj, string meldung) { if (obj != null) return false; MessageBox.Show(meldung); return true; }
Das Problem ist, dass es so nicht funktioniert, folgende Zeile Code muss ich abändern:
DataRowView rowView1 = dGV_gBericht.SelectedRows[0].DataBoundItem as DataRowView;
Leider weiß ich nicht wie. Ich will nicht die SelectedRows[0] sondern die gecheckten Kästchen abfragen, aber was muss ich hier eingeben, dass ich trotdem die DataBoundItem Funktion habe? Gruss Stefan
- Bearbeitet hk_1000 Samstag, 8. Januar 2011 14:44 Unleserlich
-
Hallo HK.,
> Ich will nicht die SelectedRows[0] sondern die gecheckten Kästchen abfragen ...
dann brauchst Du doch nur in meinem (und von Dir jetzt übernommenen) Quellcode von der bereits berechneten DataRowView die Row benutzen:
if (abgehakt) { FassmessanlageDataSet.tbl_ProtokollRow rowGBericht = drv.Row as FassmessanlageDataSet.tbl_ProtokollRow; sb.AppendFormat("Protokoll Nr: {0}\r\n", rowGBericht.Protokoll_Nr); } // Hier testweise BreakPoint setzen
BTW: Damit SelectedRows[0] gefüllt ist (was Du ja aber nicht willst), müsste man ggf. etwas wie:dGV_gBericht.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
ciao Frank- Als Antwort markiert hk_1000 Sonntag, 9. Januar 2011 14:33
-
Danke Frank,
das ist die Lösung des Problems :-)
FassmessanlageDataSet.tbl_ProtokollRow rowGBericht = drv.Row as FassmessanlageDataSet.tbl_ProtokollRow;
konnte ich nicht in die if-Anweisung schreiben, da der Datenbankaufruf nicht gekapselt sein darf, desshalb habe ich ihn vor die if-Anweisung geschrieben und es funktioniert.
Vielen Dank
Ciao Stefan