Rya*_*yan 8 asp.net viewstate postback gridview
我有一个简单的ASP页面与数据绑定网格(绑定到对象源).网格位于向导的页面内,每行都有一个"选择"复选框.
在向导的一个阶段,我绑定GridView:
protected void Wizard1_NextButtonClick(object sender, WizardNavigationEventArgs e)
{
...
// Bind and display matches
GridViewMatches.EnableViewState = true;
GridViewMatches.DataSource = getEmailRecipients();
GridViewMatches.DataBind();
Run Code Online (Sandbox Code Playgroud)
单击完成按钮后,我会遍历行并检查所选内容:
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");
Run Code Online (Sandbox Code Playgroud)
但是在这个阶段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>
...
Run Code Online (Sandbox Code Playgroud)
迭代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;
}
Run Code Online (Sandbox Code Playgroud)
(我不相信这个方法,我发现它在网上)
如果第一行未注释,则维护视图状态.
可怕!
| 归档时间: |
|
| 查看次数: |
22521 次 |
| 最近记录: |