Datagridview Checkbox Column - Value and Functionality

DataGridView checkbox column - value and functionality

  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
    }

C# Efficient way to check datagridview checkbox column for checked values

If you don't want to iterate all rows, then use temporary list of checked rows.

Then after button was clicked use values from that List

HashSet<DataGridViewRow> _CheckedRows = new HashSet<DataGridViewRow>();

private void DataGridView_CellEndEdit(object sender, DataGridViewCellEventArgs e)
{
if (DataGridView.Columns[e.ColumnIndex].Name.Equals(CheckBoxColumn1.Name) == false)
return;

DataGridViewRow row = DataGridView.Rows[e.RowIndex];
if (Convert.ToBoolean(row.Cells[CheckBoxColumn1.Name].Value) == true)
{
_CheckedRows.Add(row);
}
else
{
_CheckedRows.Remove(row);
}
}

Get value of checkbox in Datagridview?

I am doing something really similar in a project of mine,
I am only using OnCellValueChanged instead of CellContentClick.

Here's my working line of code

bool completed = Convert.ToBoolean(dgv.Rows[e.RowIndex].Cells[1].Value.ToString());

What is exactly your error? Did you try to see what .Value was in the debugger ?

CheckBox value in DataGridView is always true

I found the way to do it!
Used the CellContentClick Event and then with the EditedFormattedValue attribute, the bool value is REAL this time.

 private void compGridView_CellContentClick(object sender, DataGridViewCellEventArgs e)
{
if (e.ColumnIndex == 0)
{
if ((bool)compGridView.Rows[e.RowIndex].Cells[0].EditedFormattedValue)
{
ComputersList.Add(compGridView.Rows[e.RowIndex].Cells[1].Value.ToString());
}
else
{
ComputersList.Remove(compGridView.Rows[e.RowIndex].Cells[1].Value.ToString());
}
}
}

Thank you

EDIT:
Figured out why in the first place I had that issue, That's even a little bit funny. I had an event that when closing the form, the value of every checkbox turns into TRUE!

 private void ComputerSelection_FormClosed(object sender, FormClosedEventArgs e)
{
for(int i = 0; i < compGridView.Rows.Count; i++)
{
compGridView.Rows[i].Cells[0].Value = true;
}
}

Displaying Checked column Values in Datagridview checkbox showing data in another form Datagridview

For simplicity, let's assume the form names based on your Load method handles match accordingly:

Form1.Load += Customized_column_Load;
Form2.Load += PBX_Logger_Load;

I have also assumed that you are opening the second form from the Form1 as follows:

Form2 form2 = new Form2();
form2.ShowDialog();

As such, the second form just needs access to the first form's grid values. If you pass in that DataGridView into the Form2 constructor, then Form2 can save it into a variable and recall it during load time - where the rows can be looped through and the size and visibility values are accessed and used on the second form's DataGridView:

private DataGridView parentDGV;

public Form2(DataGridView parentDGV)
{
InitializeComponent();
this.parentDGV = parentDGV;
}

private void PBX_Logger_Load(object sender, EventArgs e)
{
dataGridView1.AllowUserToAddRows = false;

// Your code to fill the DataSource.

foreach (DataGridViewRow row in parentDGV.Rows)
{
string colName = row.Cells["Column"].Value.ToString();
int size = 0;
int.TryParse(row.Cells["Column size"].Value.ToString(), out size);

dataGridView1.Columns[colName].Width = size;
dataGridView1.Columns[colName].Visible = row.Cells["Chk"].Value != null && (bool)row.Cells["Chk"].Value;
}
}

Lastly, in Form1, change your call accordingly:

Form2 form2 = new Form2(dataGridView1);
form2.ShowDialog();

This also assumes the following is set in Form1 too:

dataGridView1.AllowUserToAddRows = false;

Otherwise you'll need to add some null checks when looping through the rows inside Form2.

C# Datagridvew checkbox value

Its a bit odd calling the cell boolean. And then using its FormattedValue property. I added a DataGridView to a Form, added two columns Text and Checkbox. CheckBox is a DataGridViewCheckBoxColumn. Then I added a button and this should give you the idea:

private void button1_Click(object sender, EventArgs e)
{
dgv.AutoGenerateColumns = false;
DataTable dt = new DataTable();
dt.Columns.Add("Text");
dt.Columns.Add("CheckBox");
for (int i = 0; i < 3; i++)
{
DataRow dr = dt.NewRow();
dr[0] = i.ToString();
dt.Rows.Add(dr);
}
dgv.DataSource = dt;
}

private void dgv_CellEndEdit(object sender, DataGridViewCellEventArgs e)
{
foreach (DataGridViewRow row in dgv.Rows)
{
var oCell = row.Cells[1] as DataGridViewCheckBoxCell;
bool bChecked = (null != oCell && null != oCell.Value && true == (bool)oCell.Value);
}
}

DataGridView CheckBox column doesn't apply changes to the underlying bound object

As it stands currently, when this box is checked it doesn't seem to
change the value of Helped bool in the corresponding Record.

The changes which you make on a cell of DataGridView, doesn't commit immediately to the data source until you finish editing the cell, then changes will be pushed to data source. If for any reason you want to push changes sooner, you can call:

dataGridView1.CommitEdit(DataGridViewDataErrorContexts.Commit);

For example you can do that in CellContentClick event of your DataGridView to push check box value to the underlying property of data source.



Related Topics



Leave a reply



Submit