我正在使用Page_Load事件中的ChangeMode方法将FormView的CurrentMode设置为插入模式,如下所示:
if(!Page.IsPostBack)
{
MyFormView.ChangeMode(FormViewMode.Insert);
}
在我的FormView的插入模板中,我有一个DropDownList控件,其AutoPostBack属性设置为true。我还在插入模板中有几个其他DropDownList和TextBox控件。
每当我更改DropDownList的选择并发生回发时,我将丢失输入到控件中的所有值。奇怪的是,如果我在初始页面加载后的任何时候使用ChangeMode将FormView设置为插入模式我没有问题。我已经通过调试器逐步完成了代码,所有内容似乎都正确地发生了但是在DropDownList的事件处理程序运行之后的某些时候,似乎所有内容都重置了。
这里发生了什么?
更新: 我注意到我的FormView位于div标签内,其中runat =“server”和enableviewstate =“false”。一旦我为容器div启用了viewstate,我开始看到一个稍微不同的行为。在第一次回发后,FormView仍然不保留值,但现在后续的回发工作正常并保留值。
非常感谢任何想法。
答案 0 :(得分:2)
其他论坛的答案由Walter Wang [MSFT] - 2007年1月26日03:29 GMT
首先,问题似乎是数据告诉FormView 源控制数据已更改,因此它应该 重新绑定以获取新数据。这实际上不应该这样做 因为我们仍处于插入模式。我有一个解决方法 reference:从FormView继承以创建自己的FormView控件, 覆盖OnDataSourceViewChanged并将RequiresDataBinding设置为false 如果我们处于插入模式:
public class MyFormView : FormView { protected override void OnDataSourceViewChanged(object sender, EventArgs e) { if (this.CurrentMode == FormViewMode.Insert) { this.RequiresDataBinding = false; } else { base.OnDataSourceViewChanged(sender, e); } } }
我已经在我这边测试了它,看起来工作正常。请给它一个 试着让我知道结果。
答案 1 :(得分:0)
尝试
MyFormView.EnableViewState = true;
答案 2 :(得分:0)
ViewState在PageLoad之前加载,我的猜测是通过更改PageLoad上的Mode重新创建另一组控件,即EditItemTemplate中的控件。如果它默认设置为编辑模式,并且您在PageLoad上取消注释该行,它是否会保留这些值?如果你不切换模式应该这样。
答案 3 :(得分:0)
FormView.ChangeMode(FormViewMode.Insert)
这必须工作,检查Id并使用intelisense?
我的例子是添加项目表单视图..
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
AddNewItemFormView.ChangeMode(FormViewMode.Insert)
End Sub
尝试在没有任何“if..then”的情况下在页面加载时执行此操作,如果它有效,您将知道这不是表达式,但可能是if内容或构造。 请记住使控件ID有意义,这样当您需要使用它们或通过intelisense调用它们时,它会更容易并且不太可能出错。
祝你好运。
:)
答案 4 :(得分:0)
我在EditItem
模板中没有保留类似的viewstate问题。
设置EnableViewState = true
也没有帮助。
我所做的是获取OnUpdated()
函数,并在函数的最后,
e.KeepInEditMode = true;
希望这会有所帮助..
答案 5 :(得分:-1)
尝试在Page Init或Prerender事件上更改模式