假设我有一个数据网格如下所示:(运行时)
在删除第4行后:
添加两行到datagrid后:
请注意,在第一张图片中,行编号是正确的。当我从Datagrid中删除一个项目时,删除后该行号不见了,如图2所示。在图3中,您可以看到我添加了两行,但行号11重复两次。
在这里,我使用LoadingRow事件进行编号,如下所示:
在观察图像2和图像3中出现的问题后,我意识到我需要手动重新编号dataGridRowHeaders。因此,我在DaaGrid的PreviewKeyDown事件中尝试了以下代码:
当我再次运行程序时,我无法看到任何输出的更改。所以我认为在删除行之前DataGrid被重新编号,因此我将那段代码移到了PreviewKeyUp中。但是在那里我遇到了IndexOutOfRangeException,因为选定的索引被重置为-1。
我该怎么做才能得到正确的编号?
通过使用ShowRowNumbers属性来解决问题,使开发人员可以打开/关闭行号:
在XAML中:
在删除第4行后:
添加两行到datagrid后:
请注意,在第一张图片中,行编号是正确的。当我从Datagrid中删除一个项目时,删除后该行号不见了,如图2所示。在图3中,您可以看到我添加了两行,但行号11重复两次。
在这里,我使用LoadingRow事件进行编号,如下所示:
private void maindg_LoadingRow_1(object sender, DataGridRowEventArgs e)
{
e.Row.Header = ((e.Row.GetIndex()) + 1).ToString();
}
在观察图像2和图像3中出现的问题后,我意识到我需要手动重新编号dataGridRowHeaders。因此,我在DaaGrid的PreviewKeyDown事件中尝试了以下代码:
if (e.Key == Key.Delete)
{
DataGridRow dgr = (DataGridRow)(maindg.ItemContainerGenerator.ContainerFromIndex(maindg.SelectedIndex));
if (!(dgr.IsEditing))
{
foreach (var item in maindg.Items)
{
dgr.Header = ((dgr.GetIndex()) + 1).ToString();
}
}
}
当我再次运行程序时,我无法看到任何输出的更改。所以我认为在删除行之前DataGrid被重新编号,因此我将那段代码移到了PreviewKeyUp中。但是在那里我遇到了IndexOutOfRangeException,因为选定的索引被重置为-1。
我该怎么做才能得到正确的编号?
通过使用ShowRowNumbers属性来解决问题,使开发人员可以打开/关闭行号:
public class ExtendedDataGrid : DataGrid
{
public static bool GetShowRowNumbers(DependencyObject obj)
{
return (bool)obj.GetValue(ShowRowNumbersProperty);
}
public static void SetShowRowNumbers(DependencyObject obj, bool value)
{
obj.SetValue(ShowRowNumbersProperty, value);
}
public static readonly DependencyProperty ShowRowNumbersProperty =
DependencyProperty.RegisterAttached("ShowRowNumbers", typeof(bool), typeof(ExtendedDataGrid), new UIPropertyMetadata(false));
public ExtendedDataGrid()
{
LoadingRow += (sender, args) =>
{
if (GetShowRowNumbers(this))
RefreshRowNumber(args.Row);
};
}
protected override void OnExecutedDelete(ExecutedRoutedEventArgs e)
{
base.OnExecutedDelete(e);
if (GetShowRowNumbers(this))
RefreshRowNumbers();
}
protected override void OnItemsChanged(NotifyCollectionChangedEventArgs e)
{
base.OnItemsChanged(e);
if (GetShowRowNumbers(this))
RefreshRowNumbers();
}
private void RefreshRowNumbers()
{
for (int i = 0; i < Items.Count; i++)
RefreshRowNumber((DataGridRow)ItemContainerGenerator.ContainerFromIndex(i));
}
private void RefreshRowNumber(DataGridRow row)
{
if(row != null)
row.Header = ((row.GetIndex()) + 1).ToString();
}
}
在XAML中:
<DataGrid ......
ShowRowNumbers="True".....>