簡體   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