谁能帮我看一下?
先上个图吧:
对,就是省市选择!WPF做的。
我的想法是窗口加载时添加“省份”的选项,然后选择省份(触发SelectionChanged事件)添加“城市”,最后选择城市(同样触发SelectionChanged事件)添加“县”。
添加的时候是这样的:comboxCounty.ItemsSource = list; (list是集合)
我在第一次选择后,所有的Combobox都有选项,然后我再次选择“省份”会添加该省份下的城市,不过这时候发现触发了“城市”的SelectionChanged事件(为什么触发,我想应该是城市中的items有改变),但当前选择的item(SelectedItem)却是null,这时候程序就报错了,所以我想在选择省份的时候清空城市和县的items。于是我就用Items.Clear()方法,发现提示这样一个错误:,不解啊。请问怎么清除啊?或者说怎么解决我这个问题啊?求大神!
以下是我的代码(部分):
private void Window_Loaded(object sender, RoutedEventArgs e) {
DataTable dataTable = SQLHelper.ExecuteDataSet("select * from Province");
string[] colNames = { "proId", "proName" }; //声明string数组,并初始化。不指定长度
//遍历结果集
cobProvince.ItemsSource = returnArea(dataTable, colNames); //把集合中的对象赋给Combobox的ItemSource集合中
//cobProvince.SelectedIndex = 0;
//加载完后显示第一项。还是不要显示,因为在显示时会触发下面的SelectionChanged事件,然后查询数据库,这样增加了数据库的负担
}
/// <summary>
/// 省份加载后触发该事件,并加载该省份下的城市
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void cobProvince_SelectionChanged(object sender, SelectionChangedEventArgs e) {
Area areaProvince = (Area)cobProvince.SelectedItem; //表示被选中的对象
int proId = areaProvince.AreaId; //省份的Id
string strSql = "select * from City where proId = @proId;";
//返回结果集
DataTable dataTable = SQLHelper.ExecuteDataSet(strSql, new SqlParameter("@proId", proId));
string[] colNames = new string[3] { "cityId", "cityName", "proId" }; //声明string数组,并初始化。长度为3
//调用函数,遍历结果集
cobCity.ItemsSource = returnArea(dataTable, colNames);
}
/// <summary>
/// 城市加载完后触发该事件,并加载该城市下的县
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void cobCity_SelectionChanged(object sender, SelectionChangedEventArgs e) {
//cobCity.Items.Clear(); 此句会报错
Area areaCounty = (Area)cobCity.SelectedItem; //被选中的城市对象
int proId = areaCounty.AreaProId; //被选中对象的proId
string strSql = "select * from City where proId = @proId"; //根据proId得到结果
DataTable dataTable = SQLHelper.ExecuteDataSet(strSql, new SqlParameter("@proId", proId));
string[] colNames = { "cityId", "cityName", "proId" };
cobCounty.ItemsSource = returnArea(dataTable, colNames); //调用函数返回Area对象集
//cobCity.SelectedIndex = 0; //显示市的第一项,避免下面没有选中项
}
/// <summary>
/// 遍历结果集
/// </summary>
/// <param name="dataTable">结果集</param>
/// <param name="colNames">数据库列名</param>
/// <returns>返回Area对的集合</returns>
private List<Area> returnArea(DataTable dataTable, string[] colNames) {
List<Area> listArea = new List<Area>(); //Area集合对象
//遍历结果集的每一条
foreach (DataRow dataRow in dataTable.Rows) {
Area area = new Area();
area.AreaId = (int)dataRow[colNames[0]]; //返回的是DataRow类型,但proId是int类型
area.AreaName = (string)dataRow[colNames[1]];
if (colNames.Length > 2) {
area.AreaProId = (int)dataRow[colNames[2]]; //第三个数据库字段
}
listArea.Add(area); //把对象添加到集合中
}
return listArea;
}
[解决办法]