GridView не запоминает состояние между постбэками - PullRequest
8 голосов
/ 13 мая 2010

У меня есть простая страница ASP с сеткой привязки данных (привязана к источнику объекта). Сетка находится на странице мастера и имеет флажок «выбрать» для каждой строки.

На одном этапе мастера я связываю GridView:

protected void Wizard1_NextButtonClick(object sender, WizardNavigationEventArgs e)
    {
...
        // Bind and display matches
        GridViewMatches.EnableViewState = true;
        GridViewMatches.DataSource = getEmailRecipients();
        GridViewMatches.DataBind();

И когда нажимается кнопка «Готово», я перебираю строки и проверяю, что выбрано:

protected void Wizard1_FinishButtonClick(object sender, WizardNavigationEventArgs e)
{
    // Set the selected values, depending on the checkboxes on the grid.
    foreach (GridViewRow gr in GridViewMatches.Rows)
    {
        Int32 personID = Convert.ToInt32(gr.Cells[0].Text);
        CheckBox selected = (CheckBox) gr.Cells[1].FindControl("CheckBoxSelectedToSend");

Но на этом этапе GridViewMatches.Rows.Count = 0! Я не переплетаю сетку, мне не нужно, верно? Я ожидаю, что view-state сохранит состояние. (Также, если я перепривязываю сетку, мои флажки выбора будут сняты)

NB. На этой странице также динамически добавляются пользовательские элементы управления в методе OnInit. Я слышал, что это может мешать состоянию представления, но, насколько я могу судить, я делаю это правильно, и состояние представления для этих добавленных элементов управления, кажется, работает (значения сохраняются между обратными передачами)

Заранее большое спасибо за любую помощь!

Райан

ОБНОВЛЕНИЕ: Может ли это быть связано с тем, что я устанавливаю источник данных программно? Мне было интересно, связывает ли механизм asp базу данных в течение жизненного цикла страницы с источником данных, который еще не определен. (На тестовой странице GridView автоматически «привязывается к данным». Я не хочу, чтобы сетка была связана заново, я просто хочу значения из состояния просмотра из предыдущего поста!

Кроме того, у меня есть это в заголовке asp: ViewStateEncryptionMode = "Никогда" - это должно было разрешить случайное сообщение "Недействительный MAC-адрес проверки состояния"

Для справки, мой GridView определен следующим образом:

<asp:GridView ID="GridViewMatches" runat="server" AllowSorting="True" AutoGenerateColumns="False" 
    BackColor="White" BorderColor="#E7E7FF" BorderStyle="None" BorderWidth="1px" CellPadding="3" 
    OnDataBinding="GridViewMatches_OnBinding">
        <Columns>
            <asp:BoundField DataField="PersonID"><ItemStyle CssClass="hidden"/></asp:BoundField>
            <asp:TemplateField>
                <ItemTemplate>
                    <asp:CheckBox ID="CheckBoxSelectedToSend" runat="server"
                        Checked='<%# DataBinder.Eval(Container.DataItem, "SelectedToSend") %>'/>
                </ItemTemplate>
...

Ответы [ 3 ]

9 голосов
/ 14 мая 2010

Итерация элементов управления в событии PreInit (чтобы определить, была ли нажата кнопка «добавить другой элемент управления» или «удалить другой элемент управления») делает недействительным состояние просмотра !!

Вот метод, вызванный из PreInit

public Control GetPostBackControl(Page thePage)
    {
        //return null;

        Control myControl = null;
        string ctrlName = thePage.Request.Params.Get("__EVENTTARGET");
        if (((ctrlName != null) & (ctrlName != string.Empty)))
        {
            myControl = thePage.Master.FindControl(ctrlName);
        }
        else
        {
            foreach (string Item in thePage.Request.Form)
            {
                Control c = thePage.Master.FindControl(Item);
                if (((c) is System.Web.UI.WebControls.Button))
                {
                    myControl = c;
                }
            }

        }

        return myControl;
    }

(Я не беру кредит на этот метод, я нашел его в Интернете)

Если первая строка не закомментирована, состояние просмотра сохраняется.

Ужасная!

3 голосов
/ 14 мая 2010

Убедитесь, что ваш GridView ViewState включен по умолчанию.

Убедитесь, что GridView не восстанавливается и не очищается.

Если это по-прежнему не работает, проверьте любой из родительских элементов управления вашего GridView и убедитесь, что их ViewState НЕ отключено. Любые родительские элементы управления с отключенной ViewState приведут к тому, что все их дочерние элементы управления не будут использовать ViewState.

Динамические элементы управления не должны оказывать никакого влияния на GridView, если ваш GridView не содержится в одном из этих динамических элементов управления.

1 голос
/ 14 мая 2010

Есть ли у вашего gridview и других элементов управления идентификатор? Если вы не укажете идентификатор или если идентификатор изменяется между постбэками, вы потеряете изменения состояния просмотра.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...