2009-08-06 46 views
17

He agregado una columna de casilla de verificación a un DataGridView en mi formulario C#. La función debe ser dinámica: selecciona un cliente y muestra todos los elementos a los que podría dar servicio, y esta vez, seleccione cuál de ellos desea que se le dé servicio.Columna de casilla de verificación DataGridView - valor y funcionalidad

De todos modos, el código ahora agregará un chckbox al principio de la DGV. Lo que necesito saber es lo siguiente:

1) ¿Cómo lo hago para que toda la columna esté "marcada" por defecto? 2) ¿Cómo puedo asegurarme de que solo obtengo valores de las filas "marcadas" cuando hago clic en un botón justo debajo del DGV?

Aquí está el código para obtener la columna insertada:

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

Entonces, ¿qué sigue? ¡Cualquier ayuda sería muy apreciada!

Respuesta

36
  1. No hay forma de hacerlo directamente. Una vez que tenga sus datos en la red, puede recorrer las filas y comprobar cada caja como esta:

    foreach (DataGridViewRow row in dataGridView1.Rows) 
    { 
        row.Cells[CheckBoxColumn1.Name].Value = true; 
    } 
    
  2. El evento Click podría ser algo como esto:

    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

Gracias tanto! Eso es realmente útil, pero solo una cosa ... cuando llegue a ese punto, para obtener la información de las filas marcadas, ¿cómo obtendría la información de una celda específica (por ejemplo, el valor de celda en la columna 2 de todas las celdas marcadas) Además ... parece que realmente sabes tus cosas para C#, ¿algún libro que puedas recomendar? Gracias. –

+0

En realidad, no importa, he encontrado una manera de hacerlo. ¡De nuevo, gracias por tu ayuda! –

+1

Me alegra que lo haya descubierto. En cuanto a un libro para recomendar, no puedo decir que conozco alguno para aprender C#. Utilizo mucho el sitio web msdn (http://msdn.microsoft.com/en-us/library/ms229335.aspx) para buscar métodos/propiedades/descripciones/ejemplos/etc., así que diría que probablemente sea el mejor referencia, oh an SO también;) – 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()); 
} 

mejor solución para encontrar si la casilla de verificación en la vista de tabla de datos está marcada o no.

+0

¡Gracias, funciona genial! Para controlar el evento solo cuando la celda tiene la casilla de verificación: '// .... DataGridView dgv = (DataGridView) remitente; if (dgv.CurrentCell.GetType()! = Typeof (DataGridViewCheckBoxCell)) { return; } // ... ' – illagrenan

+0

Gracias por la gran respuesta! –

+1

gracias @Nazeer solo un pequeño ajuste a su fragmento de código 'if (ch1.Value == null) ch1.Value = false; ! ch1.Value = (int) ch1.Value; ' lugar ' interruptor (ch1.Value.ToString()) { caso "verdadera": ch1.Value = false; descanso; caso "Falso": ch1.Value = true; descanso; } ' una versión compacta ' if (ch1.Value == null) ch1.Value = false; ch1.Value =! (Bool) ch1.Value; ' –

3

me llevó mucho tiempo encontrar la manera de hacerlo sin tener que recorrer todos los registros. Tengo una datagridview-source enlazada, y todos los campos están vinculados, excepto la casilla de verificación-columna. Así que no tengo/necesito un ciclo para agregar cada fila y no quería crear uno solo para este propósito. Entonces, después de intentarlo, finalmente lo conseguí. Y en realidad también es muy simple:

Primero añades un nuevo archivo .cs a tu proyecto con una casilla personalizada, p.

DataGridViewCheckboxCellFilter.cs:

using System.Windows.Forms; 

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

Después de esto, en su GridView, donde se agrega la casilla de la columna, que hacen:

// 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); 

Y eso es todo! Cada vez que sus casillas de verificación se agreguen en una nueva fila, se establecerán en verdadero. ¡Disfrútalo!

+0

Me gusta mejor esta implementación. Parece ser el rendimiento más rápido. No tienes que hacer ningún bucle. –

+0

Esta es la respuesta a la pregunta. Gracias. – EllieK

4

Aquí es una respuesta un trazador de líneas para esta pregunta

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

+1 justo lo que estaba buscando Rob, gracias. Nota: Obtenía una excepción Object not set DBNUll, así que cambié tu código a este: '// encuentra las filas seleccionadas, en una línea de bondad Lamba, ¡sin ejecución diferida! Lista selectedSeriesCodes = gridSeriesList.Rows.Cast (). Where (g =>! String.IsNullOrEmpty (g.Cells ["Selected"]. Value.ToString()) && Convert.ToBoolean (g.Cells ["Selected"]. Value) == verdadero) .ToList(); ' –

+0

veo pero en el mío funciona, su amigo bienvenido. – Rob

1

Si usted tiene un gridview que contiene más de una casilla de verificación .... deberías probar este ....

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

Si lo pruebas CellContentClick Evento

Uso:

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

Para probar si se comprueba la columna o no:

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

1) ¿Cómo hago de modo que toda la columna esté "marcada" por defecto?

var doWork = new DataGridViewCheckBoxColumn(); 
doWork.Name = "IncludeDog" //Added so you can find the column in a row 
doWork.HeaderText = "Include Dog"; 
doWork.FalseValue = "0"; 
doWork.TrueValue = "1"; 

//Make the default checked 
doWork.CellTemplate.Value = true; 
doWork.CellTemplate.Style.NullValue = true; 

dataGridView1.Columns.Insert(0, doWork); 

2) ¿Cómo puedo asegurarme de que solo obtengo valores de las filas "marcadas"?

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

si u hacer esta columna en la base de datos SQL (bits) como un tipo de datos u debe editar el código

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

con este

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