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;
}
}
Related
I am trying to implement excel like feature in DataGridView. So:
if they select column header it would select the column
if the user selects row header then entire row would be selected
Apart from this if they select cell, only that single cell would be selected.
To so so, for the third requirement I made the SelectionMode as CellSelect. For a column selection I selected all the cells in a column , but when I tried to print SelectedColumns, it printed as zero. It seems I have to select the column headers also. I don't know how to select column header programmatically. The required code is below. Can anybody tell me how to achieve this?
private void dataGridViewFileData_CellMouseUp(object sender, DataGridViewCellMouseEventArgs e)
{
dataGridViewFileData.MultiSelect = true;
dataGridViewFileData.SelectionMode = DataGridViewSelectionMode.CellSelect;
for (int i = 0; i < dataGridViewFileData.Rows.Count; ++i)
dataGridViewFileData.Rows[i].Cells[0].Selected = true;
MessageBox.Show("Selected columns:" + dataGridViewFileData.SelectedColumns.Count.ToString());
}
As an option you can set the SelectionMode to CellSelect, then handle the CellClick and regarding to the row index and column index of the clicked cell and select the cell, or full row or full column or all cells using code.
Since the selection mode is CellSelect, selected columns or selected rows are empty and if for any reason you want to track selected column or selected row, you need to track it manually.
The same for visual feedback about the selection, you need to set back color of the headers or paint them yourself. For example:
private async void Form1_Load(object sender, EventArgs e)
{
dataGridView1.ColumnCount = 3;
dataGridView1.RowCount = 3;
dataGridView1.SelectionMode = DataGridViewSelectionMode.CellSelect;
dataGridView1.CellClick += DataGridView1_CellClick;
dataGridView1.EnableHeadersVisualStyles = false;
}
DataGridViewColumn selectedColumn = null;
DataGridViewRow selectedRow = null;
List<DataGridViewCell> selectedCells = null;
private void DataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
{
dataGridView1.ClearSelection();
if (selectedColumn != null)
selectedColumn.HeaderCell.Style.BackColor =
dataGridView1.ColumnHeadersDefaultCellStyle.BackColor;
if (selectedRow != null)
selectedRow.HeaderCell.Style.BackColor =
dataGridView1.RowHeadersDefaultCellStyle.BackColor;
selectedColumn = null;
selectedRow = null;
selectedCells = null;
if (e.ColumnIndex == -1 && e.RowIndex == -1)
{
dataGridView1.SelectAll();
selectedCells = new List<DataGridViewCell>();
foreach (DataGridViewRow row in dataGridView1.Rows)
selectedCells.AddRange(row.Cells.Cast<DataGridViewCell>());
}
else if (e.ColumnIndex == -1 && e.RowIndex > -1)
{
selectedRow = dataGridView1.Rows[e.RowIndex];
foreach (DataGridViewCell cell in dataGridView1.Rows[e.RowIndex].Cells)
cell.Selected = true;
}
else if (e.ColumnIndex > -1 && e.RowIndex == -1)
{
selectedColumn = dataGridView1.Columns[e.ColumnIndex];
foreach (DataGridViewRow row in dataGridView1.Rows)
row.Cells[e.ColumnIndex].Selected = true;
}
else
{
selectedCells = selectedCells = new List<DataGridViewCell>()
{ dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex] };
dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Selected = true;
}
if (selectedColumn != null)
selectedColumn.HeaderCell.Style.BackColor = SystemColors.Highlight;
if (selectedRow != null)
selectedRow.HeaderCell.Style.BackColor = SystemColors.Highlight;
}
As another option you can handle OnCellMouseDown event and depending to the clicked cell, decide to set SelectionMode. This way, you can get the visual feedback as well as SelectedColumns and SelectedRows:
private void Form1_Load(object sender, EventArgs e)
{
dataGridView1.ColumnCount = 3;
dataGridView1.RowCount = 3;
foreach (DataGridViewColumn c in dataGridView1.Columns)
c.SortMode = DataGridViewColumnSortMode.NotSortable;
dataGridView1.CellMouseDown += DataGridView1_CellMouseDown;
}
private void DataGridView1_CellMouseDown(object sender, DataGridViewCellMouseEventArgs e)
{
dataGridView1.ClearSelection();
if (e.ColumnIndex == -1 && e.RowIndex == -1)
{
dataGridView1.SelectionMode = DataGridViewSelectionMode.ColumnHeaderSelect;
dataGridView1.SelectAll();
}
else if (e.ColumnIndex == -1 && e.RowIndex > -1)
{
dataGridView1.SelectionMode = DataGridViewSelectionMode.RowHeaderSelect;
dataGridView1.Rows[e.RowIndex].Selected = true;
}
else if (e.ColumnIndex > -1 && e.RowIndex == -1)
{
dataGridView1.SelectionMode = DataGridViewSelectionMode.ColumnHeaderSelect;
dataGridView1.Columns[e.ColumnIndex].Selected = true;
}
else
{
dataGridView1.SelectionMode = DataGridViewSelectionMode.CellSelect;
dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Selected = true;
}
}
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 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";
}
}
I have a datagridview that has some textboxtype columns and one checkboxtype column. CheckBoxColumn bind with a bool type property.
I want that if checkbox is checked it see in the grid else not as shown in figure.
I have added some code in databinding complete but it is giving compile time error "Property or indexer 'System.Windows.Forms.DataGridViewCell.Visible' cannot be assigned to -- it is read only"
private void dgvleftEdit_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
{
var reportLogoList = cWShowInvoicePaymentDetailsBindingSource.List as IList<CWShowInvoicePaymentDetails>;
foreach (DataGridViewRow row in dgvleftEdit.Rows)
{
var objReport = row.DataBoundItem as CWShowInvoicePaymentDetails;
var findItem = from f in reportLogoList
//where f.fReportID == objReport.fKey
select f;
if (objReport.IsImage == false)
{
this.dgvleftEdit.Rows[row.Index].Cells[7].Visible = false;
}
else
{
this.dgvleftEdit.Rows[row.Index].Cells[7].Visible = true;
}
}
}
Is it possible to hide a particular cell in datagridview?
I think this is what you want, if not leave some comment for why:
//CellPainting event handler for your dataGridView1
private void dataGridView1_CellPainting(object sender, DataGridViewCellPaintingEventArgs e) {
if (e.ColumnIndex > -1 && e.RowIndex > -1 && dataGridView1.Columns[e.ColumnIndex] is DataGridViewCheckBoxColumn){
if (e.Value == null || !(bool)e.Value) {
e.PaintBackground(e.CellBounds, false);
e.Handled = true;
}
}
}
//CellBeginEdit event handler for your dataGridView1
private void dataGridView1_CellBeginEdit(object sender, DataGridViewCellCancelEventArgs e){
if (dataGridView1.Columns[e.ColumnIndex] is DataGridViewCheckBoxColumn){
object cellValue = dataGridView1[e.ColumnIndex, e.RowIndex].Value;
e.Cancel = cellValue == null || !(bool)cellValue;
}
}
Change your DataGridVIewCheckBoxColumn to DataGridViewImageColumn
Then in handler of datagridview.CellFormatting:
private void datagridview_CellFormatting(object sender,
dataGridViewCellFormattingEventArgs e)
{
if (e.RowIndex >= 0 && dataGridView1.Columns[e.ColumnIndex] is DataGridViewImageColumn)
{
if (e.Value != null && (bool)e.Value == true)
{
e.Value = My.Resources.yourCheckedImage;
}
else
{
e.Value = null;
}
}
}
Then cell updating can handle with MouseDown handler or some other handler of Click, Enter ..etc.
private void datagridview_MouseDown(Object sender, MouseEventArgs e)
{
DataGridView dgv = (DataGridView)sender;
DataGridView.HitTestInfo click = dgv.HitTest(e.Location.X, e.Location.Y);
//If your have predefined columns, then maybe better compare by Column.name
if(click.RowIndex >= 0 && dgv.Columns(click.ColumnIndex) is DataGridViewImageColumn)
{
DataGridViewCell cellTmp = dgv.Row(click.RowIndex).Cells(click.ColumnIndex);
if (cellTmp.Value == null)
{
cellTmp.Value = My.Resources.yourCheckedImage;
}
else
{
cellTmp.Value = null;
}
}
}