2011-12-29 67 views
1

我有一個gridview依賴於三個級聯下拉列表(在updatepanel中)。當用戶在GridView編輯細胞,改變一個下拉菜單,然後點擊「顯示」它調用下面的代碼隱藏:更新GridView後重新訂購

protected void Save_Click(Object sender, EventArgs e) 
    { 
     foreach (GridViewRow gvr in MasterDisplay.Rows) 
      MasterDisplay.UpdateRow(gvr.RowIndex, false); 
     MasterDisplay.DataBind(); 
} 

的問題是,在下拉菜單會改變gridview的,所以更新的細胞脫身的訂單。一個例子:假設我有六個項目:A1,A2,A3,B1,B2,B3。如果我編輯B2的價格,則更改顯示'show Bs first'的下拉列表,在結果頁面上,我將看到A2的新價格(即任何順序中的第五個)。

我想,這是因爲在UpdateRow(),我們只更新是根據該指數(gvr.RowIndex),所以不知何故GridView控件得到重新顯示(不失新的價格數據!),然後更新。

有關如何確保將這些更改保存到相應行的任何想法,而不僅僅是現在發生的行與之前具有相同的索引?

+0

爲記錄,我想這樣做顯示點擊,因爲我'會拋出一個模式說「保存更改?Y/N」,其中'Y'是一個與Save_Click關聯的asp:Button。 – ScottieB 2011-12-29 18:45:37

回答

0

因此,正在變得越來越普遍,我想我會回答我自己的問題,以防有一天有人絆倒在這。 (即http://xkcd.com/979/

基本上,我創建了三個標籤,它們是從Page_Load(其中變量在url中傳遞的)上的Request.QueryString提供變量的。這些標籤現在是構建gridview的SqlDataSource的ControlParameters。我也填寫這個變量的下拉菜單。即

var myInternalVar1 = Request.QueryString["myVariable1"]; 
myLabel1.Text = myInternalVar1; 
myDropDown1.SelectedValue = myInternalVar1; 

然後用戶可以正常使用下拉(從它們的末端)。當用戶點擊保存,我運行當前的代碼(見問題),然後添加:

myLabel1.Text = myDropDown1.SelectedValue; 
Response.Redirect("~/mysite.aspx?myVariable1=" + myLabel1.Text); 

這意味着沒有更多的回傳,而是導航。

一個重要的注意事項:我必須填寫if(!Page.IsPostBack)中的所有下拉菜單,因爲我捎帶的預先存在的函數似乎被多次調用。不知道爲什麼他們被稱爲,因爲他們只在一個聲明 (被調用下拉後被稱爲三次,即使外部gridview是外部更新面板)