谁能帮我看一下?

softneo 2013-04-13 07:00:31
先上个图吧:

对,就是省市选择!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;
}


...全文
182 8 打赏 收藏 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
#blackheart 2013-04-15
  • 打赏
  • 举报
回复
引用 7 楼 Huang__Xiao 的回复:
引用 6 楼 NianHui 的回复:C# code?12345678910111213141516171819 /// <summary> /// 城市加载完后触发该事件,并加载该城市下的县 /// </summary> /// <param name="sender"></param> /// <p……
没什么不好的,逻辑就应该是这样的呀,城市没有,下级的县怎么能有,即使有也应该给清空的
softneo 2013-04-14
  • 打赏
  • 举报
回复
引用 6 楼 NianHui 的回复:
C# code?12345678910111213141516171819 /// <summary> /// 城市加载完后触发该事件,并加载该城市下的县 /// </summary> /// <param name="sender"></param> /// <param name="e"></par……
我有这样判断过,但是在选择“省份”的时候,“县”却还在(“城市”没有)。 不过我在if里面加了个:
cobCounty.ItemsSource = null
,不知道这样做好不好。也相当于清空了哈?
softneo 2013-04-14
  • 打赏
  • 举报
回复
引用 3 楼 KumaPower 的回复:
貌似用 Items.Clear() 就不能用 ItemsSource ,你可以试试前面foreach集合,一个个Add,后面就应该能用Items.Clear()了。 Ps:没有完整看,只针对Items.Clear()问题
add是可以啊,但是听说不符合WPF的做法,ADD那是winform的做法。。
#blackheart 2013-04-14
  • 打赏
  • 举报
回复

        /// <summary>
        /// 城市加载完后触发该事件,并加载该城市下的县
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void cobCity_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            Area areaCounty = cobCity.SelectedItem as Area;   //被选中的城市对象
            if (areaCounty==null)
            {
                return;
            }
            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;  //显示市的第一项,避免下面没有选中项
        }
#blackheart 2013-04-14
  • 打赏
  • 举报
回复
SelectionChanged事件中加些判断, 如果是null就不执行它就可以了,
Bonjour-你好 2013-04-13
  • 打赏
  • 举报
回复
貌似用 Items.Clear() 就不能用 ItemsSource ,你可以试试前面foreach集合,一个个Add,后面就应该能用Items.Clear()了。 Ps:没有完整看,只针对Items.Clear()问题
softneo 2013-04-13
  • 打赏
  • 举报
回复
引用 1 楼 Huang__Xiao 的回复:
或者说我的哪个地方还需要改进,谢谢你们了!
程序在第一次启动时不会触发任何SelectionChanged事件,但是在选完选项后,再次选择省份的时候,就会触发SelectionChanged的时候,这时候其它的Combobox中的当前选项为null,于是在取值的时候就报错了。 请问怎么在选择省份的时候不去触发‘城市的’SelectionChanged事件,或者有什么办法清空选项?
softneo 2013-04-13
  • 打赏
  • 举报
回复
或者说我的哪个地方还需要改进,谢谢你们了!

8,757

社区成员

发帖
与我相关
我的任务
社区描述
WPF/Silverlight相关讨论
社区管理员
  • WPF/Silverlight社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