【问题标题】:How to Update values of dataGridView row in Winform如何在 Winform 中更新 dataGridView 行的值
【发布时间】:2014-09-26 01:15:09
【问题描述】:

我有一个 dataGridview,其第一列是 Checkbox。现在根据我的要求,我想在选择复选框时更新 dataGridView 行的值。我希望它就像为特定行单击复选框一样,该行应该变得可编辑,并且在更新按钮单击时输入的任何内容都应更新。

这是我为 gridview 和 Checkbox 提供的代码..

    private void btn_load_Click(object sender, EventArgs e)
    { 
        DataTable dt = new DataTable();
        dt.Columns.Add("Select", System.Type.GetType("System.Boolean"));
        dt.Columns.Add("UserName");
        dt.Columns.Add("EmpID");

        DataRow dr;

        //Connection lines
            connection.Open();
            using (MySqlDataReader reader = command.ExecuteReader())
            {
                while (reader.Read())
                {
                    dr = dt.NewRow();
                    dr["Select"] = false;
                    dr["UserName"] = reader["UserName"].ToString();
                    dr["EmpID"] = reader["EmpID"].ToString();

                    dt.Rows.Add(dr);
                }
            }
        }

        dataGridView1.AllowUserToAddRows = true;
        dataGridView1.AllowUserToDeleteRows = true;
        dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;

        dataGridView1.DataSource = dt; 
    }

请帮助我。在此先感谢..

【问题讨论】:

    标签: c# winforms checkbox datagridview


    【解决方案1】:

    首先要做的是确保 GridView 中唯一可编辑的列是带有复选框的列。 因此,在您完成将数据加载到网格中之后,需要添加以下内容:

    foreach (DataGridViewColumn dc in dataGridView1.Columns)
    {
        if (dc.Index.Equals(0))
        {
            dc.ReadOnly = false;
        }
        else
        {
            dc.ReadOnly = true;
        }
    }
    

    这只是将除第一列之外的所有列设置为只读。

    现在您有了列并且可以单击复选框,我们需要以某种方式处理复选框状态的更改。现在,不管你信不信,为了让它正常工作,我们需要处理两个事件。这是有充分理由的。你看,如果我们为包含复选框的单元格处理 CellValueChanged 事件,它不会触发,直到用户在单击它后离开单元格。这被认为是编辑单元格的正式结束。当复选框有问题时,当然不会这样做,因为我们需要在单击事件后立即处理该事件。为此,我们将处理第二个事件 - CellMouseUp,并在该处理程序中强制完成编辑。它应该看起来像这样:

    private void dataGridView1_CellMouseUp(object sender, DataGridViewCellMouseEventArgs e)
    {
        if (e.ColumnIndex == 0 && e.RowIndex != -1)
        {
            dataGridView1.EndEdit();
        }
    }
    
    private void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e)
    {
        if (e.ColumnIndex == 0 && e.RowIndex != -1)
        {
            foreach (DataGridViewColumn dc in dataGridView1.Columns)
            {
                if (!dc.Index.Equals(0))
                {
                    dc.ReadOnly =                                          
                        !(bool)dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Value;
                }
    
            }
        }
    }
    

    【讨论】:

    • 我试图实现这个解决方案,但它根本不符合我的要求..
    猜你喜欢
    • 2021-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-06
    • 1970-01-01
    相关资源
    最近更新 更多