19

I've added a checkbox column to a DataGridView in my C# form. The function needs to be dynamic - you select a customer and that brings up all of their items that could be serviced, and you select which of them you wish to be serviced this time around.

Anyway, the code will now add a chckbox to the beginning of the DGV. What I need to know is the following:

1) How do I make it so that the whole column is "checked" by default? 2) How can I make sure I'm only getting values from the "checked" rows when I click on a button just below the DGV?

Here's the code to get the column inserted:

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

So what next? Any help would be greatly appreciated!

Community
  • 1
  • 1
David Archer
  • 1,154
  • 6
  • 18
  • 34

11 Answers11

42
  1. There is no way to do that directly. Once you have your data in the grid, you can loop through the rows and check each box like this:

    foreach (DataGridViewRow row in dataGridView1.Rows)
    {
        row.Cells[CheckBoxColumn1.Name].Value = true;
    }
    
  2. The Click event might look something like this:

    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
    }
    
slavoo
  • 5,798
  • 64
  • 37
  • 39
SwDevMan81
  • 48,814
  • 22
  • 151
  • 184
  • 1
    Thanks so much! That's really useful, but just one thing... when I get to that point, to get the information from the checked rows, how would I get the information from a specific cell (e.g. the cell value in column 2 of all checked cells) Also... you really seem to know your stuff for C#, any books you can recommend? Thanks. – David Archer Aug 06 '09 at 12:47
  • Actually, never mind that, I've found a way to do it. Thanks again for your help! – David Archer Aug 06 '09 at 13:15
  • 1
    Glad you found it out. As for a book to recommend, I can't say that I know of any for learning C#. I do use the msdn (http://msdn.microsoft.com/en-us/library/ms229335.aspx) website a lot for looking up methods/properties/descriptions/examples/etc, so I would say thats probably the best reference, oh an SO too ;) – SwDevMan81 Aug 07 '09 at 11:28
  • if you click the check box 2,3 times consecutively, it gives exception could not convert `Checked` to bool. Initially it shows value as true then it changes it to checked. – PUG Aug 29 '12 at 17:17
  • What does that `== true` in `if`? – galaxy001 Apr 03 '20 at 21:03
15
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());
}

best solution to find if the checkbox in the datagridview is checked or not.

Kate Gregory
  • 18,808
  • 8
  • 56
  • 85
Nazeer
  • 151
  • 1
  • 2
  • Thanks, works great! To handle event only when cell has checkbox: `// .... DataGridView dgv = (DataGridView)sender; if (dgv.CurrentCell.GetType() != typeof(DataGridViewCheckBoxCell)) { return; } // ...` – illagrenan Apr 17 '12 at 20:40
  • 1
    thanks @Nazeer just a little tweak to your code snippet `if (ch1.Value == null) ch1.Value = false; ch1.Value = !(bool)ch1.Value;` instead `switch (ch1.Value.ToString()) { case "True": ch1.Value = false; break; case "False": ch1.Value = true; break; }` a compact version `if (ch1.Value == null) ch1.Value = false; ch1.Value = !(bool)ch1.Value;` – Abbas Palash Mar 19 '15 at 09:13
5

it took me a long time to figure out how to do this without having to loop through all the records. I have a bound datagridview-source, and all fields are bound except for the checkbox-column. So I don't have/need a loop to add each row and I didn't want to create one just for this purpuse. So after a lot of trying I finally got it. And it's actually very simple too:

First you add a new .cs File to your project with a custom-checkbox cell, e.g.

DataGridViewCheckboxCellFilter.cs:

using System.Windows.Forms;

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

After this, on your GridView, where you add the checkbox-column, you do:

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

And that's it! Everytime your checkboxes get added in a new row, they'll be set to true. Enjoy!

andzep
  • 1,877
  • 24
  • 35
3

If you try it on CellContentClick Event

Use:

dataGridView1.EndEdit();  //Stop editing of cell.
MessageBox.Show("0 = " + dataGridView1.Rows[e.RowIndex].Cells[0].Value.ToString());
Marko
  • 20,385
  • 13
  • 48
  • 64
Atul Jain
  • 31
  • 1
3

Here's a one liner answer for this question

List<DataGridViewRow> list = DataGridView1.Rows.Cast<DataGridViewRow>().Where(k => Convert.ToBoolean(k.Cells[CheckBoxColumn1.Name].Value) == true).ToList();
Rob
  • 638
  • 3
  • 14
  • 34
  • +1 just what I was looking for Rob, Thanks. Note: I was getting a Object not set DBNUll exception, so I changed your code to this: '//find the selected rows - in one line of Lamba goodness - without Deferred Execution! List selectedSeriesCodes = gridSeriesList.Rows.Cast().Where(g => !string.IsNullOrEmpty(g.Cells["Selected"].Value.ToString()) && Convert.ToBoolean(g.Cells["Selected"].Value) == true).ToList();' – Jeremy Thompson Mar 09 '12 at 03:16
1

1) How do I make it so that the whole column is "checked" by default?

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) How can I make sure I'm only getting values from the "checked" rows?

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
    }
}
1

If you have a gridview containing more than one checkbox .... you should try this ....

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());
        }
    }
}
Stephen
  • 1,737
  • 2
  • 26
  • 37
0

To test if the column is checked or not:

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

if u make this column in sql database (bit) as a data type u should edit this code

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

with this

DataGridViewCheckBoxColumn doWork = new DataGridViewCheckBoxColumn();
doWork.HeaderText = "Include Dog";
doWork.FalseValue = "False";
doWork.TrueValue = "True";
dataGridView1.Columns.Insert(0, doWork);
Ahmed Soliman
  • 416
  • 5
  • 11
0

It is quite simple

DataGridViewCheckBoxCell checkedCell = (DataGridViewCheckBoxCell) grdData.Rows[e.RowIndex].Cells["grdChkEnable"];
    
bool isEnabled = false;
if (checkedCell.AccessibilityObject.State.HasFlag(AccessibleStates.Checked))
{
    isEnabled = true;
}
if (isEnabled)
{
   // do your business process;
}
Osama Rizwan
  • 615
  • 1
  • 7
  • 19
0

If your column has been already created due to binding with a recordset of BIT type, the type of the column will be text anyway. The solution I have found is to remove that column and replace it with a DataGridViewCheckBoxColumn having the same binding data.

DataGridViewColumn oldCol = dgViewCategory.Columns["mycolumn"];
int chkIdx = oldCol.Index;
DataGridViewCheckBoxColumn chkCol = new DataGridViewCheckBoxColumn();
chkCol.HeaderText = oldCol.HeaderText;
chkCol.FalseValue = "False";
chkCol.TrueValue = "True";
chkCol.DataPropertyName = oldCol.DataPropertyName;
chkCol.Name = oldCol.Name;
dgViewCategory.Columns.RemoveAt(chkIdx);
dgViewCategory.Columns.Insert(chkIdx, chkCol);
user2991288
  • 361
  • 2
  • 5