Обновить GridView после повторного заказа - PullRequest
1 голос
/ 29 декабря 2011

У меня есть вид сетки, зависящий от трех каскадных выпадающих меню (в панели обновления). Когда пользователь редактирует ячейку в виде сетки, меняет раскрывающийся список и нажимает «Показать», он вызывает следующий код:

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

Проблема в том, что выпадающие списки изменят вид сетки, поэтому обновленные ячейки выходят из строя . Пример: допустим, у меня есть шесть предметов: A1, A2, A3, B1, B2, B3. Если я отредактирую цену для B2, то поменяю раскрывающийся список с надписью «сначала показывать Bs», а на открывшейся странице я вместо этого увижу новую цену для A2 (т. Е. Любую пятую позицию в заказе).

Я полагаю, это потому, что в UpdateRow () мы обновляем только на основе индекса (gvr.RowIndex), так что GridView каким-то образом отображается повторно (без потери новых данных о ценах!) И затем обновляется.

Любые идеи о том, как сохранить эти изменения в соответствующей строке, а не просто в строке, которая теперь имеет тот же индекс, что и раньше?

1 Ответ

0 голосов
/ 11 января 2012

Итак, как это становится обычным делом, я думаю, я отвечу на свой вопрос на случай, если однажды кто-нибудь наткнется на это. (т.е. http://xkcd.com/979/)

По сути, я создал три метки, которые подают переменные из Request.QueryString в Page_Load (где переменные передаются в URL). Эти метки теперь являются ControlParameters для SqlDataSource, строящего представление сетки. Я также заполняю выпадающие списки из этой переменной. т.е.

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), потому что казалось, что уже существующие функции, над которыми я работал, вызывались несколько раз. Не уверен, почему они были вызваны, так как они были только в одной декларации (вызывается три раза после использования раскрывающегося списка, даже если внешний вид сетки находится за пределами панели обновления)

...