百度搜索网站带图片,运营笔记 wordpress,网站推广公司排名点击查看,字体设计软件免费1#xff0c;给SelectedValue赋值时#xff0c;如果Items中没有该项#xff0c;则报XXX异常#xff1b; 2#xff0c;在绑定时#xff0c;如果数据源返回null#xff0c;它将不做任何动作#xff0c;而我们一般习惯清空#xff1b; 3#xff0c;在绑定到数据源#… 1给SelectedValue赋值时如果Items中没有该项则报XXX异常 2在绑定时如果数据源返回null它将不做任何动作而我们一般习惯清空 3在绑定到数据源而数据源参数依赖于别的控件时会触发两次数据源绑定。 我的解决方法就是重载DropDownList比较菜下面详细说说这三个小问题 1比如某个商品属于某个分类然后分类被删除了而商品表中记录的还是原来类别的ID在绑定DropDownList时就会报那个常见的异常。这个比较头疼因为没有太好的办法使用代码控制。我们可以通过重载SelectedValue属性和PerformDataBinding方法来解决 代码 private const String ExceptionString 异常 ; private String cachedSelectedValue; /// summary /// 已重载。加上未添加到列表的项。 /// /summary public override string SelectedValue { get { return base.SelectedValue; } set { if (Items.FindByValue(value) null) { // 列表项中并没有该选项自动加入并打上异常标识 Items.Add( new ListItem(value ExceptionString, value)); cachedSelectedValue value; } base.SelectedValue value; } } /// summary /// 绑定数据 /// /summary /// param namedataSource/param protected override void PerformDataBinding(IEnumerable dataSource) { base.PerformDataBinding(dataSource); if (cachedSelectedValue ! null) { ClearSelection(); // 重新设置选中项 ListItem item Items.FindByValue(cachedSelectedValue); if (item null) { item new ListItem(cachedSelectedValue ExceptionString, cachedSelectedValue); Items.Add(item); } item.Selected true; } } 2在省市两级下拉联动的时候如果第一级选择直辖市没有下一级城市第二个下拉就应该显示没有子城市或者就显示直辖市或者干脆清空。而默认情况下DropDownList是不做任何事情的。这个可以重载PerformSelect实现含第三点的实现代码 代码 private Boolean selecting false; /// summary /// 已重载。避免绑定时重入该方法 /// /summary protected override void PerformSelect() { if (selecting) return; selecting true; if (! this.AppendDataBoundItems) { // DropDownList在绑定时如果数据源返回null它将不做任何动作而我们一般习惯清空 this.Items.Clear(); } base.PerformSelect(); selecting false; } 3 仍然是省市两级下拉联动的例子这两个DropDownList分别绑定两个ObjectDataSource对应实体类的Area.FindAllByParentID(Int32 parentID)。第一个下来可以设定参数为固定值0表示顶级地区 asp:Parameter DefaultValue 0 Name parentID Type Int32 / 第二个下拉可以使用ControlParameter依赖于第一个下拉的选择 asp:ControlParameter ControlID DropDownList1 Name parentID PropertyName SelectedValue Type Int32 / 这个时候如果在FindAllByParentID下断点会发现第二个下拉触发了两次绑定 经过一番探索发现首先是第二个DropDownList的DataBind触发了ObjectDataSource的Select而在准备Select的参数的时候需要调用参数的UpdateValue去取依赖控件的值正是这个UpdateValue触发了DataSourceChanged实际比较复杂这里为了易懂从简然后再次Select…… 看看基类 DataBoundControl的PerformSelect方法 代码 protected override void PerformSelect() { if ( this.DataSourceID.Length 0) { this.OnDataBinding(EventArgs.Empty); } DataSourceView data this.GetData(); this._arguments this.CreateDataSourceSelectArguments(); this._ignoreDataSourceViewChanged true; base.RequiresDataBinding false; this.MarkAsDataBound(); data.Select( this._arguments, new DataSourceViewSelectCallback( this.OnDataSourceViewSelectCallback)); } 很明显_ignoreDataSourceViewChanged字段就是专门解决这个问题的。也就是说控件团队已经意识到会存在这种问题所以在这里留了一手。但是为什么这一手没有生效呢 我们来看看DropDownList的父类 ListControl杯具它重载了PerformSelect protected override void PerformSelect() { this.OnDataBinding(EventArgs.Empty); base.RequiresDataBinding false; base.MarkAsDataBound(); this.OnDataBound(EventArgs.Empty); } 并且没有调用父类的方法……这也说明了ListControl之下的几个控件BulletedList、CheckBoxList、 DropDownList、ListBox、RadioButtonList全部都存在同样的问题当然解决方法也是一样的。 两年多没写博客了最近对技术有点伤感 我不相信神话我只相信汗水我不相信命运我只相信双手 分类: C# 本文转自大石头博客园博客原文链接http://www.cnblogs.com/nnhy/archive/2010/05/04/1727576.html如需转载请自行联系原作者