无错误的DropDownList用于级联下拉列表






3.46/5 (5投票s)
2007年8月24日
2分钟阅读

50427
仅针对 Eval()、XPath() 和 Bind() 等数据绑定方法,只能在数据绑定控件的上下文中才能使用。
引言
如果此解决方案已由 CodeProject 中的某位作者发布,并且是重复的,我深表歉意,但我找到了解决上述问题的方法,并在此展示以供您参考。
背景
我们总是需要级联下拉列表,例如选择国家/地区下拉列表,然后选择取决于所选国家/地区的州下拉列表。在 FormView 模板或任何 UserControls 中,级联下拉列表会因错误而失败:“databinding 方法,如 Eval()、XPath() 和 Bind(),只能在数据绑定控件的上下文中才能使用”。
现在 DropDownList 的 DataBind 方法调用 ASPX 页面的 CodeGenerator 定义的事件,该事件调用 Page.GetDataItem(),如果它未由数据绑定容器调用,则会引发异常。
最终 ASPX 的数据绑定被设计成只能由数据绑定容器(FormView 等)调用,如果您调用 FormView 的 DataBind,则不会引发异常。
然而,忘记历史吧,让我们进入解决方案。
使用代码
与其使用 asp:DropDownList,我们建议使用从 DropDownList 派生并包含一些额外代码的 Web 自定义控件 **“DataBoundDropDownList”**。如下所示...
public class DataBoundDropDownList : DropDownList
{
#region Method protected override void OnDataBinding(EventArgs e)
protected override void OnDataBinding(EventArgs e)
{
try
{
base.OnDataBinding(e);
}
catch (InvalidOperationException)
{
this.GetData().Select(
DataSourceSelectArguments.Empty,
new DataSourceViewSelectCallback(DoSelect));
}
}
#endregion
private void DoSelect(IEnumerable data)
{
this.PerformDataBinding(data);
}
}
就这样了,各位,尽情享受吧,忘记这个令人恼火的错误,它已经填满了所有讨论论坛,但却没有解决方案 !!!!!! 并且在 Microsoft 报告的 Bug 总是被标记为“按设计解决”,这意味着,好吧,没有解决方案,只需忘记它 !!! 并更改您的代码,更改您的客户,更改您的生活方式,但我们不会提供解决方案 !!!!!
当引发 InvalidOperationException 类型的异常时,它会捕获并重新绑定 DropDownList,如传统的 ListControl 类中定义的那样。
我使用了逆向工程,但只是为了解决这段代码。
警告 !!!!
数据绑定后,您之前的选择将会丢失,在调用 DataBind 后,您必须手动设置选择,因为您新的数据项可能没有之前的选择,这可能会引发另一个异常,所以我决定将选择权留给您。