WPF之DataGrid控件序号自动生成的简单方法——删除行后依然有序

知识共享许可协议 版权声明:署名,允许他人基于本文进行创作,且必须基于与原先许可协议相同的许可协议分发本文 (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前
键入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前
键入Delete后
键入Delete后

一个问题不大的问题

最后一行的行表头默认为2,我想这可能与WPF中以列表头默认为1,行表头默认为2有关,但不知道如何应如怎样替换成其他符号,比如*,希望能获得指点。
最后一行的行表头为2

猜你喜欢

转载自blog.csdn.net/weixin_42232445/article/details/93733852
今日推荐