WPF DataGrid使用 自动显示行号、全选、三级联动、拖拽
2013-10-29 11:08
435 查看
1.DataGrid的使用自动显示行号(修复删除行时行号显示不正确)
View
Code
2.DataGrid新建一行,并为需要的单元格提供默认值
View
Code
3.DataGrid实现全选和单选
1)DataGrid绑定数据实体类Entity
View
Code
2)前台界面XAML
View
Code
3)后台事件
View
Code
4)删除按钮事件
View
Code
4.三级联动
1)业务实体
View
Code
2)前台界面
View
Code
3)后台逻辑
View
Code
处理省逻辑
View
Code
处理市逻辑
View
Code
处理县逻辑
View
Code
转自http://www.cnblogs.com/gyb333/archive/2013/01/17/DataGrid.html
View
Code
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新建一行,并为需要的单元格提供默认值
View
Code
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
View
Code
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
View
Code
<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)后台事件
View
Code
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)删除按钮事件
View
Code
//删除按钮事件 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)业务实体
View
Code
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)前台界面
View
Code
<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)后台逻辑
View
Code
int rowIndex = -1; private void dgTool_SelectionChanged(object sender, SelectionChangedEventArgs e) { rowIndex = ((System.Windows.Controls.DataGrid)((sender))).SelectedIndex; }
处理省逻辑
View
Code
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; }
处理市逻辑
View
Code
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; }
处理县逻辑
View
Code
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()); }
转自http://www.cnblogs.com/gyb333/archive/2013/01/17/DataGrid.html
相关文章推荐
- 窗口界面编程之一:VB实现简单异形窗口
- 【HBase】ERROR master.HMasterCommandLine: Master not running
- OCP-1Z0-053-V12.02-44题
- android中运行shell
- Trapping Rain Water
- HDU_1003
- Linux系列-初识linux
- linux下配置opencv
- dm8168点灯的驱动代码
- 谈谈测试工具开发
- 读取网页文件内容
- java中length,length(),size()区别
- 字符串包含问题
- fiddler 路由设置
- 22套新鲜出炉的 Web & Mobile PSD 用户界面素材
- 精心挑选的12款优秀 jQuery Ajax 分页插件和教程
- RO段、RW段和ZI段
- CDH4.1(hadoop-2.0.0-cdh4.1.2)安装部署文档
- 精心挑选的12款优秀 jQuery Ajax 分页插件和教程
- 浏览器中打开IOS应用并传参