WPF DataGrid使用 自动显示行号、全选、三级联动、拖拽
1.DataGrid的使用自动显示行号(修复删除行时行号显示不正确)
dgTool.LoadingRow += new EventHandler<DataGridRowEventArgs>(dgTool_LoadingRow);
dgTool.UnloadingRow +=new EventHandler<DataGridRowEventArgs>(dgTool_UnloadingRow); void dgTool_LoadingRow(object sender, DataGridRowEventArgs e)
{
e.Row.Header = e.Row.GetIndex() + 1;
} void dgTool_UnloadingRow(object sender, DataGridRowEventArgs e)
{
dgTool_LoadingRow(sender, e);
if (dgTool.Items != null)
{
for (int i = 0; i < dgTool.Items.Count; i++)
{
try
{
DataGridRow row = dgTool.ItemContainerGenerator.ContainerFromIndex(i) as DataGridRow;
if (row != null)
{
row.Header = (i + 1).ToString();
}
}
catch { }
}
} }
2.DataGrid新建一行,并为需要的单元格提供默认值
dgTool.InitializingNewItem += new InitializingNewItemEventHandler(dgTool_InitializingNewItem);
dgTool.RowEditEnding += new EventHandler<DataGridRowEditEndingEventArgs>(dgTool_RowEditEnding); private void dgTool_InitializingNewItem(object sender, InitializingNewItemEventArgs e)
{
//这里的实体为你绑定数据源中的实体类型
EntityType newItem = e.NewItem as EntityType;
newItem.ID = dgTool.Items.Count - 2;
}
//这里是为了解决添加完成一行数据之后,行号显示不正确(当然还可以做其他操作)
void dgTool_RowEditEnding(object sender, DataGridRowEditEndingEventArgs e)
{
if (dgTool.Items != null)
{
for (int i = 0; i < dgTool.Items.Count; i++)
{ try
{
DataGridRow row = dgTool.ItemContainerGenerator.ContainerFromIndex(i) as DataGridRow;
if (row != null)
{
row.Header = (i + 1).ToString();
}
}
catch { }
}
}
}
3.DataGrid实现全选和单选
1)DataGrid绑定数据实体类Entity

public class Entity : INotifyPropertyChanged
{ //标记是否删除
private bool isChecked = false;
public bool IsChecked
{
get
{
return isChecked;
}
set
{
isChecked = value;
NotifyPropertyChanged("IsChecked");
}
} //序号
private int id = 0;
public int ID
{
get { return id; }
set
{
id = value;
NotifyPropertyChanged("ID");
}
} public event PropertyChangedEventHandler PropertyChanged; public void NotifyPropertyChanged(string propertyName)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(propertyName));
}
} }

