繁体   English   中英

DataGridView C# windows 应用程序(如果鼠标单击列标题,第一行不选择哪个是复选框)

[英]DataGridView C# windows application(First row not selecting which is checkbox if mouse click on column Header)

可以请任何人帮助我解决这个问题。 我开发了 ac# windows 应用程序,其中 DataGridView 第一列有复选框。 如果我单击第一列标题,它会选中除第一行之外的所有行级别复选框。 为了选择所有行级别的复选框,我有一个 dataGridView1_ColumnHeaderMouseClick 事件,代码是:

private void dataGridView1_ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e)
        {
            foreach (DataGridViewColumn column in dataGridView1.Columns)
            {
                column.SortMode = DataGridViewColumnSortMode.NotSortable;
            }
            if (e.ColumnIndex == 0)
            {
                if (chek == 0)
                {
                    try
                    {
                        for (int i = 0; i < dataGridView1.RowCount; i++)
                        {
                            string paymentValue = dataGridView1.Rows[i].Cells[18].Value.ToString();
                            string incmngp = dataGridView1.Rows[i].Cells[20].Value.ToString();
                            if (paymentValue == "N" && incmngp =="")
                            {
                                dataGridView1.Rows[i].Cells[0].Value = 1;
                                chek = 1;
                            }
                        }
                        if (chek == 1)
                        {
                            btn_update.Text = "Update";
                        }
                    }
                    catch (Exception ) {  }
                }
                else if(chek==1)
                {
                    try
                    {
                        for (int i = 0; i < dataGridView1.RowCount; i++)
                        {
                            dataGridView1.Rows[i].Cells[0].Value = 0;
                            chek = 0;
                        }
                        if (chek == 0)
                        {
                            btn_update.Text = "OK";
                        }
                    }
                    catch (Exception) { }
                }
            }

注意:chek是初始化阶段声明的变量

将数据网格视图的选择模式属性设置为ColumnHeaderSelect

在此处输入图像描述

并确保所有“文本”列的SortMode设置为NotSortable

在此处输入图像描述

更新 2

在这种情况下,撤消我之前告诉过的所有内容并像这样

在将任何 DataTable 分配给 dataGridView1 之前。

da.Fill(dt);
dataGridView1.DataSource = dt.DefaultView;
dataGridView1.SelectionMode = DataGridViewSelectionMode.RowHeaderSelect;
     foreach(DataGridViewColumn dc in dataGridView1.Columns)
                {
                    dc.SortMode = DataGridViewColumnSortMode.NotSortable;
                }
 dataGridView1.SelectionMode = DataGridViewSelectionMode.ColumnHeaderSelect;

更新 3

为您的 dataGridView1 的ColumnHeaderMouseClick事件添加一个事件处理程序,如下所示

在此处输入图像描述

添加以下代码(如果您想对复选框的任何列使用相同的功能,则为通用代码)

 private void dataGridView1_ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e)
        {
            //Enter your own column index here
            if(e.ColumnIndex == 0)
            foreach(DataGridViewRow row in dataGridView1.Rows)
            foreach (DataGridViewCell cell in row.Cells)
            {
                    //Check if the cell type is of a CheckBoxCell
                if (cell.GetType() == typeof(DataGridViewCheckBoxCell))
                {
                    DataGridViewCheckBoxCell c = (DataGridViewCheckBoxCell)cell;
                    c.TrueValue = "T";
                    c.FalseValue = "F";
                    if (c.Value == c.FalseValue|| c.Value == null )
                    c.Value = c.TrueValue;
                    else
                        c.Value = c.FalseValue;
                }
            }
            dataGridView1.RefreshEdit();
        }

这是 Winforms 中一个非常奇怪的错误。 该问题更普遍地适用于第一行,但适用于 DataGridViewCheckBoxCell(s) 的任何行中的第一个选定单元格。 您可以通过单击复选框来选择 CheckBox 单元格,或者选择复选框外的单元格,行为是相同的。 如果您选中网格中间的 3 个复选框,则这三个复选框中的第一个将冻结并且无法正确更新。 如果您尝试通过调用 dataGridView1.ClearSelection() 方法清除代码中的选择,它仍然不起作用。

正确答案是在更改复选框数据后立即调用 datagridview1.RefreshEdit()。 您不能在完成所有更改后才调用它。 每次更改 CheckBox 值时都必须执行此操作。

foreach (DataGridViewRow row in Results.Rows)
    {
       var ck =  (DataGridViewCheckBoxCell) row.Cells["check"];
       ck.Value = ck.TrueValue;
       Results.RefreshEdit();
     }
    

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM