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