У меня есть простая 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>
...
Итерация элементов управления в событии 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;
}
(я не беру этот метод, я нашел его в сети)
Если первая строка не закомментирована, состояние просмотра сохраняется.
Ужасно!
Есть ли у вашего gridview и других элементов управления идентификатор? Если вы не укажете идентификатор или если идентификатор изменится между обратными передачами, вы потеряете изменения состояния просмотра.
Убедитесь, что ваш GridView
ViewState
включен по умолчанию.
Убедитесь, что GridView
не отбрасывается и не очищается.
Если это все еще не работает, проверьте родительские элементы управления GridView
и убедитесь, что их ViewState
НЕ выключен. Любой родительский элемент управления с выключенным ViewState
приведет к тому, что все его дочерние элементы управления не будут использовать ViewState
.
Динамические элементы управления не должны оказывать никакого влияния на ваш GridView
, если только ваш GridView
не содержится в одном из этих динамических элементов управления.