版权声明:署名,允许他人基于本文进行创作,且必须基于与原先许可协议相同的许可协议分发本文 (Creative Commons)
WPF之DataGrid控件序号自动生成的简单方法——删除行后依然有序
DataGrid控件序号自动生成的简单方法
DataGrid控件中的序号生成一般有两种方法,第一种方法的思路是在控件中单独创建序号列并与后台数据进行Binding。第二种方法是不Binding,直接在行加载时在RowHeader中添加序号。相比之下,第二种方法更为简单,故这里主要对第二种方法进行介绍。
效果图
前台Xaml代码
<DataGrid x:Name="TCurveDataGrid" Height="280" Width="150"
AlternatingRowBackground="LightBlue" AlternationCount="2" AutoGenerateColumns="False"
BorderBrush="Black" BorderThickness="1" ScrollViewer.HorizontalScrollBarVisibility="Disabled"
LoadingRow="TCurveDataGrid_LoadingRow"
HeadersVisibility="All">
<DataGrid.Columns>
<DataGridTextColumn x:Name="Parameter" Header="参数" Binding="{Binding Parameter,UpdateSourceTrigger=PropertyChanged}" Width="75" />
<DataGridTextColumn x:Name="Value" Header="数值" Binding="{Binding Value,UpdateSourceTrigger=PropertyChanged}" Width="75"/>
</DataGrid.Columns>
</DataGrid>
后台C#代码
//在载入行的时候在行表头添加编号
private void TCurveDataGrid_LoadingRow(object sender, DataGridRowEventArgs e)
{
e.Row.Header = (e.Row.GetIndex() + 1).ToString();
}
上述方法存在的问题
由于在对DataGrid控件执行Delete操作时不会触发LoadingRow事件,所以删除后会乱序。
键入Delete前
键入Delete后
最终的解决方案
添加PreviewKeyUp事件,并在该事件处理器中建立键入Delete后更新控件包含的项目的方法。
前台Xaml代码
<DataGrid x:Name="TCurveDataGrid" Height="280" Width="150"
AlternatingRowBackground="LightBlue" AlternationCount="2" AutoGenerateColumns="False"
BorderBrush="Black" BorderThickness="1" ScrollViewer.HorizontalScrollBarVisibility="Disabled"
LoadingRow="TCurveDataGrid_LoadingRow" PreviewKeyUp="TCurveDataGrid_PreviewKeyUp"
HeadersVisibility="All">
<DataGrid.Columns>
<DataGridTextColumn x:Name="Parameter" Header="参数" Binding="{Binding Parameter,UpdateSourceTrigger=PropertyChanged}" Width="75" />
<DataGridTextColumn x:Name="Value" Header="数值" Binding="{Binding Value,UpdateSourceTrigger=PropertyChanged}" Width="75"/>
</DataGrid.Columns>
</DataGrid>
后台C#代码
//在载入行的时候在行表头添加编号
private void TCurveDataGrid_LoadingRow(object sender, DataGridRowEventArgs e)
{
e.Row.Header = (e.Row.GetIndex() + 1).ToString();
}
//在键入delete后,刷新控件所包含的item以保持表头序号的连续。
private void TCurveDataGrid_PreviewKeyUp(object sender, KeyEventArgs e)
{
if (TCurveDataGrid.SelectedIndex < 0) return;
var dgr = (DataGridRow)(TCurveDataGrid.ItemContainerGenerator.ContainerFromIndex(TCurveDataGrid.SelectedIndex));
if (e.Key == Key.Delete && !dgr.IsEditing)
{
TCurveDataGrid.Items.Refresh();
}
}
效果展示
键入Delete前
键入Delete后
一个问题不大的问题
最后一行的行表头默认为2,我想这可能与WPF中以列表头默认为1,行表头默认为2有关,但不知道如何应如怎样替换成其他符号,比如*,希望能获得指点。