无法在OnRowChanging事件中调用CancelEdit()

时间:2012-07-18 07:41:30

标签: c# ado.net

private void Cource_Load(object sender, EventArgs e)
{
    //fill dataset by using .GetAllCourses() function 
    DataSet ds = new DataAccess.newCourcesDAC().GetAllCourses();

    //define and set BindingSource to tblCourses of dataset
    BindingSource BS = new BindingSource();
    BS.DataSource = ds;
    BS.DataMember = "tblCourses";

    //bind datagridview to Bindingsource
    ds.Tables["tblCourses"].RowChanging += new  DataRowChangeEventHandler(Cource_RowChanging);
    dataGridView1.DataSource = BS;

    //bind for texbox to navigat 4 column of Cource table
    txtCourseID.DataBindings.Add("Text", BS, "CourseID");
    txtCourseName.DataBindings.Add("Text", BS, "CourseName");
    txtPrequest.DataBindings.Add("Text", BS, "Prequest");
    txtCourseContent.DataBindings.Add("Text", BS, "CourseContent");
}
**void Cource_RowChanging(object sender, DataRowChangeEventArgs e)
    {
        if ( e.Action==DataRowAction.Add)
        {
            if (((int)e.Row["CourseID", DataRowVersion.Proposed]) < 10)
            {
                e.Row.SetColumnError("CourseID", "cource id must < 10");
                e.Row.CancelEdit();
            }
        }
    }**

我有一个带有表(tblCourse)的数据集(ds),其中4列使用绑定源绑定到4个文本框。 我想在通过RowChanging事件向数据表添加新记录时验证数据。

我想在发生指定的条件时用[e.Row.CancelEdit();]取消行。

但是我发现了这个错误: 无法在OnRowChanging事件中调用CancelEdit()。抛出异常以取消此更新。

2 个答案:

答案 0 :(得分:1)

为了任何可能偶然发现这个旧线索的人的利益,我会发布一个解决方案来解决一些问题。与此问题有关。

  1. 尽管出现了错误消息,但在RowChanging中与Try-Catch一起抛出异常不会删除新行。我不能说当错误被抛出时永远不会删除该行,只是我还没有看到它发生。

  2. 在没有Try-Catch的情况下抛出异常会将该行标记为有错误。如果您有任何WPF数据网格代码来指示验证错误 - 例如显示我喜欢的红色复选标记 - 则错误将正确显示。不会删除该行。

  3. 在RowChanging中调用e.Delete也不会在我见过的任何条件下删除该行。如果设置断点并检查RowState,则将其设置为Detached。当RowChanged事件触发时,RowState将恢复为e.Added。即使可以在某些其他条件下删除RowChanging中的行,也可能不会在添加之前将数据集或后端数据库中的任何标识列重置为其最后一个值。

  4. 下面我相当简单的VB.Net解决方法使用一个标志变量(我通常把我的数据类放在我的数据级别)来识别是否在RowChanging中发生了取消,然后在RowChanged中采取适当的操作并重置标志。到目前为止,我还没有遇到任何问题,除了一些&#34;此行已从表中删除,并且没有任何数据。 BeginEdit()将允许在此行中创建新数据。&#34;遇到已删除的行时,我的代码中的其他地方的异常,通过对RowState设置为Detached的一些简单检查进行修复。我希望这会有所帮助。

    Private LastRowAdditionCanceled As Boolean

    Public Sub RowChanging(ByVal sender As Object, ByVal e As DataRowChangeEventArgs)
    
         If e.Action = DataRowAction.Add Then
        'Add the conditions where you want to cancel the row addition above
        LastRowAdditionCanceled = True
          End If
    End Sub
    
    
    
    Public Sub RowChanged(ByVal sender As Object, ByVal e As DataRowChangeEventArgs)
    
          If LastRowAdditionCanceled = False Then
             'execute your usual RowChanged code here
    
          Else
                e.Row.RejectChanges()
                LastRowAdditionCanceled = False
          End If
    End Sub
    

答案 1 :(得分:0)

使用事件“RowChanged”,如果要删除该行,可以调用e.Row.Delete()。 我正在附加示例代码,您可以看到如果插入的值为“2”,则删除该行:

 class Program
{
    static void Main(string[] args)
    {
        DataTable dataTable = new DataTable();
        dataTable.Columns.Add("ID", typeof(int));
        dataTable.RowChanged += new DataRowChangeEventHandler(dt_RowChanged);

        dataTable.Rows.Add(1);
        dataTable.Rows.Add(2);
        dataTable.Rows.Add(3);

        Console.WriteLine("Total rows: {0}", dataTable.Rows.Count);
        foreach (DataRow item in dataTable.Rows)
        {
            Console.WriteLine(item["ID"]);
        }

        Console.Read();
    }

    private static void dt_RowChanged(object sender, DataRowChangeEventArgs e)
    {
        if (e.Action == DataRowAction.Add)
        {
            if (((int)e.Row["ID"]) == 2)
            {
                e.Row.Delete();
            }
        }
    }
}