65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.46/5 (5投票s)

2007年8月24日

2分钟阅读

viewsIcon

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 后,您必须手动设置选择,因为您新的数据项可能没有之前的选择,这可能会引发另一个异常,所以我决定将选择权留给您。

© . All rights reserved.