初次用.Net写Form程序,遇见了这个恶心的问题。自己的一点心得,写出来给初学的朋友参考,也希望初学的朋友能够少走弯路。
问题描述:
我想实现多个下拉列表联动的功能,例如有三个下拉列表A、B、C,当选择了下拉列表A中的数据后,下拉列表B中的数据发生相应的变化,选择下拉列表的B时下拉列表C的数据发生相应的变化。当然是采用ComboBox的DataSource属性绑定数据啦。结果当我选择下拉列表A的时候,系统抛出异常“设置 DataSource 属性后无法修改项集合”。
解决问题:
于是苦思冥想,上网查找资料,结果都没有满意的答案。最后还是查看帮助手册,也没有明确的答案。但是我从手册上看到这样一句话“实现 IList 接口的对象,如 DataSet 或 Array。默认为空引用(在 Visual Basic 中为 Nothing)。 ”,请注意我标红的那句话。灵感突现,再清除下拉列表项的时候首先将ComboBox.DataSource付空值“null”,问题果然就迎刃而解了。
我的代码:代码中标红的部分就是出问题的部分。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Collections;
using HRGJ.Logic;
namespace HRGJ
{
public partial class MemberForm : Form
{
#region Private Variables
private HrMemberBasic parentNode = new HrMemberBasic();
private HrMemberBasic recommenderNode = new HrMemberBasic();
private DataTable areaList = null;
#endregion
#region Public Properties
public HrMemberBasic ParentNode
{
get { return parentNode; }
set { parentNode = value; }
}
public HrMemberBasic RecommenderNode
{
get { return recommenderNode; }
set { recommenderNode = value; }
}
#endregion
public MemberForm()
{
InitializeComponent();
}
private void MemberForm_Load(object sender, EventArgs e)
{
if (this.areaList == null)
{
this.areaList = SysDic.GetAllByListCode("Area");
}
this.BindComboMembers();
this.BindCredentials();
this.BindArea(this.Combo_Country, 0);
//int countryID = (int)this.Combo_Country.SelectedValue;
//this.BindArea(this.Combo_Province, countryID);
//int provinceID = (int)this.Combo_City.SelectedValue;
//this.BindArea(this.Combo_City, provinceID);
}
#region protected Method
protected void BindComboMembers()
{
ArrayList itemList = new ArrayList();
for (int i = 1; i <= SysParameter.MaxNodeMembers; i++)
{
MyComboItem mItem = new MyComboItem();
mItem.ItemText = i.ToString() + "个会员资格";
mItem.ItemValue = i;
itemList.Add(mItem);
}
this.Combo_Members.DataSource = itemList;
this.Combo_Members.DisplayMember = "ItemText";
this.Combo_Members.ValueMember = "ItemValue";
}
protected void BindCredentials()
{
DataTable dt = SysDic.GetAllByListCode("Credentials");
this.Combo_Credentials.DataSource = dt;
this.Combo_Credentials.DisplayMember = "DicName";
this.Combo_Credentials.ValueMember = "DicID";
}
/// <summary>
/// 绑定区域下拉列表
/// </summary>
/// <param name="parentID"></param>
protected void BindArea(ComboBox combo_Area,int parentID)
{
if (combo_Area.Items.Count > 0)
{
combo_Area.DataSource = null;
combo_Area.Items.Clear();
}
DataRow[] dList = areaList.Select("ParentID = " + parentID.ToString());
if (dList.Length>0)
{
ArrayList da = new ArrayList();
foreach (DataRow dr in dList)
{
SysDic dic = new SysDic(dr);
da.Add(dic);
}
combo_Area.DisplayMember = "DicName";
combo_Area.ValueMember = "DicID";
combo_Area.DataSource = da;
}
}
#endregion
private void Combo_Country_SelectionChangeCommitted(object sender, EventArgs e)
{
int countryId = (int)this.Combo_Country.SelectedValue;
this.BindArea(this.Combo_Province, countryId);
}
private void Combo_Province_SelectionChangeCommitted(object sender, EventArgs e)
{
int provinceID = (int)this.Combo_Province.SelectedValue;
this.BindArea(this.Combo_City, provinceID);
}
}
}
在.NET中遇到ComboBox设置DataSource后无法修改项集合的异常,通过将ComboBox.DataSource设为null,然后清空Items,成功解决问题。本文提供了一个实例,展示了在下拉列表联动功能中如何避免此错误。
1535

被折叠的 条评论
为什么被折叠?