2)前台界面XAML
<DataGrid x:Name="dgTool" Grid.Row="2" SelectionChanged="dgTool_SelectionChanged" RowHeaderWidth="50" FontFamily="Microsoft YaHei" FontSize="16" FontWeight="Normal" SelectionMode="Single" AutoGenerateColumns="False" CanUserAddRows="True" CanUserDeleteRows="True" IsReadOnly="False" CanUserSortColumns="False" AlternatingRowBackground="LightGray">
<DataGrid.ColumnHeaderStyle>
<Style TargetType="DataGridColumnHeader">
<Setter Property="HorizontalContentAlignment" Value="Center">
</Setter>
</Style>
</DataGrid.ColumnHeaderStyle>
<DataGrid.Columns>
<DataGridTemplateColumn>
<DataGridTemplateColumn.Header>
<CheckBox Name="selectAll_checkBox" Content="全选" IsThreeState="True" HorizontalAlignment="Center" Click="selectAll_checkBox_Click" />
</DataGridTemplateColumn.Header>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<CheckBox Name="select_checkBox" IsChecked="{Binding Path=IsChecked}" Click="select_checkBox_Click"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTextColumn Header="ID" Width="*" Binding="{Binding Path=ID}"/>
</DataGrid.Columns> </DataGrid>
3)后台事件
int count = 0;
private void select_checkBox_Click(object sender, RoutedEventArgs e)
{
//因为我前台做的是单项绑定,所有要手动修改数据源IsChecked属性,因为我要统计勾选的个数
//做成双向绑定的话(将IsChecked="{Binding Path=IsChecked}" 改成 IsChecked="{Binding Path=IsChecked,Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"即可),就不需要手动修改IsChecked属性了,但还是要统计个数
var item = dgTool.SelectedItem;
if (item != null)
{
Entity entity = item as Entity;
if (entity == null) return;
if ((bool)((System.Windows.Controls.Primitives.ToggleButton)(sender)).IsChecked)
{
entity.IsChecked = true;
count++;
}
else
{
entity.IsChecked = false;
count--;
}
//根据勾选的个数,改变列头的状态 全选、全不选、部分选
CheckBox cb = this.FindName("selectAll_checkBox") as CheckBox;
cb.IsThreeState = true;
if (cb != null)
{
if (count == 0) cb.IsChecked = false;
List<Entity> source = dgTool.ItemsSource as List<Entity>;
if (source != null)
{
if (count == source.Count) cb.IsChecked = true;
else cb.IsChecked = null; }
} }
} private void selectAll_checkBox_Click(object sender, RoutedEventArgs e)
{
List<Entity> source = dgTool.ItemsSource as List<Entity>;
if (source == null) return;
bool? isThreeStatus = ((System.Windows.Controls.Primitives.ToggleButton)(sender)).IsChecked;
if (isThreeStatus == null) return;
if ((bool)isThreeStatus)
{
foreach (Entity each in source)
{
each.IsChecked = true;
}
count = source.Count;
}
else
{
foreach (Entity each in source)
{
each.IsChecked = false;
}
count = 0;
} }
4)删除按钮事件
//删除按钮事件
private void btnDelRows_Click(object sender, RoutedEventArgs e)
{
List<Entity> source = dgTool.ItemsSource as List<Entity>;
if (source == null) return;
int count = 0;
for (int i = 0; i < source.Count; i++)
{
Entity temp = source[i];
if (temp.IsChecked)
{
source.Remove(temp); //因为删除导致后面的项成为当前项
i--; //所有索引应该不变,由于后面i会加1,先减一
count++;
}
}
if (count == 0) MessageBox.Show("请选择要删除的行");
else
{
MessageBox.Show("共删除" + count + "条记录");
}
dgTool.Items.Refresh(); //对DataGrid刷新数据 如果DataGrid中添加了排序则只能用下面的进行刷新
ICollectionView dataView = CollectionViewSource.GetDefaultView(dgTool.ItemsSource);
dataView.SortDescriptions.Add(new SortDescription("ID", ListSortDirection.Ascending));
dataView.Refresh();
}
4.三级联动
1)业务实体

public class Entity : INotifyPropertyChanged
{ //标记是否删除
private bool isChecked = false;
public bool IsChecked
{
get
{
return isChecked;
}
set
{
isChecked = value;
NotifyPropertyChanged("IsChecked");
}
} //序号
private int id = 0;
public int ID
{
get { return id; }
set
{
id = value;
NotifyPropertyChanged("ID");
}
}
//省
private int provinceNo = 0;
public int ProvinceNo
{
get { return provinceNo; }
set
{
provinceNo = value;
NotifyPropertyChanged("ProvinceNo");
}
}
private string provinceName = string.Empty;
public string ProvinceName
{
get { return provinceName; }
set
{
provinceName = value;
NotifyPropertyChanged("ProvinceName");
}
} //市
private int cityNo = 0;
public int CityNo
{
get { return cityNo; }
set
{
cityNo = value;
NotifyPropertyChanged("CityNo");
}
}
private string cityName = string.Empty;
public string CityName
{
get { return cityName; }
set
{
cityName = value;
NotifyPropertyChanged("CityName");
}
} //县
private int countyNo = 0;
public int CountyNo
{
get { return countyNo; }
set
{
countyNo = value;
NotifyPropertyChanged("CountyNo");
}
}
private string countyName = string.Empty;
public string CountyName
{
get { return countyName; }
set
{
countyName = value;
NotifyPropertyChanged("CountyName");
}
} public event PropertyChangedEventHandler PropertyChanged; public void NotifyPropertyChanged(string propertyName)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(propertyName));
}
} }

