I have a gridview on a aspx page with pagination enabled.
This gridview contains some data fields from a database and a check-box for each row.
I started out wondering whether the check-box option will be remembered if I rebind the datasource before looping through all the rows, but quickly determined that even going from one page to the next page then back again the check-box option is lost.
To persist the check box checked status I have tried a custom implementation in this tutorial: http://aspalliance.com/774_Maintaining_State_of_CheckBoxes_While_Paging_in_a_GridView_Control.all
I want to count the number of checkboxes which are checked on my asp.net page and if the count = 5 then to change the button state from disabled to enabled, but when I change page in Gridview are not counted the selected rows of the grid in previous page.
My code it's below.
I would greatly appreciate any help you can give me in working this problem.
private void RememberOldValues()
{
ArrayList categoryIDList = new ArrayList();
int index = -1;
foreach (GridViewRow row in GridView1.Rows)
{
index = (int)GridView1.DataKeys[row.RowIndex].Value;
bool result = ((CheckBox)row.FindControl("chkSelect")).Checked;
if (Session["CHECKED_ITEMS"] != null)
categoryIDList = (ArrayList)Session["CHECKED_ITEMS"];
if (result)
{
if (!categoryIDList.Contains(index))
categoryIDList.Add(index);
}
else
categoryIDList.Remove(index);
}
if (categoryIDList != null && categoryIDList.Count > 0)
Session["CHECKED_ITEMS"] = categoryIDList;
}
private void RePopulateValues()
{
ArrayList categoryIDList = (ArrayList)Session["CHECKED_ITEMS"];
if (categoryIDList != null && categoryIDList.Count > 0)
{
foreach (GridViewRow row in GridView1.Rows)
{
int index = (int)GridView1.DataKeys[row.RowIndex].Value;
if (categoryIDList.Contains(index))
{
CheckBox myCheckBox = (CheckBox)row.FindControl("chkSelect");
myCheckBox.Checked = true;
}
}
}
}
protected void GridView1_PageIndexChanging(object sender, GridViewPageEventArgs e)
{
RememberOldValues();
GridViewBind();
GridView1.DataSource = dset.Tables[0];
GridView1.PageIndex = e.NewPageIndex;
GridView1.DataBind();
RePopulateValues();
}
protected void CheckBox1_CheckedChanged(object sender, EventArgs e)
{
CheckBox chkTest = (CheckBox)sender;
GridViewRow grdRow = (GridViewRow)chkTest.NamingContainer;
int count = 0;
foreach (GridViewRow row in GridView1.Rows)
{
CheckBox chk = (CheckBox)row.FindControl("chkSelect");
if (chk.Checked)
{
count++;
grdRow.BackColor = System.Drawing.Color.Yellow;
}
}
if (count == 5)
{
btnUpdate.Enabled = true;
btnUpdate.CssClass = "enabledImageButton";
}
else
{
btnUpdate.Enabled = false;
btnUpdate.CssClass = "disabledImageButton";
}
}
Declare a private property to read arralist from session, to avoid calling it again and again.
ArrayList SelectedCategories
{
get
{
ArrayList categoryIDList;
if (Session["CHECKED_ITEMS"] != null)
categoryIDList = (ArrayList)Session["CHECKED_ITEMS"];
else
{
categoryIDList = new ArrayList();
Session["CHECKED_ITEMS"] = categoryIDList;
}
return categoryIDList;
}
}
Then in your Checkbox changed event you can change the code to access the stored selection array list.
protected void CheckBox1_CheckedChanged(object sender, EventArgs e)
{
CheckBox chkTest = (CheckBox)sender;
GridViewRow grdRow = (GridViewRow)chkTest.NamingContainer;
int index = (int)GridView1.DataKeys[grdRow.RowIndex].Value;
if (chkTest.Checked)
{
if (!SelectedCategories.Contains(index))
SelectedCategories.Add(index);
grdRow.BackColor = System.Drawing.Color.Yellow;
}
else
{
if (SelectedCategories.Contains(index))
SelectedCategories.Remove(index);
grdRow.BackColor = System.Drawing.Color.White;
}
if (SelectedCategories.Count >= 5)
{
btnUpdate.Enabled = true;
btnUpdate.CssClass = "enabledImageButton";
}
else
{
btnUpdate.Enabled = false;
btnUpdate.CssClass = "disabledImageButton";
}
}
Related
So i wanna delete/remove selected datagridview after i pass to another datagridview
private void BtnRight_Click(object sender, EventArgs e)
{
foreach(DataGridViewRow item in dgAvailabe.Rows)
{
DataGridViewCheckBoxCell chkchecking = item.Cells[0] as DataGridViewCheckBoxCell;
if (Convert.ToBoolean(chkchecking.Value) == true)
{
int n = dgSelected.Rows.Add();
dgSelected.Rows[n].Cells[0].Value = item.Cells[1].Value.ToString();
dgSelected.Rows[n].Cells[1].Value = item.Cells[2].Value.ToString();
dgSelected.Rows[n].Cells[2].Value = item.Cells[3].Value.ToString();
dgSelected.Rows[n].Cells[3].Value = item.Cells[4].Value.ToString();
dgSelected.Rows[n].Cells[4].Value = item.Cells[5].Value.ToString();
}
}
}
I have a datagridview fill with data from database. The first column is a checkboxcolumn (data for this column retrieved from database is type BIT) and I want the user only check one. If the user select other one, the first one have to be unchecked.
I have seen a lot of code and none works.
What I could do?
Is a Winforms C# app with SQL SERVER.
private void dataGridView_CellValueChanged(object sender, DataGridViewCellEventArgs e)
{
// Whatever index is your checkbox column
var columnIndex = 0;
if (e.ColumnIndex == columnIndex)
{
// If the user checked this box, then uncheck all the other rows
var isChecked = (bool)dataGridView.Rows[e.RowIndex].Cells[e.ColumnIndex].Value;
if (isChecked)
{
foreach (DataGridViewRow row in dataGridView.Rows)
{
if (row.Index != e.RowIndex)
{
row.Cells[columnIndex].Value = !isChecked;
}
}
}
}
}
Subscribe to CellContentClick and add dataGridView.EndEdit() for much better user experience (cell doesn't have to lose the focus for event to be fired):
private void ChangeCheckedStateOfOtherCheckboxesInDgv(object sender, DataGridViewCellEventArgs e)
{
const int chkBoxColumnIndex = 0;
var dataGridView = (DataGridView)sender;
if (e.ColumnIndex == chkBoxColumnIndex)
{
dataGridView.EndEdit();
var isChecked = (bool)dataGridView[e.ColumnIndex, e.RowIndex].Value;
if (isChecked)
{
foreach (DataGridViewRow row in dataGridView.Rows)
{
if (row.Index != e.RowIndex)
row.Cells[chkBoxColumnIndex].Value = !isChecked;
}
}
}
}
VB net version
Private Sub dataGridView_CellValueChanged(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DG_SubSyncs.CellValueChanged
Dim columnIndex As Integer = 0
If (e.ColumnIndex = columnIndex) Then
'If the user checked this box, then uncheck all the other rows
Dim isChecked As Boolean = CBool(DG_SubSyncs.Rows(e.RowIndex).Cells(e.ColumnIndex).Value)
If (isChecked) Then
For Each row In DG_SubSyncs.Rows
If (row.Index <> e.RowIndex) Then
row.Cells(columnIndex).Value = Not isChecked
End If
Next
End If
End If
End Sub
Here is a slightly cleaned-up version. My checkbox column is dynamically added and always the last column in the grid, but you get the idea:
private void ProfilesGrid_CellContentClick(object sender, [NotNull] DataGridViewCellEventArgs e)
{
DataGridView dataGridView = (DataGridView)sender;
int columnCount = dataGridView.Columns.GetColumnCount(DataGridViewElementStates.None) - 1;
if (e.ColumnIndex != columnCount)
{
return;
}
dataGridView.EndEdit();
if (!(bool) dataGridView[e.ColumnIndex, e.RowIndex].Value)
{
return;
}
foreach (DataGridViewRow row in dataGridView.Rows.Cast<DataGridViewRow>().Where(row => row.Index != e.RowIndex))
{
row.Cells[columnCount].Value = false;
}
}
private void DataGridView_CellClick(object sender, DataGridViewCellEventArgs e)
{
//Check to ensure that the row CheckBox is clicked.
if (e.RowIndex >= 0 && e.ColumnIndex == 0)
{
//Loop and uncheck all other CheckBoxes.
foreach (DataGridViewRow row in dataGridView1.Rows)
{
if (row.Index == e.RowIndex)
{
row.Cells["checkBoxColumn"].Value = !Convert.ToBoolean(row.Cells["checkBoxColumn"].EditedFormattedValue);
}
else
{
row.Cells["checkBoxColumn"].Value = false;
}
}
}
}
Here is my answer based on data manipulation.
You need a datagridview named DataGridView1 in the form and nothing else.
DataTable dt;
private void Form1_Load(object sender, EventArgs e)
{
dt = CreateDataTablePeople("People");
BindingSource bs = new BindingSource();
bs.DataSource = dt;
dataGridView1.DataSource = bs;
dt.ColumnChanging += Dt_ColumnChanging ;
}
private void Dt_ColumnChanging(object sender, DataColumnChangeEventArgs e)
{
if (e.Column.ColumnName == "Abilitato")
{
bool b = Convert.ToBoolean(e.ProposedValue);
if (!b)
{
e.ProposedValue = true;
return;
}
dt.ColumnChanging -= Dt_ColumnChanging;
for (int i = dt.Rows.Count - 1; i >= 0; i--)
{
if (dt.Rows[i]["Id"] != e.Row["Id"])
{
dt.Rows[i]["Abilitato"] = false;
dt.Rows[i].EndEdit();
}
}
dt.ColumnChanging += Dt_ColumnChanging;
}
}
private DataTable CreateDataTablePeople(string TableName)
{
using (DataTable dt = new DataTable(TableName))
{
dt.Columns.Add("ID", typeof(int));
dt.Columns.Add("Name", typeof(string));
dt.Columns.Add("Abilitato", typeof(bool));
dt.LoadDataRow(new object[] { 1, "Frank", false }, true);
dt.LoadDataRow(new object[] { 2, "Michael", false}, true);
dt.LoadDataRow(new object[] { 3, "Paul", false }, true);
return dt;
}
}
private void dataGridView1_CurrentCellDirtyStateChanged(object sender, EventArgs e)
{
DataGridViewDataErrorContexts ec = DataGridViewDataErrorContexts.Commit;
DataGridView dg = (DataGridView)sender;
bool b = dg.CommitEdit(ec);
}
To handle dataGridView_CellValueChanged event we must trigger dataGridView_CellContentClick event (which does not have checkboxes current state) will call CommitEdit. This will trigger dataGridView_CellValueChanged event where we can write our logic to check/uncheck checkboxes.
private void dataGridView_CellContentClick(object sender,
DataGridViewCellEventArgs e)
{
dataGridView.CommitEdit(DataGridViewDataErrorContexts.Commit);
}
/// <summary>
/// This will be fired by CellContentClick event from above
/// </summary>
private void dataGridView_CellValueChanged(object sender,
DataGridViewCellEventArgs e)
{
//0 is checkbox column index
var columnIndex = 0;
if (e.ColumnIndex == columnIndex )
{
var isChecked = (bool)dataGridView.Rows[e.RowIndex].Cells[e.ColumnIndex].Value;
if (isChecked)
{
foreach (DataGridViewRow row in dataGridView.Rows)
{
if (row.Index != e.RowIndex)
{
row.Cells[columnIndex].Value = !isChecked;
}
}
}
}
}
//Bind the events in the form designer
this.dataGridView.CellContentClick += new DataGridViewCellEventHandler(this.dataGridView_CellContentClick);
this.dataGridView.CellValueChanged += new DataGridViewCellEventHandler(this.dataGridView_CellValueChanged);
You have to set the VirtualMode setting to TRUE on the DGV to allow only one checkbox.
I am trying to do the check box in the header will respond to any of checked or unchecked checkbox in the grid view rows. But, the check box header only respond when I check or uncheck the last checkbox in the gridview (The check box header will be checked if all of the checkbox in the gridview is checked and vice versa).
How can I solve not only last checkbox header which will respond to the last checkbox in the gridview, but every checkbox in the gridview?
Here is the code that I am using:
protected void checkAll_CheckedChanged(object sender, EventArgs e)
{
CheckBox ChkBoxHeader = (CheckBox)GridView1.HeaderRow.FindControl("checkAll");
foreach (GridViewRow row in GridView1.Rows)
{
CheckBox ChkBoxRows = (CheckBox)row.FindControl("chkbx_select");
if (ChkBoxHeader.Checked && ChkBoxRows.Enabled)
{
ChkBoxRows.Checked = true;
}
else if (!ChkBoxHeader.Checked)
{
ChkBoxRows.Checked = false;
}
}
}
protected void chkbx_select_CheckedChanged(object sender, EventArgs e)
{
CheckBox ChkBoxHeader = (CheckBox)GridView1.HeaderRow.FindControl("checkAll");
bool isAllChecked = false;
foreach (GridViewRow row in GridView1.Rows)
{
CheckBox checkBox = (CheckBox)row.FindControl("chkbx_select");
if (!checkBox.Checked && checkBox.Enabled)
{
isAllChecked = false;
}
else if (checkBox.Checked)
{
isAllChecked = true;
}
}
ChkBoxHeader.Checked = isAllChecked;
}
Your answer much appreciated.
Thank you.
Try this code.
If you check header checkbox.
protected void checkAll_CheckedChanged(object sender, EventArgs e)
{
CheckBox ChkBoxHeader = (CheckBox)GridView1.HeaderRow.FindControl("checkAll");
foreach (GridViewRow row in GridView1.Rows)
{
CheckBox ChkBoxRows = (CheckBox)row.FindControl("chkbx_select");
if (ChkBoxRows!=null)
{
if(ChkBoxHeader.Checked)
ChkBoxRows.Checked = true;
else
ChkBoxRows.Checked = false;
}
}
}
When you check single checkbox.
protected void chkbx_select_CheckedChanged(object sender, EventArgs e)
{
CheckBox ChkBoxHeader = (CheckBox)GridView1.HeaderRow.FindControl("checkAll");
bool isAllChecked = false;
foreach (GridViewRow row in GridView1.Rows)
{
CheckBox ChkBoxRows = (CheckBox)row.FindControl("chkbx_select");
if (!(ChkBoxRows.Checked && ChkBoxRows.Enabled))
{
isAllChecked = true;
}
}
if (!isAllChecked)
{
ChkBoxHeader.Checked = true;
}
}
Let me know if it works.
For checking Individual Check Box
protected void chkselect_CheckedChanged(object sender, EventArgs e)
{
try
{
int count = 0;
CheckBox checkall = (CheckBox)GridView1.HeaderRow.FindControl("mainchkselect");
foreach(GridViewRow gvrow in GridView1.Rows)
{
CheckBox chkindividual = (CheckBox)gvrow.FindControl("chkselect");
if (chkindividual.Checked)
count++;
//your logic
}
if (count == GridView1.Rows.Count )
{
checkall.Checked = true;
}
else
{
checkall.Checked = false;
}
}
catch (Exception ex)
{
ClientLogger.ClientErrorLogger(ex.Message);
}
}
For Checking Select All Check Box
protected void mainchkselect_CheckedChanged(object sender, EventArgs e)
{
try
{
CheckBox checkall = (CheckBox)GridView1.HeaderRow.FindControl("mainchkselect");
foreach(GridViewRow gvrrow in GridView1.Rows)
{
CheckBox chkindividual = (CheckBox)gvrrow.FindControl("chkselect");
if(checkall.Checked ==true)
{
chkindividual.Checked = true;
}
else
{
chkindividual.Checked = false;
}
}
}
catch(Exception ex)
{
ClientLogger.ClientErrorLogger(ex.Message);
}
}
I want to count the number of checkboxes which are checked on my asp.net page and if the count = 5 then to change the button state from disabled to enabled.
I don't understand because when I clear the check in one checkbox ( from 5 checkboxes checked to 4 checkboxes checked ) the button state is enabled and not change state in disabled.
My code below.
I would greatly appreciate any help you can give me in working this problem.
protected void CheckBox1_CheckedChanged(object sender, EventArgs e)
{
CheckBox chkTest = (CheckBox)sender;
GridViewRow grdRow = (GridViewRow)chkTest.NamingContainer;
int count = 0;
if (chkTest.Checked)
{
foreach (GridViewRow row in GridView1.Rows)
{
CheckBox chk = (CheckBox)row.FindControl("chkSelect");
count++;
if (chk.Checked && count == 5)
{
btnUpdate.Enabled = true;
btnUpdate.CssClass = "enabledImageButton";
}
}
}
}
EDIT 1
Page_Load code:
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
GridViewBind();
}
}
Check the count after the loop and it should work as expected:
protected void CheckBox1_CheckedChanged(object sender, EventArgs e)
{
CheckBox chkTest = (CheckBox)sender;
GridViewRow grdRow = (GridViewRow)chkTest.NamingContainer;
int count = 0;
foreach (GridViewRow row in GridView1.Rows)
{
CheckBox chk = (CheckBox)row.FindControl("chkSelect");
if (chk.Checked)
{
count++;
}
}
if(count==5)
{
btnUpdate.Enabled = true;
btnUpdate.CssClass = "enabledImageButton";
}
else
{
btnUpdate.Enabled = false;
btnUpdate.CssClass = "disabledImageButton";
}
}
If you un-check then it will not go in this
if (chkTest.Checked)
{
when you remove check then you need to do calculation also.
You dont have code to disable the button. Try the following code
protected void CheckBox1_CheckedChanged(object sender, EventArgs e)
{
CheckBox chkTest = (CheckBox)sender;
GridViewRow grdRow = (GridViewRow)chkTest.NamingContainer;
int count = 0;
btnUpdate.Enabled = false;
foreach (GridViewRow row in GridView1.Rows)
{
CheckBox chk = (CheckBox)row.FindControl("chkSelect");
if (chk.Checked)
{
count++;
if(count >=5)
{
btnUpdate.Enabled = true;
btnUpdate.CssClass = "enabledImageButton";
break;
}
}
}
}
You are counting the number of checkboxes with you count, not the number of checked checkboxes
As such you code is always going to 'fire' if the 5th checkbox is checked, irrespective of the checkstates of the previous 4.
Looks like you want:
foreach (GridViewRow row in GridView1.Rows)
{
CheckBox chk = (CheckBox)row.FindControl("chkSelect");
if (chk.Checked) count++;
if (count >= 5)
{
btnUpdate.Enabled = true;
btnUpdate.CssClass = "enabledImageButton";
break; //Avoid hitting more rows than necessary
}
}
this means that you will only Enable if at least 5 are checked, as other posters have said you have nothing to disable it so it will stay enabled.
Can someone help me why it doesn't work?
I have a checkbox and if I click on it,
this should uncheck all the checkbox inside the datagridview which were checked before including the user selected checkbox.
Here is the code:
private void chkItems_CheckedChanged(object sender, EventArgs e)
{
foreach (DataGridViewRow row in datagridview1.Rows)
{
DataGridViewCheckBoxCell chk = (DataGridViewCheckBoxCell)row.Cells[1];
if (chk.Selected == true)
{
chk.Selected = false;
}
else
{
chk.Selected = true;
}
}
}
the checkbox should not be selected. it should be checked.
here is the added column
DataGridViewCheckBoxColumn CheckboxColumn = new DataGridViewCheckBoxColumn();
CheckBox chk = new CheckBox();
CheckboxColumn.Width = 20;
datagridview1.Columns.Add(CheckboxColumn);
Looking at this MSDN Forum Posting it suggests comparing the Cell's value with Cell.TrueValue.
So going by its example your code should looks something like this:(this is completely untested)
Edit: it seems that the Default for Cell.TrueValue for an Unbound DataGridViewCheckBox is null you will need to set it in the Column definition.
private void chkItems_CheckedChanged(object sender, EventArgs e)
{
foreach (DataGridViewRow row in dataGridView1.Rows)
{
DataGridViewCheckBoxCell chk = (DataGridViewCheckBoxCell)row.Cells[1];
if (chk.Value == chk.TrueValue)
{
chk.Value = chk.FalseValue;
}
else
{
chk.Value = chk.TrueValue;
}
}
}
This code is working note setting the TrueValue and FalseValue in the Constructor plus also checking for null:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
DataGridViewCheckBoxColumn CheckboxColumn = new DataGridViewCheckBoxColumn();
CheckboxColumn.TrueValue = true;
CheckboxColumn.FalseValue = false;
CheckboxColumn.Width = 100;
dataGridView1.Columns.Add(CheckboxColumn);
dataGridView1.Rows.Add(4);
}
private void chkItems_CheckedChanged(object sender, EventArgs e)
{
foreach (DataGridViewRow row in dataGridView1.Rows)
{
DataGridViewCheckBoxCell chk = (DataGridViewCheckBoxCell)row.Cells[0];
if (chk.Value == chk.FalseValue || chk.Value == null)
{
chk.Value = chk.TrueValue;
}
else
{
chk.Value = chk.FalseValue;
}
}
dataGridView1.EndEdit();
}
}
I was making my own version of a Checkbox to control a DataGridViewCheckBoxColumn when I saw this post wasn't actually answered. To set the checked state of a DataGridViewCheckBoxCell use:
foreach (DataGridViewRow row in dataGridView1.Rows)
{
dataGridView1.Rows[row.Index].SetValues(true);
}
For anyone else trying to accomplish the same thing, here is what I came up with.
This makes the two controls behave like the checkbox column in Gmail. It keeps functionality for both mouse and keyboard.
using System;
using System.Windows.Forms;
namespace Check_UnCheck_All
{
public partial class Check_UnCheck_All : Form
{
public Check_UnCheck_All()
{
InitializeComponent();
dataGridView1.RowCount = 10;
dataGridView1.AllowUserToAddRows = false;
this.dataGridView1.CellContentClick += new System.Windows.Forms.DataGridViewCellEventHandler(this.dgvApps_CellContentClick);
this.dataGridView1.CellMouseUp += new System.Windows.Forms.DataGridViewCellMouseEventHandler(this.myDataGrid_OnCellMouseUp);
this.dataGridView1.CellValueChanged += new System.Windows.Forms.DataGridViewCellEventHandler(this.myDataGrid_OnCellValueChanged);
this.checkBox1.Click += new System.EventHandler(this.checkBox1_Click);
}
public int chkInt = 0;
public bool chked = false;
public void myDataGrid_OnCellValueChanged(object sender, DataGridViewCellEventArgs e)
{
if (e.ColumnIndex == dataGridView1.Rows[0].Index && e.RowIndex != -1)
{
DataGridViewCheckBoxCell chk = dataGridView1.Rows[e.RowIndex].Cells[0] as DataGridViewCheckBoxCell;
if (Convert.ToBoolean(chk.Value) == true) chkInt++;
if (Convert.ToBoolean(chk.Value) == false) chkInt--;
if (chkInt < dataGridView1.Rows.Count && chkInt > 0)
{
checkBox1.CheckState = CheckState.Indeterminate;
chked = true;
}
else if (chkInt == 0)
{
checkBox1.CheckState = CheckState.Unchecked;
chked = false;
}
else if (chkInt == dataGridView1.Rows.Count)
{
checkBox1.CheckState = CheckState.Checked;
chked = true;
}
}
}
public void myDataGrid_OnCellMouseUp(object sender, DataGridViewCellMouseEventArgs e)
{
// End of edition on each click on column of checkbox
if (e.ColumnIndex == dataGridView1.Rows[0].Index && e.RowIndex != -1)
{
dataGridView1.EndEdit();
}
dataGridView1.BeginEdit(true);
}
public void dgvApps_CellContentClick(object sender, DataGridViewCellEventArgs e)
{
if (dataGridView1.CurrentCell.GetType() == typeof(DataGridViewCheckBoxCell))
{
if (dataGridView1.CurrentCell.IsInEditMode)
{
if (dataGridView1.IsCurrentCellDirty)
{
dataGridView1.EndEdit();
}
}
dataGridView1.BeginEdit(true);
}
}
public void checkBox1_Click(object sender, EventArgs e)
{
if (chked == true)
{
foreach (DataGridViewRow row in dataGridView1.Rows)
{
DataGridViewCheckBoxCell chk = (DataGridViewCheckBoxCell)row.Cells[0];
if (chk.Value == chk.TrueValue)
{
chk.Value = chk.FalseValue;
}
else
{
chk.Value = chk.TrueValue;
}
}
chked = false;
chkInt = 0;
return;
}
if (chked == false)
{
foreach (DataGridViewRow row in dataGridView1.Rows)
{
dataGridView1.Rows[row.Index].SetValues(true);
}
chked = true;
chkInt = dataGridView1.Rows.Count;
}
}
}
}
Simple code for you it will work
private void dgv_CellClick(object sender, DataGridViewCellEventArgs e)
{
if (dgv.CurrentRow.Cells["ColumnNumber"].Value != null && (bool)dgv.CurrentRow.Cells["ColumnNumber"].Value)
{
dgv.CurrentRow.Cells["ColumnNumber"].Value = false;
dgv.CurrentRow.Cells["ColumnNumber"].Value = null;
}
else if (dgv.CurrentRow.Cells["ColumnNumber"].Value == null )
{
dgv.CurrentRow.Cells["ColumnNumber"].Value = true;
}
}
The code you are trying here will flip the states (if true then became false vice versa) of the checkboxes irrespective of the user selected checkbox because here the foreach is selecting each checkbox and performing the operations.
To make it clear, store the index of the user selected checkbox before performing the foreach operation and after the foreach operation call the checkbox by mentioning the stored index and check it (In your case, make it True -- I think).
This is just logic and I am damn sure it is correct. I will try to implement some sample code if possible.
Modify your foreach something like this:
//Store the index of the selected checkbox here as Integer (you can use e.RowIndex or e.ColumnIndex for it).
private void chkItems_CheckedChanged(object sender, EventArgs e)
{
foreach (DataGridViewRow row in datagridview1.Rows)
{
DataGridViewCheckBoxCell chk = (DataGridViewCheckBoxCell)row.Cells[1];
if (chk.Selected == true)
{
chk.Selected = false;
}
else
{
chk.Selected = true;
}
}
}
//write the function for checking(making true) the user selected checkbox by calling the stored Index
The above function makes all the checkboxes true including the user selected CheckBox. I think this is what you want..
You can use this code on your grid CellClick event for check or unchecked cell checkbox :
private void Grid_CellClick(object sender, DataGridViewCellEventArgs e)
{
if (e.ColumnIndex == 0)
{
Grid.Rows[e.RowIndex].Cells[e.ColumnIndex].Value = (Grid.Rows[e.RowIndex].Cells[e.ColumnIndex].Value == null ? true : (!(bool)Grid.Rows[e.RowIndex].Cells[e.ColumnIndex].Value));
}
}
Try the below code it should work
private void checkBox2_CheckedChanged(object sender, EventArgs e)
{
if (checkBox2.Checked == false)
{
foreach (DataGridViewRow row in dGV1.Rows)
{
DataGridViewCheckBoxCell chk = (DataGridViewCheckBoxCell)row.Cells[0];
chk.Value = chk.TrueValue;
}
}
else if (checkBox2.Checked == true)
{
foreach (DataGridViewRow row in dGV1.Rows)
{
DataGridViewCheckBoxCell chk = (DataGridViewCheckBoxCell)row.Cells[0];
chk.Value = 1;
if (row.IsNewRow)
{
chk.Value = 0;
}
}
}
}
While all the other answers are correct, I'll add another simple option which worked for me:
var r = dataGridView.Rows[rIndex];
var c = r.Cells[cIndex];
var value = (bool) c.Value;
c.Value = !value;
Compressed:
var r = dataGridView.Rows[rIndex];
r.Cells[cIndex].Value = !((bool) r.Cells[cIndex].Value)
As long as cIndex refers to a cell that is of type DataGridViewCheckBoxCell, this will work fine. Hope this helps somone.
you can try this code:
DataGridViewCheckBoxCell chk = (DataGridViewCheckBoxCell)dataGridView1.CurrentRow.Cells[0];
dataGridView1.BeginEdit(true);
if (chk.Value == null || (int)chk.Value == 0)
{
chk.Value = 1;
}
else
{
chk.Value = 0;
}
dataGridView1.EndEdit();
Below Code is working perfect
Select / Deselect a check box column on data grid by using checkbox CONTROL
private void checkBox2_CheckedChanged(object sender, EventArgs e)
{
if (checkBox2.Checked == false)
{
foreach (DataGridViewRow row in dGV1.Rows)
{
DataGridViewCheckBoxCell chk = (DataGridViewCheckBoxCell)row.Cells[0];
chk.Value = chk.TrueValue;
}
}
else if(checkBox2.Checked==true)
{
foreach (DataGridViewRow row in dGV1.Rows)
{
DataGridViewCheckBoxCell chk = (DataGridViewCheckBoxCell)row.Cells[0];
chk.Value = 1;
if (row.IsNewRow)
{
chk.Value = 0;
}
}
}
}
// here is a simple way to do so
//irate through the gridview
foreach (DataGridViewRow row in PifGrid.Rows)
{
//store the cell (which is checkbox cell) in an object
DataGridViewCheckBoxCell oCell = row.Cells["Check"] as DataGridViewCheckBoxCell;
//check if the checkbox is checked or not
bool bChecked = (null != oCell && null != oCell.Value && true == (bool)oCell.Value);
//if its checked then uncheck it other wise check it
if (!bChecked)
{
row.Cells["Check"].Value = true;
}
else
{
row.Cells["Check"].Value = false;
}
}
I had the same problem, and even with the solutions provided here it did not work. The checkboxes would simply not change, their Value would remain null. It took me ages to realize my dumbness:
Turns out, I called the form1.PopulateDataGridView(my data) on the Form derived class Form1 before I called form1.Show(). When I changed up the order, that is to call Show() first, and then read the data and fill in the checkboxes, the value did not stay null.
The code bellow allows the user to un-/check the checkboxes in the DataGridView, if the Cells are created in code
private void gvData_CellClick(object sender, DataGridViewCellEventArgs e)
{
DataGridViewCheckBoxCell chk = (DataGridViewCheckBoxCell)gvData.Rows[e.RowIndex].Cells[0];
if (chk.Value == chk.TrueValue)
{
gvData.Rows[e.RowIndex].Cells[0].Value = chk.FalseValue;
}
else
{
gvData.Rows[e.RowIndex].Cells[0].Value = chk.TrueValue;
}
}
Here is another example you can try
private void dataGridView_CellContentClick(object sender, DataGridViewCellEventArgs e)
{
if (e.ColumnIndex == dataGridView.Columns["Select"].Index)
{
dataGridView.EndEdit();
if ((bool)dataGridView.Rows[e.RowIndex].Cells["Select"].Value)
{
//-- checking current select, needs to uncheck any other cells that are checked
foreach(DataGridViewRow row in dataGridView.Rows)
{
if (row.Index == e.RowIndex)
{
dataGridView.Rows[row.Index].SetValues(true);
}
else
{
dataGridView.Rows[row.Index].SetValues(false);
}
}
}
}
}
All of the casting causes errors, nothing here I tried worked, so I fiddled around and got this to work.
foreach (DataGridViewRow row in dataGridView1.Rows)
{
if (row.Cells[0].Value != null && (bool)row.Cells[0].Value)
{
Console.WriteLine(row.Cells[0].Value);
}
}
I use the CellMouseUp event.
I check for the proper column
if (e.ColumnIndex == datagridview.Columns["columncheckbox"].Index)
I set the actual cell to a DataGridViewCheckBoxCell
dgvChkBxCell = datagridview.Rows[e.RowIndex].Cells[e.ColumnIndex] as DataGridViewCheckBoxCell;
Then check to see if it's checked using EditingCellFormattedValue
if ((bool)dgvChkBxCell.EditingCellFormattedValue) { }
You will have to check for keyboard entry using the KeyUp event and check the .value property and also check that the CurrentCell's column index matches the checkbox column. The method does not provide e.RowIndex or e.ColumnIndex.
that worked for me after clearing selection, BeginEdit and change the girdview rows and end the Edit Mode.
if (dgvDetails.RowCount > 0)
{
dgvDetails.ClearSelection();
dgvDetails.BeginEdit(true);
foreach (DataGridViewRow dgvr in dgvDetails.Rows)
{
dgvr.Cells["cellName"].Value = true;
}
dgvDetails.EndEdit();
}
This is how I did it.
private void Grid_CellClick(object sender, DataGridViewCellEventArgs e)
{
if(Convert.ToBoolean(this.Grid.Rows[e.RowIndex].Cells["Selected"].Value) == false)
{
this.Grid.Rows[e.RowIndex].Cells["Selected"].Value = true;
}
else
{
this.productSpecGrid.Rows[e.RowIndex].Cells["Selected"].Value = false;
}
}