[英]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.