2)前台界面

<DataGrid x:Name="dgTool" Grid.Row="2" SelectionChanged="dgTool_SelectionChanged" RowHeaderWidth="50" FontFamily="Microsoft YaHei" FontSize="16" FontWeight="Normal" SelectionMode="Single" AutoGenerateColumns="False" CanUserAddRows="True" CanUserDeleteRows="True" IsReadOnly="False" CanUserSortColumns="False" AlternatingRowBackground="LightGray" >
<DataGrid.ColumnHeaderStyle>
<Style TargetType="DataGridColumnHeader">
<Setter Property="HorizontalContentAlignment" Value="Center">
</Setter>
</Style>
</DataGrid.ColumnHeaderStyle>
<DataGrid.Columns>
<DataGridTemplateColumn>
<DataGridTemplateColumn.Header>
<CheckBox Name="selectAll_checkBox" Content="全选" IsThreeState="True" HorizontalAlignment="Center" Click="selectAll_checkBox_Click" />
</DataGridTemplateColumn.Header>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<CheckBox Name="select_checkBox" IsChecked="{Binding Path=IsChecked,Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Click="select_checkBox_Click"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTextColumn Header="ID" Width="*" Binding="{Binding Path=ID}"/>
<!--<DataGridComboBoxColumn x:Name="cbbProvinceName" Header="省" Width="*" TextBinding="{Binding Path=ProvinceName}" />-->
<DataGridTemplateColumn Header="省" Width="*">
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<ComboBox x:Name="cbbProvinceName" Text="{Binding Path=ProvinceName,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" IsSynchronizedWithCurrentItem="False" Loaded="cbbProvinceName_Loaded" SelectionChanged="cbbProvinceName_SelectionChanged" />
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate >
<TextBlock Text="{Binding Path=ProvinceName, Mode=OneWay}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Header="市" Width="*">
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<ComboBox x:Name="cbbCityName" Text="{Binding Path=CityName,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" IsSynchronizedWithCurrentItem="False" Loaded="cbbCityName_Loaded" SelectionChanged="cbbCityName_SelectionChanged">
</ComboBox>
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate >
<TextBlock Text="{Binding Path=CityName, Mode=OneWay}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn> <DataGridTemplateColumn Header="县" Width="*">
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<ComboBox x:Name="cbbCountyName" Text="{Binding Path=CountyName,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" IsSynchronizedWithCurrentItem="False" Loaded="cbbCountyName_Loaded" SelectionChanged="cbbCountyName_SelectionChanged" />
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate >
<TextBlock Text="{Binding Path=CountyName}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns> </DataGrid>

