C# WPF DataGrid控件实现三级联动
利用DataGrid控件实现联动的功能,在数据库客户软件中是随处可见的,然而网上的资料却是少之又少,令人崩溃。
本篇博文将介绍利用DataGrid控件模板定义的三个ComboBox实现“省、市、区”的三级联动。步骤如下:
一.定义地域信息类(注意包含System.ComponentModel命名空间)
- class RegionInfo : INotifyPropertyChanged //地区信息
- {
- private string _province;//省
- private string _city;//市
- private string _area;//区
- public event PropertyChangedEventHandler PropertyChanged;
- public string Province
- {
- get { return _province; }
- set
- {
- _province = value;
- PropertyChanged(this, new PropertyChangedEventArgs("Province"));
- }
- }
- public string City
- {
- get { return _city; }
- set
- {
- _city = value;
- PropertyChanged(this, new PropertyChangedEventArgs("City"));
- }
- }
- public string Area
- {
- get { return _area; }
- set
- {
- _area = value;
- PropertyChanged(this, new PropertyChangedEventArgs("Area"));
- }
- }
- public RegionInfo(string province, string city, string area)//构造函数
- {
- _province = province;
- _city = city;
- _area = area;
- }
- }
二.编写DataGrid控件的XAML代码
- <!--AutoGenerateColumns="False"这句话告诉控件不自动生成列,是必要的,如果没有,控件会更具数据源自动生成列,这个在我们这种写法中看起来就有重复的两列数据-->
- <DataGrid x:Name="dataGrid" ItemsSource="{Binding}" AutoGenerateColumns="False" HorizontalAlignment="Left" VerticalAlignment="Top" Height="319" Width="302">
- <DataGrid.Columns>
- <!--省-->
- <DataGridTemplateColumn Header="省" Width="100">
- <!--显示模式-->
- <DataGridTemplateColumn.CellTemplate>
- <DataTemplate>
- <TextBlock Text="{Binding Path=Province ,Mode=TwoWay}"></TextBlock>
- </DataTemplate>
- </DataGridTemplateColumn.CellTemplate>
- <!--编辑模式-->
- <DataGridTemplateColumn.CellEditingTemplate>
- <DataTemplate>
- <ComboBox x:Name="ComboBoxProvince" DropDownClosed="ProvinceDropDownClosed" Loaded="ProvinceLoaded" Text="{Binding Path=Province ,Mode=TwoWay}" DisplayMemberPath="Province" ></ComboBox>
- </DataTemplate>
- </DataGridTemplateColumn.CellEditingTemplate>
- </DataGridTemplateColumn>
- <!--市-->
- <DataGridTemplateColumn Header="市" Width="100">
- <!--显示模式-->
- <DataGridTemplateColumn.CellTemplate>
- <DataTemplate>
- <TextBlock Text="{Binding Path=City ,Mode=TwoWay}"></TextBlock>
- </DataTemplate>
- </DataGridTemplateColumn.CellTemplate>
- <!--编辑模式-->
- <DataGridTemplateColumn.CellEditingTemplate>
- <DataTemplate>
- <ComboBox x:Name="ComboBoxCity" DropDownClosed="CityDropDownClosed" Loaded="CityLoaded" Text="{Binding Path=City,Mode=TwoWay}" DisplayMemberPath="City" ></ComboBox>
- </DataTemplate>
- </DataGridTemplateColumn.CellEditingTemplate>
- </DataGridTemplateColumn>
- <!--区-->
- <DataGridTemplateColumn Header="区" Width="100">
- <!--显示模式-->
- <DataGridTemplateColumn.CellTemplate>
- <DataTemplate>
- <TextBlock Text="{Binding Path=Area}"></TextBlock>
- </DataTemplate>
- </DataGridTemplateColumn.CellTemplate>
- <!--编辑模式-->
- <DataGridTemplateColumn.CellEditingTemplate>
- <DataTemplate>
- <ComboBox x:Name="ComboBoxArea" DropDownClosed="AreaDropDownClosed" Loaded="AreaLoaded" Text="{Binding Path=Area}" DisplayMemberPath="Area" ></ComboBox>
- </DataTemplate>
- </DataGridTemplateColumn.CellEditingTemplate>
- </DataGridTemplateColumn>
- </DataGrid.Columns>
- </DataGrid>
三.为DataGrid控件准备数据源对象
对象声明
- ObservableCollection<RegionInfo> regionInfoList = new ObservableCollection<RegionInfo>();//DataGrid的数据源
对象添加
- //DataGrid初始绑定数据
- regionInfoList.Add(new RegionInfo("广东省", "深圳市", "罗湖区"));
- regionInfoList.Add(new RegionInfo("广东省", "深圳市", "南山区"));
对象绑定
- dataGrid.ItemsSource = regionInfoList;//绑定数据源
四.为DataGrid控件的模板列加载时提供选项
对象声明
- ObservableCollection<RegionInfo> regionInfoSelectList = new ObservableCollection<RegionInfo>();//用于DataGrid的模板列加载时提供选项
对象添加
- //三级联动数据项
- regionInfoSelectList.Add(new RegionInfo("广东省", "深圳市", "罗湖区"));
- regionInfoSelectList.Add(new RegionInfo("广东省", "深圳市", "南山区"));
- regionInfoSelectList.Add(new RegionInfo("广东省", "潮州市", "湘桥区"));
- regionInfoSelectList.Add(new RegionInfo("广东省", "潮州市", "枫溪区"));
- regionInfoSelectList.Add(new RegionInfo("湖北省", "武汉市", "江夏区"));
- regionInfoSelectList.Add(new RegionInfo("湖北省", "武汉市", "武昌区"));
五.在DataGrid模板列加载的时候实时更新其数据源并绑定到ComboBox的选项中
- /// <summary>
- /// ProvinceLoaded 省份下拉列表框初始化,绑定数据源
- /// </summary>
- void ProvinceLoaded(object sender, RoutedEventArgs e)
- {
- ComboBox curComboBox = sender as ComboBox;
- //为下拉控件绑定数据源,并选择原选项为默认选项
- string text = curComboBox.Text;
- //去除重复项查找,跟数据库连接时可以让数据库来实现
- var query = regionInfoSelectList.GroupBy(p => p.Province).Select(p => new { Province = p.FirstOrDefault().Province });
- int itemcount = 0;
- curComboBox.SelectedIndex = itemcount;
- foreach (var item in query.ToList())
- {
- if (item.Province == text)
- {
- curComboBox.SelectedIndex = itemcount;
- break;
- }
- itemcount++;
- }
- curComboBox.ItemsSource = query;
- curComboBox.IsDropDownOpen = true;//获得焦点后下拉
- }
- /// <summary>
- /// CityLoaded 市下拉列表框初始化,绑定数据源
- /// </summary>
- void CityLoaded(object sender, RoutedEventArgs e)
- {
- //获得当前选中项的省份信息
- string province = (dataGrid.SelectedItem as RegionInfo).Province;
- //查找选中省份下的市作为数据源
- var query = (from l in regionInfoSelectList
- where (l.Province == province)
- group l by l.City into grouped
- select new { City = grouped.Key });
- ComboBox curComboBox = sender as ComboBox;
- //为下拉控件绑定数据源,并选择原选项为默认选项
- string text = curComboBox.Text;
- //去除重复项查找,跟数据库连接时可以让数据库来实现
- int itemcount = 0;
- curComboBox.SelectedIndex = itemcount;
- foreach (var item in query.ToList())
- {
- if (item.City == text)
- {
- curComboBox.SelectedIndex = itemcount;
- break;
- }
- itemcount++;
- }
- curComboBox.ItemsSource = query;
- curComboBox.IsDropDownOpen = true;//获得焦点后下拉
- }
- /// <summary>
- /// AreaLoaded 区下拉列表框初始化,绑定数据源
- /// </summary>
- void AreaLoaded(object sender, RoutedEventArgs e)
- {
- string province = (dataGrid.SelectedItem as RegionInfo).Province;
- string city = (dataGrid.SelectedItem as RegionInfo).City;
- //查找选中省份下的市作为数据源
- var query = (from l in regionInfoSelectList
- where (l.Province == province && l.City == city)
- group l by l.Area into grouped
- select new { Area = grouped.Key });
- ComboBox curComboBox = sender as ComboBox;
- //为下拉控件绑定数据源,并选择原选项为默认选项
- string text = curComboBox.Text;
- //去除重复项查找,跟数据库连接时可以让数据库来实现
- int itemcount = 0;
- curComboBox.SelectedIndex = itemcount;
- foreach (var item in query.ToList())
- {
- if (item.Area == text)
- {
- curComboBox.SelectedIndex = itemcount;
- break;
- }
- itemcount++;
- }
- curComboBox.ItemsSource = query;
- curComboBox.IsDropDownOpen = true;//获得焦点后下拉
- }
做到这一步基本上算是做完了,但是编译运行后会发现在选择省或者市的时候,后面的选项并没有做相应的改变,这是上一篇文章 C# WPF DataGrid控件同行编辑的实时更新问题 所述的问题,所以还需最后一步
六.参考 C# WPF DataGrid控件同行编辑的实时更新问题 解决更新问题(懒得再写一遍了哈哈)
哦哦,更新代码分别写在
- /// <summary>
- /// CityDropDownClosed 市下拉列表框选择改变刷新
- /// </summary>
- private void CityDropDownClosed(object sender, EventArgs e)
- {
- }
- /// <summary>
- /// ProvinceDropDownClosed 省份下拉列表框选择改变刷新
- /// </summary>
- private void ProvinceDropDownClosed(object sender, EventArgs e)
- {
- }
- /// <summary>
- /// AreaDropDownClosed 区下拉列表框选择改变刷新
- /// </summary>
- private void AreaDropDownClosed(object sender, EventArgs e)
- {
- }
这三个函数中。如果还想再只能点,在省下拉列表选择后,市下拉列表下拉。市下拉列表选择后,区下拉列表下拉,则可以参考 C# WPF 模拟键盘输入与UI控件进行交互 这篇文章,然后在上面提到的省、市两个下拉列表框中模拟键盘按下“TAD”键即可。
C# WPF DataGrid控件实现三级联动的更多相关文章
- WPF DataGrid 控件的运用
WPF DataGrid 控件的运用 运行环境:Window7 64bit,.NetFramework4.61,C# 6.0: 编者:乌龙哈里 2017-02-23 参考: King Cobra 博客 ...
- NPOI导出WPF DataGrid控件显示数据
最近做个项目,需要导出DataGrid显示的数据,中间遇到了不少的坑,在此纪录一下,方便以后查看,也希望能给用到的人,一点帮助. 导出DataGrid显示的数据,并不是导出DataGrid的Items ...
- timer控件、三级联动
timer控件: 实现时间日期自增长: using System; using System.Collections.Generic; using System.ComponentModel; usi ...
- 【2017-05-05】timer控件、三级联动、帐号激活权限设置
一.Timer控件 Timer实际就是一个线程控件. 属性:Enabled 是否被启用 Interval 多长时间执行一次控件中的代码 事件: Tick 事件中放要执行的代码. ...
- timer控件、三级联动、帐号激活权限设置
一.Timer控件 Timer实际就是一个线程控件. 属性:Enabled 是否被启用 Interval 多长时间执行一次控件中的代码 事件: Tick 事件中放要执行的代码. ...
- WPF DataGrid控件中某一列根据另一个文本列的值显示相应的模板控件
之前做项目的时候需要实现这样一个功能.WPF DataGrid有两列,一列为"更新状态”列,一列为"值"列,如果"更新状态"列的值为“固定值更新”,则 ...
- WPF:获取DataGrid控件单元格DataGridCell
转载:http://blog.csdn.net/jhqin/article/details/7645357 /* ------------------------------------------- ...
- wpf研究之道-datagrid控件(1)
"想要说些什么 又不知从何说起",每当想要写一些关于wpf的文章,总是沉思良久,怕自己写不好.今天我想要说的是wpf中datagrid控件.我们先来看看它在整个类的层次结构: ...
- wpf研究之道——datagrid控件分页
这是我们的datagrid分页效果图,有上一页,下一页,可以跳到任何一页.当页码比较多的时候,只显示几页,其余用点点,界面实现如下: <!--分页--> <StackPanel Or ...
随机推荐
- bzoj 4034 [HAOI2015]树上操作 入栈出栈序+线段树 / 树剖 维护到根距离和
题目大意 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个 操作,分为三种: 操作 1 :把某个节点 x 的点权增加 a . 操作 2 :把某个节点 x 为根的子树中所有点的点权都 ...
- luogu 1355 神秘大三角 判断点和三角形的位置关系 面积法 叉积法
题目链接 题目描述 判断一个点与已知三角形的位置关系. 输入输出格式 输入格式: 前三行:每行一个坐标,表示该三角形的三个顶点 第四行:一个点的坐标,试判断该点与前三个点围成三角形的位置关系 (详见样 ...
- 开发使用mysql的一些必备知识点整理(三)高级
简介 实体与实体之间有3种对应关系,这些关系也需要存储下来 在开发中需要对存储的数据进行一些处理,用到内置的一些函数 视图用于完成查询语句的封装 事务可以保证复杂的增删改操作有效 关系 创建成绩表sc ...
- IP分段小记
192.168.0.1 个人电脑:0.2-0.50 硬件开发板:0.51-0.100 机器人工控机:0.101-0.200 激光雷达:192.168.254.51~100 编码器板子:192.168. ...
- shell细节决定高度
1.文件测试操作符 -f[file]:文件存在且为普通文件则为真; -d[directory]:文件存在且为目录文件则为真; -s[size]:文件存在且为文件大小不为0则为真; -e[exist]: ...
- PyTorch学习笔记之初识word_embedding
import torch import torch.nn as nn from torch.autograd import Variable word2id = {'hello': 0, 'world ...
- Maven的POM简单理解
以下引用自官方的POM介绍https://maven.apache.org/guides/introduction/introduction-to-the-pom.html: 一.什么是POM? 项目 ...
- 这道js面试题号称99%的人会做错
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- DELPHI 10.2(TOKYO) FOR LINUX的兼容性说明
DELPHI 10.2(TOKYO) FOR LINUX的兼容性说明 自DELPHI 10.2(TOKYO) 始开始支持Linux . Delphi Linux 编译器 64 位 Linux 平台支持 ...
- CSRF攻击 & XSS攻击
之前有几篇文章写了 SQL注入类问题: http://www.cnblogs.com/charlesblc/p/5987951.html (介绍) http://www.cnblogs.com/cha ...