2010-08-17 95 views
0

嘿傢伙們,我有一個ASP.NET GridView綁定到DataView,它包含一個DataTable。我沒有使用DataAdapter。更新DataTable?

我想在我的DataTable中更新行,所以我這樣做:

protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e) 
{ 
    DataView dv = (DataView)Session["My_DataTable"]; 
    DataTable dt = dv.Table; 
    int rowIndex = GridView1.Rows[e.RowIndex]; 
    dt.Rows[rowIndex]["FirstName"] = thenewfirstname; 
    dt.Rows[rowIndex]["MI"] = thenewmi; 
    dt.Rows[rowIndex]["LastName"] =thenewlastname; 
    Session["My_DataTable"] = dv; 
    //Reset the edit index. 
    GridView1.EditIndex = -1; 

    //Bind data to the GridView control. 
    GridView1.DataSource = Session["My_DataTable"]; 
    GridView1.DataBind(); 
} 

底層數據視圖/數據表被正確改變,但在GridView既包含舊行的編輯之前,新在編輯之後的行(也就是說,它增加了一個新的編輯行!)。

例如,如果我們有:

... 
Sammy S Samerson 
... 

並將其更改爲Sammy E Samerson GridView的說:

... 
Sammy S Samerson 
Sammy E Samerson 
... 

我該如何解決這個問題,我做了什麼錯?

+0

您確定Sammy E沒有覆蓋另一個條目?或者你的總排數也增加了? – Jeroen 2010-08-17 18:03:39

+0

我確定沒有條目被覆蓋,並且行數增加1。 – 2010-08-17 18:09:05

回答

1

很多奇怪的事情正在發生。

所有壞事的要點是DataView - 因爲事情正在重新排序,GridView的索引和DataView中的DataTable的索引沒有匹配。 DataTable必須循環,直到找到正確編輯的記錄。

1

您是否檢查編輯行的行索引。 int rowIndex = GridView1.Rows [e.RowIndex];你可以直接使用e.RowIndex。

我的建議是通過使用表中的任何關鍵字段來獲取行。

例如

DataRow[] customerRow = 
dataSet1.Tables["Customers"].Select("CustomerID = 'ALFKI'"); 

customerRow[0]["CompanyName"] = "Updated Company Name"; 
customerRow[0]["City"] = "Seattle"; 

您可以通過使用小區位置獲取該行的值。或者使用datakeynames 例如:

string courseid = GridView1.Rows[e.RowIndex].Cells[3].Text;