【问题标题】:DataGridView checkbox column - value and functionalityDataGridView 复选框列 - 值和功能
【发布时间】:2010-11-17 07:02:16
【问题描述】:

我在我的 C# 表单中的 DataGridView 中添加了一个复选框列。该功能需要是动态的 - 您选择一个客户,并显示他们所有可以服务的项目,然后您选择这次您希望为哪些项目提供服务。

无论如何,代码现在将在 DGV 的开头添加一个 chckbox。我需要知道的是:

1) 如何使整列默认“选中”? 2) 当我点击 DGV 正下方的按钮时,如何确保仅从“选中”行中获取值?

这是插入列的代码:

DataGridViewCheckBoxColumn doWork = new DataGridViewCheckBoxColumn();
            doWork.HeaderText = "Include Dog";
            doWork.FalseValue = "0";
            doWork.TrueValue = "1";
            dataGridView1.Columns.Insert(0, doWork);

那么接下来呢? 任何帮助将不胜感激!

【问题讨论】:

    标签: c# winforms datagridview checkbox


    【解决方案1】:
    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
      }
      

    【讨论】:

    • 非常感谢!这真的很有用,但只有一件事......当我到达那一点时,要从选中的行中获取信息,我将如何从特定的单元格中获取信息(例如,所有选中的单元格的第 2 列中的单元格值)另外......你似乎真的很了解你的 C# 知识,有什么书可以推荐吗?谢谢。
    • 其实,没关系,我已经找到了一种方法。再次感谢您的帮助!
    • 很高兴你发现了它。至于推荐一本书,我不能说我知道任何学习C#的书。我确实经常使用 msdn (msdn.microsoft.com/en-us/library/ms229335.aspx) 网站来查找方法/属性/描述/示例/等,所以我想说那可能是最好的参考,哦,也是这样;)
    • 如果连续单击复选框 2,3 次,则会出现异常无法将 Checked 转换为布尔值。最初它显示值为 true,然后将其更改为选中。
    • == true 中的 if 是什么意思?
    【解决方案2】:
    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 dgv = (DataGridView)sender; if (dgv.CurrentCell.GetType() != typeof(DataGridViewCheckBoxCell)) { return; } // ...
    • 感谢您的精彩回答!
    • 感谢 @Nazeer 只是对您的代码稍作调整 sn-p if (ch1.Value == null) ch1.Value = false; ch1.Value = !(bool)ch1.Value; 而不是 switch (ch1.Value.ToString()) { case "True": ch1.Value = false; break; case "False": ch1.Value = true; break; } 精简版 if (ch1.Value == null) ch1.Value = false; ch1.Value = !(bool)ch1.Value;
    【解决方案3】:

    我花了很长时间才弄清楚如何做到这一点,而不必遍历所有记录。我有一个绑定的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。 享受吧!

    【讨论】:

    • 我最喜欢这个实现。似乎是最快的性能明智。你不必做任何循环。
    • 这是问题的答案。谢谢。
    【解决方案4】:

    这是这个问题的唯一答案

    List<DataGridViewRow> list = DataGridView1.Rows.Cast<DataGridViewRow>().Where(k => Convert.ToBoolean(k.Cells[CheckBoxColumn1.Name].Value) == true).ToList();
    

    【讨论】:

    • +1 正是我要找的 Rob,谢谢。注意:我得到了一个 Object not set DBNUll 异常,所以我将您的代码更改为:'//找到选定的行 - 在 Lamba 的一行中 - 没有延迟执行! List selectedSeriesCodes = gridSeriesList.Rows.Cast().Where(g => !string.IsNullOrEmpty(g.Cells["Selected"].Value.ToString()) && Convert.ToBoolean(g.Cells [“选定”].Value) == true).ToList();'
    【解决方案5】:

    如果你在CellContentClick Event 上尝试一下

    用途:

    dataGridView1.EndEdit();  //Stop editing of cell.
    MessageBox.Show("0 = " + dataGridView1.Rows[e.RowIndex].Cells[0].Value.ToString());
    

    【讨论】:

      【解决方案6】:

      如果您有一个包含多个复选框的 gridview .... 你应该试试这个....

      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());
              }
          }
      }
      

      【讨论】:

        【解决方案7】:

        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
            }
        }
        

        【讨论】:

          【解决方案8】:

          测试列是否被选中:

          for (int i = 0; i < dgvName.Rows.Count; i++)
          {
              if ((bool)dgvName.Rows[i].Cells[8].Value)
              {
              // Column is checked
              }
          }
          

          【讨论】:

            【解决方案9】:

            如果您在 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);
            

            【讨论】:

              【解决方案10】:

              其实很简单

              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;
              }
              

              【讨论】:

                【解决方案11】:

                如果由于绑定了 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);
                

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2012-07-20
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多