2009-08-06 19 views
17

Ich habe eine Checkbox-Spalte zu einem DataGridView in meinem C# -Form hinzugefügt. Die Funktion muss dynamisch sein - Sie wählen einen Kunden aus, der alle seine Artikel anzeigt, die bedient werden könnten, und Sie wählen, welche von denen Sie dieses Mal bedient werden möchten.DataGridView Checkbox-Spalte - Wert und Funktionalität

Wie auch immer, der Code wird jetzt eine Chckbox am Anfang des DGV hinzufügen. Was ich wissen muss, ist folgendes:

1) Wie mache ich es so, dass die ganze Spalte standardmäßig "markiert" ist? 2) Wie kann ich sicherstellen, dass ich nur Werte aus den "geprüften" Zeilen erhalte, wenn ich auf eine Schaltfläche direkt unter dem DGV klicke?

Hier ist der Code der Spalte eingefügt werden:

DataGridViewCheckBoxColumn doWork = new DataGridViewCheckBoxColumn(); 
      doWork.HeaderText = "Include Dog"; 
      doWork.FalseValue = "0"; 
      doWork.TrueValue = "1"; 
      dataGridView1.Columns.Insert(0, doWork); 

Also, was als nächstes? Jede Hilfe würde sehr geschätzt werden!

Antwort

36
  1. Es gibt keine Möglichkeit, dies direkt zu tun. Sobald Sie Ihre Daten in das Netz haben, können Sie eine Schleife durch die Reihen und prüfen Sie jedes Feld wie folgt aus:

    foreach (DataGridViewRow row in dataGridView1.Rows) 
    { 
        row.Cells[CheckBoxColumn1.Name].Value = true; 
    } 
    
  2. Das Click-Ereignis wie folgt aussehen könnte:

    private void button1_Click(object sender, EventArgs e) 
    { 
        List<DataGridViewRow> rows_with_checked_column = new List<DataGridViewRow>(); 
        foreach (DataGridViewRow row in dataGridView1.Rows) 
        { 
         if (Convert.ToBoolean(row.Cells[CheckBoxColumn1.Name].Value) == true) 
         { 
          rows_with_checked_column.Add(row); 
         } 
        } 
        // Do what you want with the check rows 
    } 
    
+1

Dank bearbeiten! Das ist wirklich nützlich, aber nur eine Sache ... wenn ich an diesen Punkt komme, um die Informationen aus den überprüften Zeilen zu erhalten, wie würde ich die Informationen von einer bestimmten Zelle bekommen (zB den Zellenwert in Spalte 2 aller überprüften Zellen) Auch ... Sie scheinen wirklich Ihre Sachen für C# zu wissen, irgendwelche Bücher, die Sie empfehlen können? Vielen Dank. –

+0

Eigentlich, egal, ich habe einen Weg gefunden, es zu tun. Danke nochmal für deine Hilfe! –

+1

Froh, dass Sie es herausgefunden haben. Wie für ein Buch zu empfehlen, kann ich nicht sagen, dass ich etwas von C# lernen weiß. Ich benutze die msdn (http://msdn.microsoft.com/en-us/library/ms229335.aspx) Website viel für die Suche nach Methoden/Eigenschaften/Beschreibungen/Beispiele/etc, also würde ich sagen, das ist wahrscheinlich das Beste Referenz, oh ein SO auch;) – SwDevMan81

13
private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e) 
{ 
    DataGridViewCheckBoxCell ch1 = new DataGridViewCheckBoxCell(); 
    ch1 = (DataGridViewCheckBoxCell)dataGridView1.Rows[dataGridView1.CurrentRow.Index].Cells[0]; 

    if (ch1.Value == null) 
     ch1.Value=false; 
    switch (ch1.Value.ToString()) 
    { 
     case "True": 
      ch1.Value = false; 
      break; 
     case "False": 
      ch1.Value = true; 
      break; 
    } 
    MessageBox.Show(ch1.Value.ToString()); 
} 

beste Lösung zu finden, wenn das Kontrollkästchen in der Datagridview aktiviert ist oder nicht.

+0

Danke, funktioniert super! Um Ereignis nur zu behandeln, wenn Zelle Kontrollkästchen hat: '// .... DataGridView dgv = (DataGridView) Absender; if (dgv.CurrentCell.GetType()! = Typeof (DataGridViewCheckBoxCell)) { zurückgeben; } // ... ' – illagrenan

+0

Danke für die tolle Antwort! –

+1

danke @Nazeer nur ein wenig zwicken zu Ihrem Code-Snippet 'if (ch1.Value == null) ch1.Value = false; ! ch1.Value = (bool) ch1.Value; ' statt ' Schalter (ch1.Value.ToString()) { Fall "True": ch1.Value = false; Unterbrechung; Fall "False": ch1.Value = true; Unterbrechung; } ' eine kompakte Version ' if (ch1.Value == null) ch1.Value = false; ch1.Value =! (Bool) ch1.Value; ' –

3

Ich habe lange gebraucht, um herauszufinden, wie man das macht, ohne alle Datensätze durchlaufen zu müssen. Ich habe eine gebundene Datagridview-Quelle, und alle Felder sind mit Ausnahme der Checkbox-Spalte gebunden. Also brauche/brauche ich keine Schleife, um jede Zeile hinzuzufügen, und ich wollte keine einzige für diesen Zweck erstellen. Nach einer Menge Versuche habe ich es endlich verstanden. Und es ist auch sehr einfach:

