GridView不记得回发之间的状态

时间:2010-05-13 18:02:08

标签: asp.net gridview postback viewstate

我有一个带有数据绑定网格的简单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!我不重新绑定网格,我不应该,对吧?我希望视图状态能够维持状态。 (另外,如果我重新绑定网格,我的选择复选框将被清除)

注意:此页面还在OnInit方法中动态添加用户控件。我听说它可能会混淆视图状态,但据我所知,我正确地执行它并且这些添加控件的视图状态似乎有用(值在回发之间保持不变)

非常感谢您提供任何帮助!

赖安

更新:这可能与我以编程方式设置数据源的事实有关吗?我想知道asp引擎是否在页面生命周期中将网格数据绑定到尚未定义的数据源。 (在测试页面中,GridView是'自动'数据绑定'。我不希望网格重新绑定我只想从前一个帖子的viewstate中获取值!

另外,我在asp标题中有这个:ViewStateEncryptionMode =“Never” - 这是为了解决偶尔出现的“无效的Viewstate验证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 个答案:

答案 0 :(得分:9)

迭代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;
    }

(我不相信这个方法,我在网上找到了它)

如果取消注释第一行,则维护视图状态。

可怕!

答案 1 :(得分:3)

确保您的GridView ViewState默认开启。

确认GridView没有被反弹或清除。

如果仍然无效,请检查GridView的任何父级控件,并确保其ViewState未关闭。关闭ViewState的所有父级控件都会导致其所有子级控件都不使用ViewState

动态控件不应对您的GridView产生任何影响,除非您的GridView包含在其中一个动态控件中。

答案 2 :(得分:1)

您的gridview和其他控件是否有ID?如果您未指定ID,或者如果ID在回发之间发生变化,您将失去视图状态更改。