GridView не помнит состояние между обратными передачами

У меня есть простая 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. Строки. Количество = 0! Я не снова переплетаю сетку, я не должен должен быть, правильно? Я ожидаю, что состояние отображения поддержит состояние. (Кроме того, если я действительно снова переплету сетку, то мои флажки выбора будут сняты),

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

Большое спасибо заранее для любой справки!

Ryan

ОБНОВЛЕНИЕ: это могло относиться к факту, я устанавливаю источник данных программно? Я задался вопросом, связывал ли механизм 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>
...
8
задан Oliver Spryn 14 August 2014 в 11:29
поделиться

3 ответа

Итерация элементов управления в событии 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;
    }

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

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

Ужасно!

9
ответ дан 5 December 2019 в 12:56
поделиться

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

1
ответ дан 5 December 2019 в 12:56
поделиться

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

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

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

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

3
ответ дан 5 December 2019 в 12:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: