2011-12-29 65 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是外部更新面板)