DataGridView 验证和更改单元格值

27

我想在DataGridView的验证过程中操作单元格,以便如果用户输入的值对于数据库无效,但很容易转换为有效数据,则程序将将该值更改为适当的值。

我能够正确验证我的值,但当我尝试将其更改为有效的内容时,会出现DataError错误。 这是我的代码:

        private void unit_List_2_GroupsDataGridView_CellValidating(object sender, DataGridViewCellValidatingEventArgs e)
    {
        Console.WriteLine("Validating");
        DataGridViewColumn col = this.unit_List_2_GroupsDataGridView.Columns[e.ColumnIndex];
        DataGridViewCell cell = this.unit_List_2_GroupsDataGridView.Rows[e.RowIndex].Cells[e.ColumnIndex];
        if (col == this.batchDataGridViewTextBoxColumn && this.unit_List_2_GroupsDataGridView.IsCurrentCellInEditMode)
        {
            Console.WriteLine("   Batch Column");
            DataRow[] rows = label_EntryDataSet.viewJobBatchList.Select(String.Format("Job={0} AND Display='{1}'"
                , comboBox1.SelectedValue, e.FormattedValue));
            if (rows.Length == 1)
            {
                Console.WriteLine("      Auto Completed item from list: {0}", rows[0]["Batch"]);
                //e.Cancel = true;
                cell.Value = rows[0]["Batch"];
                //this.unit_List_2_GroupsDataGridView.EndEdit();
            }
            else
            {
                Console.WriteLine("     No Autocomplete!");
                int i = 0;
                if (!int.TryParse(e.FormattedValue.ToString(), out i))
                {
                    Console.WriteLine("         Not an integer either");
                    e.Cancel = true;
                }
            }
        }
    }

cell.Value = rows[0]["Batch"];这行代码并没有按照我预期的那样运行。


请发布准确的错误信息,并指出提到了哪行代码。 - David
2个回答

49
CellValidating事件会在DataGridView退出编辑模式之前发生,它涉及到编辑控件(DataGridView.EditingControl)。在该事件处理程序中,不要尝试更改单元格的值,因为除非您取消事件(这种情况下,用户将无法退出编辑模式),否则单元格的值将立即设置为编辑控件中的值。因此,这会撤销处理程序中执行的任何操作。
相反,您应该在编辑控件中更改值(记得不要取消事件)。例如,对于DataGridViewTextBoxCell,您应该使用以下代码替代有问题的行:
unit_List_2_GroupsDataGridView.EditingControl.Text = Convert.ToString(rows[0]["Batch"]);

你应该会发现这解决了你的问题。


1
你的回答很好,节省了我很多时间。在CellValidating事件中是否有一种可以更改dgv单元格样式格式和单元格标签的方法?我尝试了一些方法并进行了搜索,但迄今为止没有找到答案。 - Steve Rehling
@SteveRehling 你应该能够在任何时候设置Tag属性。我没有尝试在CellValidating事件中更改单元格样式;我的建议是将此代码放置在CellValueChanged事件中(如果可能的话)。 - Bradley Smith
如果您的列不是字符串类型,请确保在比较之前将其转换为字符串。在更改编辑后的值时,请确保将其转换为字符串类型。 - MrOli3000
感谢Bradley Smith,太棒了,多年来我一直在寻找最好的解决方案。 - sushil.agarwal

5
一般而言,当你需要转换/更改单元格中的值时,最好使用CellParsing事件。从该事件中,你可以通过设置单元格或行的ErrorText值来指示用户的值无效。

1
这个答案解决了我的特定问题,但仍然需要处理CellValidating,因为如果用户的输入是垃圾数据,而我在处理CellParsing时无法进行更正,我仍然希望将其保留在编辑模式下(当处理CellParsing时无法完成此操作)。值得注意的是,在这种情况下,CellValidating会在CellParsing之前被触发。 - Morris

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接