Столбец флажка DataGridView - значение и функциональность - PullRequest
16 голосов
/ 06 августа 2009

Я добавил столбец флажка в 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);

Так что дальше? Любая помощь будет принята с благодарностью!

Ответы [ 10 ]

37 голосов
/ 06 августа 2009
  1. Нет способа сделать это напрямую. Когда у вас есть данные в сетке, вы можете циклически проходить по строкам и ставить отметки в каждом поле следующим образом:

    foreach (DataGridViewRow row in dataGridView1.Rows)
    {
        row.Cells[CheckBoxColumn1.Name].Value = true;
    }
    
  2. Событие 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
    }
    
14 голосов
/ 29 августа 2010
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());
}

лучшее решение, чтобы найти, установлен ли флажок в сетке данных.

4 голосов
/ 24 января 2012

Вот один ответ на этот вопрос

List<DataGridViewRow> list = DataGridView1.Rows.Cast<DataGridViewRow>().Where(k => Convert.ToBoolean(k.Cells[CheckBoxColumn1.Name].Value) == true).ToList();
3 голосов
/ 03 октября 2012

Если вы попробуете на CellContentClick Событие

Использование:

dataGridView1.EndEdit();  //Stop editing of cell.
MessageBox.Show("0 = " + dataGridView1.Rows[e.RowIndex].Cells[0].Value.ToString());
3 голосов
/ 23 мая 2011

Мне потребовалось много времени, чтобы понять, как это сделать, не просматривая все записи. У меня есть связанный 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. Наслаждайтесь!

1 голос
/ 16 февраля 2012

Если у вас есть сетка, содержащая более одного флажка .... ты должен попробовать это ....

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());
        }
    }
}
0 голосов
/ 30 июня 2019

Это довольно просто

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;
 }
0 голосов
/ 02 июня 2016

если вы сделаете этот столбец в базе данных 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);
0 голосов
/ 30 октября 2014

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
    }
}
0 голосов
/ 12 января 2013

Чтобы проверить, установлен столбец или нет:

for (int i = 0; i < dgvName.Rows.Count; i++)
{
    if ((bool)dgvName.Rows[i].Cells[8].Value)
    {
    // Column is checked
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...