我有一个用户控件[ascx],这是一个radgrid。它还有一个编辑列模板,允许用户插入/更改/更新值。
我在aspx页面中单击按钮[Say EDIT]时加载此用户控件。
当我点击aspx页面的EDIT
按钮时,用户控件完全加载,但是当我点击用户控件的Add New Record
时,我收到此错误消息。
无法加载视图状态。加载viewstate的控制树必须与用于保存的控制树匹配 在上一个请求期间查看状态。例如,添加时 动态控制,回发期间添加的控件必须匹配 初始期间添加的控件的类型和位置 请求。
//用户控件代码-ascx
<telerik:RadGrid AllowAutomaticDeletes="True"
AllowAutomaticInserts="False" AllowAutomaticUpdates="False"
Height="410px" ID="rgrd1" runat="server" AutoGenerateColumns="False"
OnUpdateCommand="rgrd1_UpdateCommand"
OnInsertCommand="rgrd1_InsertCommand" OnNeedDataSource="rgrd1_NeedDataSource" GridLines="None">
<MasterTableView CommandItemDisplay="top" CommandItemStyle-Wrap="False" CommandItemStyle-HorizontalAlign="Left"
DataKeyNames="Type">
<Columns>
<telerik:GridEditCommandColumn UniqueName="EditColumn" HeaderStyle-HorizontalAlign="left"
HeaderText="Edit" ButtonType="ImageButton">
</telerik:GridEditCommandColumn>
<telerik:GridTemplateColumn DataField="Type" HeaderStyle-HorizontalAlign="left"
HeaderText="Type" UniqueName="Type">
<ItemTemplate>
<asp:Label ID="TypeLabel" runat="server" Text='<%# Eval("Type") %>'></asp:Label>
</ItemTemplate>
</telerik:GridTemplateColumn>
</Columns>
<EditFormSettings EditFormType="Template">
<EditColumn FilterControlAltText="Filter EditCommandColumn1 column" UniqueName="EditCommandColumn1">
</EditColumn>
<FormTemplate>
<table>
<td>
<telerik:RadTextBox ID="txtType" Width="50" runat="server" Text='<%# Eval("Type") %>'>
</telerik:RadTextBox>
</td>
</tr>
</table>
</FormTemplate>
</EditFormSettings>
</MasterTableView>
<HeaderStyle HorizontalAlign="Center" />
</telerik:RadGrid>
..................................... 我的aspx页面的代码 - 我在Radwindow中加载上面的usercontrol
点击编辑按钮 - 下面的代码我写了
RadWindow window = new RadWindow();
window.Height = Unit.Pixel(500);
window.Width = Unit.Pixel(500);
window.VisibleOnPageLoad = true;
UserControl uc = (UserControl)Page.LoadControl("../../Controls/TypeUserControl.ascx");
uc.EnableViewState = false;
window.ContentContainer.Controls.Add(uc);
pnl.Controls.Add(window);
当我点击usercontrol中的Add New Record
时,它会抛出异常&#34;无法加载视图状态:&#34;
我的加载了这个用户控件的aspx页面正由我的BasePage继承。
基页的OnPreRender出现异常
protected override void OnPreRender(EventArgs e)
{
try
{
base.OnPreRender(e);
}
}
用户控制 - 代码behing
public partial class TypeUserControl : System.Web.UI.UserControl
{
protected void rgrd1Types_NeedDataSource(object source, GridNeedDataSourceEventArgs e)
{
try
{
//dbase call
}
catch (Exception ex)
{
SetValidationMessage(ex.Message.ToString());
}
}
protected void rgrd1_InsertCommand(object source, GridCommandEventArgs e)
{
try
{
//dbase call
}
catch (Exception ex)
{
SetValidationMessage(ex.Message.ToString());
}
}
答案 0 :(得分:0)
我不知道这是否是问题,但您的HTML在表单模板中不正确
<table> <td> <telerik:RadTextBox ID="txtType" Width="50" runat="server" Text='<%# Eval("Type") %>'> </telerik:RadTextBox> </td> </tr> </table>
您错过了开始<tr>
标记。这可能与问题有关。
你应该仔细检查所有代码,以确保它是正确的。
-
我也猜测你应该从编辑按钮的OnClick()
事件中删除这行代码
uc.EnableViewState = false;
答案 1 :(得分:0)
您必须在动态添加后重新创建回发控件。 在Init_page Eventhandler中重新创建或添加控件,您可以在那里检查导致回发的事件或控件的类型,以了解您应该重新创建此控件。 你可以发布代码隐藏文件。
编辑: 很久以前,当我这样做的时候。但这是一个有效的例子。 我认为有更好的方法。 检查密钥集合,哪个按钮导致回发,如果它是你的ascx控件中的某个按钮然后读取你的控件到页面或者你把它放在哪里,但它必须在回发时是相同的地方,否则你会得到一个错误,我想。
protected override void OnInit(EventArgs e){base.OnInit(e);
if (this.Page.IsPostBack) { var x = base.DeterminePostBackMode(); if (x.Keys.Get(3).Contains("btnInControl")) { Control ctrl = Page.LoadControl("WebUserControl1.ascx"); this.Page.Form.Controls.Add(ctrl); } } }
答案 2 :(得分:0)
您发布此问题已经过去了一年,但万一有人仍面对此问题:这是此类错误的主要根源。我一直在苦苦挣扎。
修复错误的最简单方法是设置为动态添加的控件:
EnableViewState = false
如果您需要Viewstate,您拥有的其他选项是添加动态onInit添加的控件,或者在每个Postback上重新创建它。
希望它有所帮助。
有关详细信息,请参阅Funkylife's comment。