C#DataGridView编辑单元格值

时间:2014-10-26 23:44:32

标签: c# winforms datagridview

全部。我一直在谷歌搜索这个问题一个小时,仍然无法理解它是如何工作的。我的表单上有DataGridView控件,它有3列+ 1个ButtonColumn,我在其中添加如下行:

dg.Rows.Add(param1, param2, param3);

按钮的文字设置如下:

DataGridViewButtonColumn bc = (DataGridViewButtonColumn)dg.Columns["ButtonColumn"];
bc.Text = "Action";
bc.UseColumnTextForButtonValue = true;

现在,我想更改特定按钮的文字,一旦用户点击它,就说“完成”。我试过这样的话:

private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e) {
    if (articles.Rows[e.RowIndex].Cells[e.ColumnIndex].GetType() == typeof(DataGridViewButtonCell)) {
        DataGridViewButtonCell cell = (DataGridViewButtonCell)articles.Rows[e.RowIndex].Cells[e.ColumnIndex];
            articles.CurrentCell = cell;
            articles.EditMode = DataGridViewEditMode.EditProgrammatically;
            articles.BeginEdit(false);
            cell.Value = "Done";
            articles.EndEdit();
    }
}

它不起作用。我在这里尝试了一些关于类似问题的答案,在stackoverflow上,但它不能正常工作。如果我忽视某些事情,请原谅我。有人会这么好解释我怎么做,为什么这不起作用?

更新

private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e) {
    if (articles.Rows[e.RowIndex].Cells[e.ColumnIndex].GetType() == typeof(DataGridViewButtonCell)) {
         articles.EditMode = DataGridViewEditMode.EditProgrammatically;
         articles.Rows[e.RowIndex].Cells[e.ColumnIndex].Value = "Done";
    }
}

UPDATE2:

private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e) {
if (articles.Rows[e.RowIndex].Cells[e.ColumnIndex].GetType() == typeof(DataGridViewButtonCell)) {

articles.EditMode = DataGridViewEditMode.EditProgrammatically;
articles.ReadOnly = false;
articles.Rows[e.RowIndex].ReadOnly = false;
articles.Rows[e.RowIndex].Cells[e.ColumnIndex].ReadOnly = false;
articles.CurrentCell = articles.Rows[e.RowIndex].Cells[e.ColumnIndex];
articles.BeginEdit(true);
if (articles.Rows[e.RowIndex].Cells[e.ColumnIndex].IsInEditMode) { //it's false here
    articles.Rows[e.RowIndex].Cells[e.ColumnIndex].Value = "Done";
}
articles.EndEdit();
}
}

我甚至无法在调试器中手动更改值,它会立即重新设置为旧值。 这个问题似乎对DataGridViewButtonCell特别明显,因为其他类型的单元格变化很好。

2 个答案:

答案 0 :(得分:0)

您需要将使用cell.Value更改为

articles.Rows[e.RowIndex].Cells[e.ColumnIndex].Value = "Done";

仅在将该单元格添加回datagridview时,更改单元格值才会更改。 这样你就可以摆脱这样的细胞使用。

private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e) {
    if (articles.Columns[e.ColumnIndex].GetType() == typeof(DataGridViewButtonColumn)) {
            articles.EditMode = DataGridViewEditMode.EditProgrammatically;
            articles.Rows[e.RowIndex].Cells[e.ColumnIndex].ReadOnly = false;
            articles.Rows[e.RowIndex].Cells[e.ColumnIndex].Value = "Done";
    }
}

我删掉了其他内容,因为我不相信你正在做的事情需要它。

答案 1 :(得分:0)

问题在于这行代码:

bc.UseColumnTextForButtonValue = true;

如果设置了,则无法编辑ButtonCell的值。 DataGridView的任何只读选项都与此无关,它们指定用户(而不是您)是否可以编辑单元格。

感谢您的帮助,@ deathismyfriend