3)后台逻辑
int rowIndex = -1;
private void dgTool_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
rowIndex = ((System.Windows.Controls.DataGrid)((sender))).SelectedIndex;
}
处理省逻辑
private void cbbProvinceName_Loaded(object sender, RoutedEventArgs e)
{
var cbbProvinceNam = sender as ComboBox;
cbbProvinceNam.ItemsSource = provinceSource;
cbbProvinceNam.SelectedValuePath = "ProvinceNo";
cbbProvinceNam.DisplayMemberPath = "ProvinceName";
} private void cbbProvinceName_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
var cbbProvinceName = sender as ComboBox;
var rowData = source.ElementAt(rowIndex);
if (cbbProvinceName != null && cbbProvinceName.SelectedValue != null)
{
rowData.ProvinceNo = int.Parse(cbbProvinceName.SelectedValue.ToString());
} rowData.CityNo = -1;
rowData.CityName = string.Empty;
rowData.CountyNo = -1;
rowData.CountyName = string.Empty;
}
处理市逻辑
private void cbbCityName_Loaded(object sender, RoutedEventArgs e)
{
var cbbCityName = sender as ComboBox;
var rowData = source.ElementAt(rowIndex);
if (rowData != null)
{
if (String.IsNullOrEmpty(rowData.ProvinceName))
{
MessageBox.Show("请先选择省");
e.Handled = true;
return;
}
else
{
cbbCityName.ItemsSource = citySource;
cbbCityName.SelectedValuePath = "CityNo";
cbbCityName.DisplayMemberPath = "CityName";
}
}
} private void cbbCityName_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
var rowData = source.ElementAt(rowIndex);
rowData.CountyName = string.Empty;
rowData.CountyNo = -1;
}
处理县逻辑
private void cbbCountyName_Loaded(object sender, RoutedEventArgs e)
{
var cbbCountyName = sender as ComboBox;
var rowData = source.ElementAt(rowIndex);
if (rowData != null)
{
e.Handled = true;
return;
}
if (String.IsNullOrEmpty(rowData.ProvinceName))
{
MessageBox.Show("请先选择省");
e.Handled = true;
return;
}
else
{
if (string.IsNullOrEmpty(rowData.CityName))
{
MessageBox.Show("请先选择市");
e.Handled = true;
return;
}
else
{ cbbCountyName.ItemsSource = countySource;
cbbCountyName.DisplayMemberPath = "CountyName";
cbbCountyName.SelectedValuePath = "CountyNo"; }
}
} private void cbbCountyName_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
var cbbCountyName = sender as ComboBox;
var rowData = source.ElementAt(rowIndex);
if (cbbCountyName != null && cbbCountyName.SelectedValue != null)
rowData.CountyNo = int.Parse(cbbCountyName.SelectedValue.ToString());
}
WPF DataGrid使用 自动显示行号、全选、三级联动、拖拽的更多相关文章
- winedt设置自动显示行号[latex]
options--preferences--appearance 在show line numbers for modes下面的文本框里添加;Tex 这样新建或者打开tex文件的时候就自动显示行号了( ...
- vim显示行号、语法高亮、自动缩进的设置
转载自:http://blog.csdn.net/chuanj1985/article/details/6873830 在UBUNTU中vim的配置文件存放在/etc/vim目录中,配置文件名为v ...
- Ubuntu vim显示行号语法高亮自动缩进
配置文件名为Ubuntu vimrc在Fedora中vim的配置文件存放在/etc目录中,配置文件名为Ubuntu vimrc在终端 输入以下命令来编辑Ubuntu vimrc配置文件:sudo vi ...
- linux系统下Vi编辑器或者Vim编辑器设置显示行号、自动缩进、调整tab键宽度的技巧?
工作中嫌vim 中一个tab键的宽度太大,linux系统默认,没改之前是一个tab键宽度是8个字符,想改成4个字符, 操作如下:(注意:这是在root用户下)cd ~vim .vimrc添加如下几行: ...
- Easyui Datagrid 修改显示行号列宽度
EasyUI中Datagrid的第一列显示行号,可是如果数据量大的的时候,显示行号的那一列数据会显示不完全的. 可以通过修改Datagrid的样式来解决这个问题,在样式中加入下面这个样式,就可以自己修 ...
- vim显示行号、语法高亮、自动缩进、添加下划线的设置
ubuntu默认是没有安装vim的,所以设置以前请先安装vim:sudo apt-get install vim. 然后 打开vim的配置文件:sudo vim /etc/vim/vimrc 或者 s ...
- vim 设置TAB宽度、显示行号、自动缩进、自动换行宽度
一.vim ~/.vimrc 二.添加如下几行:(括号中的不是,是我添加的) set shiftwidth=4 (表示每一级缩进的长度)set softtabstop=4 ...
- Ubuntu18.04系统下安装Pycharm&vim设置自动缩进及默认显示行号
Ubuntu18.04系统自带python3.6及python2.7,Pycharm是一款非常强大的IDE.目前Pycharm有两个版本:专业版和Community社区,区别是专业版是收费,而且功能更 ...
- linux vim 配置文件(高亮+自动缩进+行号+折叠+优化)
点评:将一下代码copy到 用户目录下 新建文件为 .vimrc保存即可生效 如果想所有用户生效 请修改 /etc/vimrc (建议先cp一份)"===================== ...
- vim 配置文件 ,高亮+自动缩进+行号+折叠+优化
vim 配置文件 ,高亮+自动缩进+行号+折叠+优化 将一下代码copy到 用户目录下 新建文件为 .vimrc保存即可生效: 如果想所有用户生效 请修改 /etc/vimrc (建议先cp一份)& ...
随机推荐
- Redis Pipelining 底层原理分析及实践
作者:vivo 互联网服务器团队-Wang Fei Redis是一种基于客户端-服务端模型以及请求/响应的TCP服务.在遇到批处理命令执行时,Redis提供了Pipelining(管道)来提升批处理性 ...
- 开发案例:使用canvas实现图表系列之折线图
一.功能结构 实现一个公共组件的时候,首先分析一下大概的实现结构以及开发思路,方便我们少走弯路,也可以使组件更加容易拓展,维护性更强.然后我会把功能逐个拆开来讲,这样大家才能学习到更详细的内容.下 ...
- Mysql之GTID
一.GTID Mysql5.6引入GTID(Global Transaction IDs),多线程复制: 由服务器的UUID和事务ID号组成唯一标识某一个主机的某个事务的ID号: 每一个事务首部都有G ...
- Linux之parted
[摘要] parted用于对磁盘(或RAID磁盘)进行分区及管理,与fdisk分区工具相比,支持2TB以上的磁盘分区,并且允许调整分区的大小. 使用它你可以创建.清除.调整.移动和复制ext2.ext ...
- sql 语句系列(月份的第一个星期的星期一和最后一个星期的星期一)[八百章之第二十一章]
mysql select y.first_monday,CASE MONTH(ADDDATE(y.first_monday,28)) when mth then ADDDATE(y.first_mon ...
- Android开发 Error:The number of method references in a .dex file cannot exceed 64K.Android开发 Error:The number of method references in a .dex file cannot exceed 64K
前言 错误起因: 在Android系统中,一个App的所有代码都在一个Dex文件里面. Dex是一个类似Jar的存储了多有Java编译字节码的归档文件. 因为Android系统使用Dalvik虚拟机, ...
- resin报错:java.lang.IllegalStateException: block Block
java.lang.IllegalStateException: block Block 启动resin时报错 主要的提示信息就是下面这个 java.lang.IllegalStateExceptio ...
- 力扣467(java)-环绕字符串中唯一的子字符串(中等)
题目: 把字符串 s 看作是 "abcdefghijklmnopqrstuvwxyz" 的无限环绕字符串,所以 s 看起来是这样的: "...zabcdefghijklm ...
- 使用EasyCV Mask2Former轻松实现图像分割
简介: EasyCV可以轻松预测图像的分割谱以及训练定制化的分割模型.本文主要介绍如何使用EasyCV实现实例分割.全景分割和语义分割,及相关算法思想. 作者:贺弘 谦言 临在 导言 图像分割(Ima ...
- github 解决推拉代码提示 REMOTE HOST IDENTIFICATION HAS CHANGED 失败
本文记录最近 github 推送或拉取代码时提示 WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! 而失败的解决方法 报错提示如下 @@@@@@@@@@ ...