Установите/снимите флажок в окне datagridview
Может кто-нибудь помочь мне, почему это не работает?
У меня есть checkbox
, и если я нажму на него,
это должно снять флажок в пределах datagridview, которые были проверены, прежде чем включать выбранный пользователем флажок.
Вот код:
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;
}
}
}
флажок не следует выбирать. он должен быть проверен.
здесь добавлен столбец
DataGridViewCheckBoxColumn CheckboxColumn = new DataGridViewCheckBoxColumn();
CheckBox chk = new CheckBox();
CheckboxColumn.Width = 20;
datagridview1.Columns.Add(CheckboxColumn);
Ответы
Ответ 1
Глядя на эту публикацию форума MSDN, предлагается сравнить значение ячейки с Cell.TrueValue.
Итак, по его примеру ваш код должен выглядеть примерно так: (это полностью не проверено)
Изменить: кажется, что значение по умолчанию для Cell.TrueValue для несвязанного DataGridViewCheckBox равно null, вам нужно будет установить его в определении столбца.
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;
}
}
}
Этот код представляет собой рабочую ноту, устанавливающую TrueValue и FalseValue в конструкторе, а также проверку нулевого значения:
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();
}
}
Ответ 2
Я делал свою собственную версию флажка для управления DataGridViewCheckBoxColumn, когда я видел, что на этот пост не ответил. Чтобы установить проверенное состояние DataGridViewCheckBoxCell, используйте:
foreach (DataGridViewRow row in dataGridView1.Rows)
{
dataGridView1.Rows[row.Index].SetValues(true);
}
Для других, кто пытается выполнить одно и то же, вот что я придумал.
Это приводит к тому, что два элемента управления ведут себя как столбец флажка в Gmail. Он сохраняет функциональность как для мыши, так и для клавиатуры.
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;
}
}
}
}
Ответ 3
Код, который вы пытаетесь здесь, будет переворачивать состояния (если true, а затем стал false наоборот) флажков независимо от выбранного пользователем флажка, потому что здесь foreach
выбор каждого checkbox
и выполнение операций.
Чтобы сделать это, сохраните index
флажка выбранного пользователем перед выполнением операции foreach
, а после операции foreach
установите флажок, указав сохраненный индекс и проверьте его. (В вашем случае сделайте это True
- я думаю).
Это просто логика, и я чертовски уверен, что это правильно. Я постараюсь реализовать примерный код, если это возможно.
Измените foreach
что-то вроде этого:
//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
Вышеуказанная функция делает все флажки истинными, включая выбранный пользователем CheckBox. Я думаю, это то, что вы хотите.
Ответ 4
Простой код для вас он будет работать
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;
}
}
Ответ 5
Ниже код работает отлично
Выберите/Снимите флажок в столбце на панели данных с помощью флажка 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;
}
}
}
}
Ответ 6
Попробуйте приведенный ниже код, который должен работать
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;
}
}
}
}
Ответ 7
Вы можете использовать этот код в сетке события CellClick для проверки или снятия флажка ячейки:
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));
}
}
Ответ 8
Пока все остальные ответы верны, я добавлю еще один простой вариант, который работал у меня:
var r = dataGridView.Rows[rIndex];
var c = r.Cells[cIndex];
var value = (bool) c.Value;
c.Value = !value;
Сжатый:
var r = dataGridView.Rows[rIndex];
r.Cells[cIndex].Value = !((bool) r.Cells[cIndex].Value)
Пока cIndex
относится к ячейке, имеющей тип DataGridViewCheckBoxCell
, это будет работать нормально. Надеюсь, это поможет кому-то.
Ответ 9
вы можете попробовать этот код:
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();
Ответ 10
// 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;
}
}
Ответ 11
У меня была такая же проблема, и даже с предлагаемыми здесь решениями это не сработало. Флажки будут просто не меняться, их значение останется нулевым. Мне потребовались годы, чтобы понять мою немощь:
Оказывается, я назвал form1.PopulateDataGridView(my data)
в производном классе Form Form1 до того, как я назвал form1.Show()
. Когда я изменил порядок, то есть сначала вызовет Show()
, а затем прочитал данные и установил флажки, значение не оставалось равным нулю.
Ответ 12
Ниже приведенный ниже код позволяет пользователю отключить/установить флажки в DataGridView, если ячейки создаются в коде
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;
}
}
Ответ 13
Вот еще один пример, который вы можете попробовать
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);
}
}
}
}
}
Ответ 14
Все приведения приводят к ошибкам, ничего из того, что я здесь пробовал, не сработало, поэтому я возился и заставил это работать.
foreach (DataGridViewRow row in dataGridView1.Rows)
{
if (row.Cells[0].Value != null && (bool)row.Cells[0].Value)
{
Console.WriteLine(row.Cells[0].Value);
}
}
Ответ 15
Я использую событие CellMouseUp. Я проверяю правильность столбца
if (e.ColumnIndex == datagridview.Columns["columncheckbox"].Index)
Я установил фактическую ячейку в DataGridViewCheckBoxCell
dgvChkBxCell = datagridview.Rows[e.RowIndex].Cells[e.ColumnIndex] as DataGridViewCheckBoxCell;
Затем проверьте, проверено ли это с помощью EditingCellFormattedValue
if ((bool)dgvChkBxCell.EditingCellFormattedValue) { }
Вам нужно будет проверить ввод с клавиатуры с помощью события KeyUp и проверить свойство .value, а также убедиться, что индекс столбца CurrentCell соответствует столбцу флажка. Метод не предоставляет e.RowIndex или e.ColumnIndex.