我有一个CustomControl,当在页面上使用时,需要将服务器端值作为属性。我试过这个......
<MyControl runat="server"
ID="MyControl1"
ContainerId="<%= this.ClientID %>" />
现在,在运行时(为了解释这个问题,假设我知道this.ClientID
的值是“ctl00_MyControl1”)如果我测试ContainerId
它的客户端值回复为“&lt;%= this.ClientID%&gt;”。
如果没有真正了解原因,我试过这个......
<MyControl runat="server"
ID="MyControl1"
ContainerId="<%# this.ClientID %>" />
但是测试ContainerId
的值显示该值为空!
更多阅读让我看到&lt;%#%&gt;机制是用于数据绑定,但很明显,我的控件没有这样做(假设我的CustomControl继承自TextBox)。
因此,我向DataBind()
添加了对我的CustomControl所包含的UserControl的OnLoad
事件的调用。
耶!有效。但是,在页面上处理某些事件时,对DataBind()
的调用会生成异常。例外是在另一个控件中,与MyControl1
包含在同一个UserControl容器中。
消息是
Selection out of range
Parameter name: value
并且堆栈跟踪完成如下......
at Telerik.Web.UI.RadComboBox.PerformDataBinding(IEnumerable dataSource)
at Telerik.Web.UI.RadComboBox.OnDataSourceViewSelectCallback(IEnumerable data)
at System.Web.UI.DataSourceView.Select(DataSourceSelectArguments arguments, DataSourceViewSelectCallback callback)
at Telerik.Web.UI.RadComboBox.OnDataBinding(EventArgs e)
at Telerik.Web.UI.RadComboBox.PerformSelect()
at System.Web.UI.WebControls.BaseDataBoundControl.DataBind()
at Telerik.Web.UI.RadComboBox.DataBind()
at System.Web.UI.Control.DataBindChildren()
at System.Web.UI.Control.DataBind(Boolean raiseOnDataBinding)
at System.Web.UI.Control.DataBind()
现在,我不正在寻找此异常的解决方案;我已将其包含在内,以证明我认为我的来电DataBind()
不一定是正确的做法。
所以,问题:
DataBind()
事件触发正确的操作以在运行时获取我的值时调用OnLoad
,如果是,DataBind()
答案 0 :(得分:1)
"`<%= this.ClientID %>`"
在渲染时调用,此时尚未设置ClientID
。
"`<%# this.ClientID %>`"
在控件或页面DataBind()
期间调用。
如果您打算使用最后一个,那么您应该确实调用DataBind()
并修复您的异常。