Zuerst fügen Sie Ihrem Projekt eine neue CS-Datei mit einer benutzerdefinierten Checkbox-Zelle, z.

DataGridViewCheckboxCellFilter.cs:

using System.Windows.Forms; 

namespace MyNamespace { 
    public class DataGridViewCheckboxCellFilter : DataGridViewCheckBoxCell { 
     public DataGridViewCheckboxCellFilter() : base() { 
      this.FalseValue = 0; 
      this.TrueValue = 1; 
      this.Value = TrueValue; 
     } 
    } 
} 

Danach, auf dem Gridview, wo Sie die Checkbox-Spalte hinzufügen, die Sie tun:

// add checkboxes 
DataGridViewCheckBoxColumn col_chkbox = new DataGridViewCheckBoxColumn(); 
{ 
    col_chkbox.HeaderText = "X"; 
    col_chkbox.Name = "checked"; 
    col_chkbox.CellTemplate = new DataGridViewCheckboxCellFilter();     
} 
this.Columns.Add(col_chkbox); 

Und das ist es! Jedes Mal, wenn Ihre Kontrollkästchen in einer neuen Zeile hinzugefügt werden, werden sie auf "Wahr" gesetzt. Genießen Sie!

+0

Ich mag diese Implementierung am besten. Scheint wie die schnellste Leistung. Sie müssen keine Schleifen durchführen. –

+0

Dies ist die Antwort auf die Frage. Vielen Dank. – EllieK

4

Hier ist ein Einzeiler Antwort auf diese Frage

List<DataGridViewRow> list = DataGridView1.Rows.Cast<DataGridViewRow>().Where(k => Convert.ToBoolean(k.Cells[CheckBoxColumn1.Name].Value) == true).ToList(); 
+0

+1 genau das, was ich suchte Rob, Danke. Hinweis: Ich bekam eine DBNUll-Ausnahme für das Objekt nicht gesetzt, also habe ich Ihren Code folgendermaßen geändert: '// finde die ausgewählten Zeilen - in einer Zeile von Lamba-Güte - ohne verzögerte Ausführung! Liste selectedSeriesCodes = gridSeriesList.Rows.Cast () .Wobei (g =>! String.IsNullOrEmpty (g.Cells ["Ausgewählt"]. Value.ToString()) && Convert.ToBoolean (g.Cells ["Ausgewählt"]. Value) == true) .ToList(); ' –

+0

ich sehe, aber in meinem funktioniert es, Ihr Willkommen Kumpel. – Rob

1

Wenn Sie ein gridview mehr als eine Checkbox enthält .... Sie dies versuchen sollte ....

Object[] o=new Object[6]; 

for (int i = 0; i < dgverlist.RowCount; i++) 
{ 
    for (int j = 2; j < dgverlist.ColumnCount; j++) 
    { 
     DataGridViewCheckBoxCell ch1 = new DataGridViewCheckBoxCell(); 
     ch1 = (DataGridViewCheckBoxCell)dgverlist.Rows[i].Cells[j]; 

     if (ch1.Value != null) 
     { 
      o[i] = ch1.OwningColumn.HeaderText.ToString(); 

      MessageBox.Show(o[i].ToString()); 
     } 
    } 
} 
3

Wenn Sie versuchen, es auf CellContentClick Ereignis

Verwendung:

dataGridView1.EndEdit(); //Stop editing of cell. 
MessageBox.Show("0 = " + dataGridView1.Rows[e.RowIndex].Cells[0].Value.ToString()); 
0

Um zu testen, ob die Spalte aktiviert ist oder nicht:

for (int i = 0; i < dgvName.Rows.Count; i++) 
{ 
    if ((bool)dgvName.Rows[i].Cells[8].Value) 
    { 
    // Column is checked 
    } 
} 
1

1) Wie kann ich machen so dass die ganze Spalte standardmäßig "markiert" ist?

2) Wie kann ich sicherstellen, dass ich nur Werte aus den "geprüften" Zeilen erhalte?

foreach (DataGridViewRow row in dataGridView1.Rows) 
{ 
    if (row.IsNewRow) continue;//If editing is enabled, skip the new row 

    //The Cell's Value gets it wrong with the true default, it will return   
    //false until the cell changes so use FormattedValue instead. 
    if (Convert.ToBoolean(row.Cells["IncludeDog"].FormattedValue)) 
    { 
     //Do stuff with row 
    } 
} 
0

wenn u diese Spalte in SQL-Datenbank (bit) als Datentyp machen sollte u so much diesen Code

DataGridViewCheckBoxColumn doWork = new DataGridViewCheckBoxColumn(); 
      doWork.HeaderText = "Include Dog"; 
      doWork.FalseValue = "0"; 
      doWork.TrueValue = "1"; 
      dataGridView1.Columns.Insert(0, doWork); 

mit diesem

DataGridViewCheckBoxColumn doWork = new DataGridViewCheckBoxColumn(); 
      doWork.HeaderText = "Include Dog"; 
      doWork.FalseValue = "False"; 
      doWork.TrueValue = "True"; 
      dataGridView1.Columns.Insert(0, doWork); 
Verwandte Themen