2012-07-18 34 views
2
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(); 
      } 
     } 
    }** 

我有一個帶有4列的表(tblCourse)的數據集(ds),它使用bindingsource綁定到4個文本框。 我想通過RowChanging事件向數據表添加新記錄時驗證數據。無法在OnRowChanging事件中調用CancelEdit()

我想在發生指定的條件時用[e.Row.CancelEdit();]取消行。

但我收到此錯誤: 無法在OnRowChanging事件內調用CancelEdit()。拋出異常以取消此更新。

+0

你嘗試到 「拋出一個異常取消此更新」? – 2012-07-18 07:47:06

回答

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(); 
      } 
     } 
    } 
} 
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適當的行動,並復位標誌。到目前爲止,我還沒有遇到任何問題,除了一些「這行已經從表中刪除,沒有任何數據,BeginEdit()將允許在這一行創建新的數據。」遇到已刪除的行時,我的代碼中的其他地方出現異常,這些問題已通過RowState設置爲Detached的一些簡單檢查得到解決。我希望這有幫助。

    私人LastRowAdditionCanceled由於布爾

    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 
    
相關問題