C# DataGridView验证&;改变单元格值

C# DataGridView验证&;改变单元格值,c#,datagridview,validating,C#,Datagridview,Validating,我希望在验证时操作DataGridView中的单元格,这样,如果用户输入的值对数据库无效,但很容易转换为有效数据,则程序会将该值更改为适当的值 我能够正确地验证我的值,但当我尝试将其更改为有效值时,会出现数据错误。这是我的密码: private void unit_List_2_GroupsDataGridView_CellValidating(object sender, DataGridViewCellValidatingEventArgs e) {

我希望在验证时操作DataGridView中的单元格,这样,如果用户输入的值对数据库无效,但很容易转换为有效数据,则程序会将该值更改为适当的值

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

        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”]的行没有执行我期望它执行的操作。

DataGridView
离开编辑模式时,
CellValidating
事件刚好发生;这是一个与编辑控件(
DataGridView.EditingControl
)相关的事件。不应尝试更改此事件处理程序中的单元格值,因为除非取消该事件(在这种情况下,用户处于编辑模式),否则单元格值将在事件完成后立即设置为编辑控件中的值。因此,这将撤消在处理程序中执行的任何操作

您需要做的是更改编辑控件中的值(记住不要取消事件)。例如,对于一个
DataGridViewTextBoxCell
,您可以使用以下内容,而不是有问题的行:

unit_List_2_GroupsDataGridView.EditingControl.Text = Convert.ToString(rows[0]["Batch"]);

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

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

请发布准确的错误消息,并指出提到的代码行。您的响应非常好,为我节省了大量时间。是否有方法在CellValidating事件中更改dgv单元格样式格式和单元格标记?到目前为止,我已经尝试了一些方法,并在没有运气的情况下搜索了答案。@SteveRehling您应该能够在任何时间点设置
标记
属性。我没有尝试在
cellvaliding
事件中更改单元格样式;我的建议是将此代码放在
CellValueChanged
事件中(如果可能)。如果您的列不是字符串类型,请确保在比较之前将值设置为字符串()。更改编辑值时,请确保将此类型设置为字符串。感谢Bradley Smith,太棒了,因为多年来我一直在寻找解决这种情况的最佳方法。这个答案解决了我的特定问题,但仍然需要处理CellValidating,因为如果用户的条目是垃圾,而我在处理CellParsing时无法更正它,我仍然希望将它们保持在编辑模式(这在处理CellParsing时无法完成)。值得注意的是,在这种情况下,CellValidating是在CellParsing之前提出的。