Столбец флажка DataGridView - значение и функциональность
Я добавил столбец флажка в DataGridView в моей форме C#. Функция должна быть динамичной - вы выбираете клиента, который отображает все его позиции, которые могут быть обслужены, и вы выбираете, какой из них вы хотите обслужить в этот раз.
В любом случае, код теперь добавит chckbox в начало DGV. Что мне нужно знать, это следующее:
1) Как мне сделать так, чтобы весь столбец "проверялся" по умолчанию? 2) Как я могу убедиться, что я получаю значения только из "проверенных" строк, когда нажимаю кнопку чуть ниже DGV?
Вот код для вставки столбца:
DataGridViewCheckBoxColumn doWork = new DataGridViewCheckBoxColumn();
doWork.HeaderText = "Include Dog";
doWork.FalseValue = "0";
doWork.TrueValue = "1";
dataGridView1.Columns.Insert(0, doWork);
Так, что дальше? Любая помощь будет принята с благодарностью!
9 ответов
Нет способа сделать это напрямую. Как только у вас есть данные в сетке, вы можете циклически проходить по строкам и проверять каждый флажок следующим образом:
foreach (DataGridViewRow row in dataGridView1.Rows) { row.Cells[CheckBoxColumn1.Name].Value = true; }
Событие Click может выглядеть примерно так:
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 }
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());
}
Лучшее решение, чтобы найти, если флажок в datagridview установлен или нет.
Мне потребовалось много времени, чтобы понять, как это сделать, не просматривая все записи. У меня есть связанный datagridview-source, и все поля связаны, кроме флажка-столбца. Таким образом, у меня нет / нужен цикл для добавления каждой строки, и я не хотел создавать один только для этой цели. Так что после долгих попыток я наконец-то понял. И на самом деле это тоже очень просто:
Сначала вы добавляете новый.cs-файл в ваш проект с ячейкой для пользовательского флажка, например
DataGridViewCheckboxCellFilter.cs:
using System.Windows.Forms;
namespace MyNamespace {
public class DataGridViewCheckboxCellFilter : DataGridViewCheckBoxCell {
public DataGridViewCheckboxCellFilter() : base() {
this.FalseValue = 0;
this.TrueValue = 1;
this.Value = TrueValue;
}
}
}
После этого в вашем GridView, куда вы добавляете флажок-столбец, вы делаете:
// 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);
И это все! Каждый раз, когда ваши флажки добавляются в новую строку, они будут установлены в true. Наслаждайтесь!
Если вы попробуете это на CellContentClick
Событие
Использование:
dataGridView1.EndEdit(); //Stop editing of cell.
MessageBox.Show("0 = " + dataGridView1.Rows[e.RowIndex].Cells[0].Value.ToString());
Вот один ответ на этот вопрос
List<DataGridViewRow> list = DataGridView1.Rows.Cast<DataGridViewRow>().Where(k => Convert.ToBoolean(k.Cells[CheckBoxColumn1.Name].Value) == true).ToList();
Если у вас есть сетка, содержащая более одного флажка.... вы должны попробовать это....
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());
}
}
}
1) Как мне сделать так, чтобы весь столбец "проверялся" по умолчанию?
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) Как я могу убедиться, что я получаю значения только из "проверенных" строк?
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
}
}
Если вы делаете этот столбец в базе данных SQL (бит) в качестве типа данных, вы должны редактировать этот код
DataGridViewCheckBoxColumn doWork = new DataGridViewCheckBoxColumn();
doWork.HeaderText = "Include Dog";
doWork.FalseValue = "0";
doWork.TrueValue = "1";
dataGridView1.Columns.Insert(0, doWork);
с этим
DataGridViewCheckBoxColumn doWork = new DataGridViewCheckBoxColumn();
doWork.HeaderText = "Include Dog";
doWork.FalseValue = "False";
doWork.TrueValue = "True";
dataGridView1.Columns.Insert(0, doWork);
Это довольно просто
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;
}
Если ваш столбец уже создан из-за привязки с набором записей типа BIT, тип столбца будет в любом случае текстовым. Решение, которое я нашел, состоит в том, чтобы удалить этот столбец и заменить его "DataGridViewCheckBoxColumn", имеющим те же данные привязки.
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);
Чтобы проверить, проверен ли столбец или нет:
for (int i = 0; i < dgvName.Rows.Count; i++)
{
if ((bool)dgvName.Rows[i].Cells[8].Value)
{
// Column is checked
}
}