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使用 自动显示行号、全选、三级联动、拖拽的更多相关文章

  1. winedt设置自动显示行号[latex]

    options--preferences--appearance 在show line numbers for modes下面的文本框里添加;Tex 这样新建或者打开tex文件的时候就自动显示行号了( ...

  2. vim显示行号、语法高亮、自动缩进的设置

    转载自:http://blog.csdn.net/chuanj1985/article/details/6873830   在UBUNTU中vim的配置文件存放在/etc/vim目录中,配置文件名为v ...

  3. Ubuntu vim显示行号语法高亮自动缩进

    配置文件名为Ubuntu vimrc在Fedora中vim的配置文件存放在/etc目录中,配置文件名为Ubuntu vimrc在终端 输入以下命令来编辑Ubuntu vimrc配置文件:sudo vi ...

  4. linux系统下Vi编辑器或者Vim编辑器设置显示行号、自动缩进、调整tab键宽度的技巧?

    工作中嫌vim 中一个tab键的宽度太大,linux系统默认,没改之前是一个tab键宽度是8个字符,想改成4个字符, 操作如下:(注意:这是在root用户下)cd ~vim .vimrc添加如下几行: ...

  5. Easyui Datagrid 修改显示行号列宽度

    EasyUI中Datagrid的第一列显示行号,可是如果数据量大的的时候,显示行号的那一列数据会显示不完全的. 可以通过修改Datagrid的样式来解决这个问题,在样式中加入下面这个样式,就可以自己修 ...

  6. vim显示行号、语法高亮、自动缩进、添加下划线的设置

    ubuntu默认是没有安装vim的,所以设置以前请先安装vim:sudo apt-get install vim. 然后 打开vim的配置文件:sudo vim /etc/vim/vimrc 或者 s ...

  7. vim 设置TAB宽度、显示行号、自动缩进、自动换行宽度

    一.vim  ~/.vimrc 二.添加如下几行:(括号中的不是,是我添加的) set shiftwidth=4          (表示每一级缩进的长度)set softtabstop=4     ...

  8. Ubuntu18.04系统下安装Pycharm&vim设置自动缩进及默认显示行号

    Ubuntu18.04系统自带python3.6及python2.7,Pycharm是一款非常强大的IDE.目前Pycharm有两个版本:专业版和Community社区,区别是专业版是收费,而且功能更 ...

  9. linux vim 配置文件(高亮+自动缩进+行号+折叠+优化)

    点评:将一下代码copy到 用户目录下 新建文件为 .vimrc保存即可生效 如果想所有用户生效 请修改 /etc/vimrc (建议先cp一份)"===================== ...

  10. vim 配置文件 ,高亮+自动缩进+行号+折叠+优化

    vim 配置文件 ,高亮+自动缩进+行号+折叠+优化 将一下代码copy到 用户目录下 新建文件为  .vimrc保存即可生效: 如果想所有用户生效 请修改 /etc/vimrc (建议先cp一份)& ...

随机推荐

  1. 抓包整理————tcp 三次握手性能优化[十]

    前言 tcp 三次握手性能优化. 正文 服务器三次握手流程示例: 下面就是3次握手的过程: 知道这个有什么用呢? 我举一个我使用到的例子哈. 比如有很多 tcp 连接到一台机器上机器上,那么tcp_m ...

  2. spring boot properties 编码问题[四]

    情景 application.properties 中: server.port=8081 person.last-name=张三 person.age=18 person.birth=2017/12 ...

  3. redis 一百二十篇(历史发展)之第二篇

    正文 简介: Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库. Redis 与其他 key - value 缓存产品有以下三个特点: Redis支持数据的持久化, ...

  4. mmdetection使用wandb查看训练日志

    mmdetection查看日志之前一直是在用TextLoggerHook,已经觉得挺方便的了,自从用了wandb之后,发现wandb真不错,看log更方便了,回不去了. wandb的简单配置: wan ...

  5. esp8266,arduino,网页显示dht11温湿度,控制继电器开关,局域网智能家居

    不说了,上代码,用arduino实现esp8266代码 #include <ESP8266WiFi.h> #include <WiFiClient.h> #include &l ...

  6. 【Oracle】Oracle常用分析函数(排名)

    Oracle常用分析函数(排名) 一般来说,遇到需要对数据进行排序的时候,可以使用分析函数,一般常用的有三个,rank,dense_rank,row_number --Oracle常用分析函数(排名) ...

  7. PolarDB-X 全局二级索引

    简介: 索引是数据库的基础组件,早在1970年代,SystemR 就已经通过增加索引来支持多维度查询.单机数据库中,索引主要按照用途和使用的数据结构分为 BTree 索引.Hash 索引.全文索引.空 ...

  8. 动态尺寸模型优化实践之Shape Constraint IR Part II

    简介: 在本系列分享中我们将介绍BladeDISC在动态shape语义下做性能优化的一些实践和思考.本次分享的是我们最近开展的有关shape constraint IR的工作,Part II 中我们将 ...

  9. EventBridge 特性介绍|以 IaC 的方式使用 EventBridge

    ​简介:本文将重点介绍 EventBridge 和 IaC 的重点概念和特性,然后演示如何应用 IaC 理念自动化部署 EventBridge 来使用这些概念和特性. 作者:王川(弗丁) 引言 Eve ...

  10. 五福背后的 Web 3D 引擎 Oasis Engine 正式开源

    简介: Oasis 从开源走向新的起点,用 3D 化的交互和表达让世界变得更美好. 相信大家已经体验了今年支付宝五福的活动,无论是今年的五福首页还是打年兽游戏都是由蚂蚁互动图形引擎(代号:Oasis ...