在使用DataGrid的时候有一种列类型: DataGridCheckBoxColumn ,本人希望通过消除“打钩”的方式来删除某一行。但是尝试了很多方法都无法实现,在学习了很多旁类知识之后忽然找到一些蛛丝马迹。终于找到了解决方案。
大体是将 DataGridCheckBoxColumn 换DataGridTemplateColumn ,然后在DataTemplate组合CheckBox,定义一个Tag,下面来看具体代码
参考:https://blog.csdn.net/sanjiawan/article/details/6785394
XAML
<Window x:Class="DataGrid_Case.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:assembly="clr-namespace:System;assembly=mscorlib"
xmlns:local="clr-namespace:DataGrid_Case"
Title="MainWindow" Height="350" Width="525" Loaded="Window_Loaded_1" >
<Window.Resources>
<ObjectDataProvider x:Key="SexualEnum" MethodName="GetValues" ObjectType="{x:Type assembly:Enum}">
<ObjectDataProvider.MethodParameters>
<x:Type Type="local:Sex"/>
<!--引用后台的枚举类型,为字段‘性别’提供数据源。上面引用了命名空间DataGrid_Case-->
</ObjectDataProvider.MethodParameters>
</ObjectDataProvider>
</Window.Resources>
<Grid>
<DataGrid Name="dataGrid1" AutoGenerateColumns="False" CanUserAddRows="False" CanUserDeleteRows="False" Margin="0,40,0,0" >
<DataGrid.Columns>
<DataGridTemplateColumn Header="操作" Width="40">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<CheckBox Click="CheckBox_Click" Tag="{Binding FID, Mode=TwoWay}" Name="checkbox_1" IsChecked="True"></CheckBox>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTextColumn Header="公司名称" Width="1*" Binding="{Binding 公司名称, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
<DataGridTextColumn Header="姓名" Width="1*" Binding="{Binding 职员姓名, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
<DataGridTemplateColumn Header="性别">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding Path=性别}"/>
<!--显示状态时显示 TextBlock里的值-->
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<!--编辑状态就切换到ComboBox里进行下拉选择操作-->
<ComboBox x:Name="taskCombo" ItemsSource="{Binding Source={StaticResource SexualEnum}}" SelectedItem ="{Binding Path=性别}" IsSynchronizedWithCurrentItem="False"/>
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>
<DataGridTextColumn Header="年龄" Width="1*" Binding="{Binding 年龄, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
<DataGridTextColumn Header="职务" Width="1*" Binding="{Binding 职务, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
</DataGrid.Columns>
</DataGrid>
</Grid>
</Window>
在前端界面有可能出现如下错误
是因为缺少这两行代码,本人微博在前面的博客中也有提到
<Window ...
xmlns:assembly="clr-namespace:System;assembly=mscorlib"
xmlns:local="clr-namespace:DataGrid_Case"
后台代码
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace DataGrid_Case
{
/// <summary>
/// MainWindow.xaml 的交互逻辑
/// </summary>
public enum Sex { 男, 女 };
public class DataGridCustomer
{
public object FID { get; set; }
public string 公司名称 { get; set; }
public string 职员姓名 { get; set; }
public string 性别 { get; set; }
public string 年龄 { get; set; }
public string 职务 { get; set; }
}
public partial class MainWindow : Window
{
ObservableCollection<DataGridCustomer> list = new ObservableCollection<DataGridCustomer>();
public MainWindow()
{
InitializeComponent();
}
private void Window_Loaded_1(object sender, RoutedEventArgs e)
{
list.Add(new DataGridCustomer() { 公司名称 = "华为", 职员姓名 = "任正非", 性别 = "男", 年龄 = "65", 职务 = "CEO", FID="1" });
list.Add(new DataGridCustomer() { 公司名称 = "阿里巴巴", 职员姓名 = "马云", 性别 = "男", 年龄 = "50", 职务 = "CEO", FID = "2" });
list.Add(new DataGridCustomer() { 公司名称 = "腾讯", 职员姓名 = "马化腾", 性别 = "男", 年龄 = "50", 职务 = "CEO", FID = "3"});
dataGrid1.ItemsSource = list;
for (int i = 0; i < 3; i++)
{
}
}
//由ChecBox的Click事件来记录被选中行的FID
List<int> selectFID = new List<int>(); //保存选中要删除行的FID值
private void CheckBox_Click(object sender, RoutedEventArgs e)
{
CheckBox dg = sender as CheckBox;
//object XXXXX = dg.Tag.ToString();
int FID = int.Parse(dg.Tag.ToString()); //获取该行的FID
var bl = dg.IsChecked;
//if (bl == true)
//{
// selectFID.Add(FID); //如果选中就保存FID
//}
//else
//{
// selectFID.Remove(FID); //如果选中取消就删除里面的FID
// MessageBox.Show(FID.ToString());
//}
if (FID > 0)
{
int _rowIndex = 0;
int _columnIndex = 0;
if (GetCellXY(dataGrid1, ref _rowIndex, ref _columnIndex))
{
list.RemoveAt(_rowIndex);
}
}
}
private bool GetCellXY(DataGrid dg, ref int rowIndex, ref int columnIndex)
{
var _cells = dg.SelectedCells;//获取选中单元格的列表
if (_cells.Any())
{
rowIndex = dg.Items.IndexOf(_cells.First().Item);
columnIndex = _cells.First().Column.DisplayIndex;
return true;
}
return false;
}
}
}
Var的介绍:他是一种隐式类型,由编译器决定。隐式类型本地变量为强类型,就像用户已经自行声明该类型,但编译器决定类型一样。 i 的以下两个声明在功能上是等效的:
var i = 10; // Implicitly typed.
int i = 10; // Explicitly typed.
这篇博文的关键思想是在CheckBox中使用Tag,它并不会在表格中显示出来。最后通过Tag来做相关操作,既可以是本例中删除,也可以是通过以Tag为条件触发其他事件。