1.DataGrid的使用自动显示行号(修复删除行时行号显示不正确)
View CodedgTool.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 CodedgTool.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 Codepublic 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 Codeint 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 Codepublic 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 Codeint rowIndex = -1; private void dgTool_SelectionChanged(object sender, SelectionChangedEventArgs e) { rowIndex = ((System.Windows.Controls.DataGrid)((sender))).SelectedIndex; }
处理省逻辑
View Codeprivate 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 Codeprivate 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 Codeprivate 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()); }标签:sender,private,DataGrid,source,IsChecked,全选,dgTool,WPF,null From: https://www.cnblogs.com/webenh/p/18216660