重新订购后更新GridView

时间:2011-12-29 18:43:48

标签: gridview code-behind

我有一个gridview依赖于三个级联下拉列表(在updatepanel中)。当用户在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的价格,然后更改“显示Bs优先”的下拉菜单,在结果页面上我将看到A2的新价格(即,顺序中的第五个)。

我认为这是因为在UpdateRow()中我们只是基于索引(gvr.RowIndex)进行更新,所以不知何故GridView被重新显示(不会丢失新的价格数据!)然后更新。

有关如何确保将这些更改保存到适当行的任何想法,而不仅仅是现在发生的行具有与以前相同的索引?

1 个答案:

答案 0 :(得分:0)

所以,正如变得普遍,我想我会回答我自己的问题,以防有一天有人偶然发现这个问题。 (即http://xkcd.com/979/

基本上,我创建了三个标签,这些标签是从Page_Load上的Request.QueryString中提供变量的(其中变量在url中传递)。这些标签现在是构建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在更新面板之外)

相关问题