这次的案例是做两个ListBox的联动,例如第一个ListBox显示的是全国各省份的名称,然后在用户点击某一个省份的同时,第二个ListBox显示出该省份的各城市的名字。
①这需要在数据库中创建一张表格,来保存这些省份以及城市的信息,表格如图:
②然后利用Insert语句插入数据,这些Insert语句都以及提前准备好了的,只需“新建查询”,然后在执行就好了,如图:
③我们在该项目再创建一个类,用来保存Area的各属性:
class Area { public int AreaId { get; set; } public int AreaPid { get; set; } public string AreaName { get; set; } }
④成功插入之后,我们先写第一个ListBox的代码,这个代码是在窗口加载时候就自动完成的,所以我们写在Window_Loaded事件中:
private void Window_Loaded(object sender, RoutedEventArgs e) { DataTable dt = SqlHelper.ExecuteDataTable("select * from AreaFull where AreaPid = 0"); List<Area> list = new List<Area>(); foreach (DataRow dr in dt.Rows) { Area area = new Area();//因为对象是引用类型,这个对象一定要放到foreach循环里面来申请,才不会造成重复出错,相当于重置对该对象 area.AreaPid= (int)dr["AreaPid"]; area.AreaName=(string)dr["AreaName"]; area.AreaId = (int)dr["AreaId"]; list.Add(area); } listBox1.ItemsSource = list; }
◇注意:这里很关键的一步,在实例化area类的过程时,一定要在foreach中实例化,这样才不会造成重复显示的错误,因为对象是引用类型。
◇ListBox的ItemsSource的属性是用来确定绑定的数据源的,我们这里利用的是集合类List来存储数据源,然后通过ItemsSource属性绑定到ListBox上。
◇然后一定要在listbox的xaml代码中加上DisplayMemberPath="AreaName",这样才会显示出数据。
⑤完成了第一个ListBox,第二个ListBox也就照葫芦画瓢了,只不过第二个ListBox的代码是在我们选择第一个代码的某项时候触发的,所以我们代码将会写在listBox1_SelectionChanged的事件中:、
private void listBox1_SelectionChanged(object sender, SelectionChangedEventArgs e) { Area area = (Area)listBox1.SelectedItem; DataTable dt = SqlHelper.ExecuteDataTable("select * from AreaFull where AreaPid = @Areaid", new SqlParameter("@Areaid", area.AreaId)); List<Area> listCity = new List<Area>(); foreach (DataRow dr in dt.Rows) { Area areaCity = new Area();//此处同上原理 areaCity.AreaPid = (int)dr["AreaPid"]; areaCity.AreaName = (string)dr["AreaName"]; listCity.Add(areaCity); } listBox2.ItemsSource = listCity; }
◇完了之后也别忘记添加DisplayMemberPath="AreaName"。
这样就OK啦,快试试吧~