我有一些输入控件(文本)以这种方式在代码隐藏中创建,作为动态RadiobuttonList的一部分(以便文本框位于单选按钮旁边):
RadioButtonList radioOption = new RadioButtonList();
radiobuttonlist.Items.Add(new ListItem(dt.Rows[i][9].ToString() + " <input id=\"" + name + "\" runat=\"server\" type=\"text\" value=\"Enter text\" />")
所有控件都在UpdatePanel中。
每次有回发时,输入控件中的文本都会消失。
如何保留输入文本值?
有什么想法吗?非常感谢!
答案 0 :(得分:2)
必须在每次回发时重建控制树,包括部分回发 - 或者让它通过ControlState / ViewState重建。在这种情况下,在后续回发中,Items集合不会被重建(或被清除),并且在渲染阶段是空的。
对于这样的情况,我会将其视为:
1 这个应该可以工作,但可能没有。我常常对哪些控件真正支持ViewState以及在多大程度上因为使用总是让我感到困惑而感到困惑。在任何情况下,如果禁用ViewState,将不会工作 - 请记住,禁用页面(或父控件)的ViewState会一直禁用ViewState。此外,控件必须在适当的时间和加载到控制树中,并使用相同的控制路径/ ID(通常为Init或Load),以便它能正常运行请求ViewState。
#2的粗略想法:
将视图状态保存在包含的用户控件中(必须为此控件启用ViewState):
// ListItem is appropriately serializable and works well for
// automatic binding to various list controls.
List<ListItem> Names {
// May return null
get { return (List<ListItem>)ViewState["names"]; }
set { ViewState["names"] = value; }
}
在GenericDataSourceControl中(将GDS放入Markup以便它有一个很好的ID)选择事件:
void SelectEvent(sender e, GenericSelectArgs args) {
args.SetData(Names);
}
动态添加RadioButtonList(例如,在Control.OnLoad
中):
// Unless this NEEDS to be dynamic, move it into the declarative markup.
// The dynamic control must be added to the *same location* it was before the
// postback or there will be ugly invalid control tree creation exceptions.
var radioList = new RadioButtonList();
someControl.Controls.Add(radioList);
// To minimize problem with Control Tree creation this should be unique and
// consistent for dynamic controls.
radioList.ID = "radioList";
// Binding to the DS "declarative" usually works better I've found
radioList.DataSourceID = "idOfTheGDS";
// You -may- need to DataBind, depending upon a few factors - I will usually call
// DataBind in PreRender, but generally in the Load is OK/preferred.
// If it already binds, don't call it manually.
radioList.DataBind();
如果DataBinding工作正常,则应该可以禁用 RadioButtonList的ViewState ..但有时候ViewState应该在ControlState应用时使用,所以请确保它按照需要运行。