gpt4 book ai didi

c# - 从数据网格中删除项目后重置行号

转载 作者:太空宇宙 更新时间:2023-11-03 13:20:06 25 4
gpt4 key购买 nike

假设我有一个数据网格,如下所示:(运行时)

enter image description here

删除第 4 行后:

enter image description here

在向数据网格中添加另外两行之后:

enter image description here

请注意,在第一张图片中,行编号是正确的。当我从 Datagrid 中删除一个项目时,删除后该行号丢失,如图 2 所示。在图 3 中,您可以看到我添加了两个新行,但行号 11 重复了两次。

这里我使用 LoadingRow 事件进行编号,如下所示:

private void maindg_LoadingRow_1(object sender, DataGridRowEventArgs e)
{
e.Row.Header = ((e.Row.GetIndex()) + 1).ToString();
}

在遇到 image2 和 image3 所示的问题后,我明白我应该手动重新编号 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,因为 Selected 索引被重置为 -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".....>

最佳答案

似乎更精确的方法是处理 OnExecutedDeleteOnItemsChanged 而不是尝试与删除按键同步。也许您可以将 DataGrid 子类化并以这种方式刷新行:

public class ExtendedDataGrid : DataGrid
{
public ExtendedDataGrid()
{
LoadingRow += (sender, args) => RefreshRowNumber(args.Row);
}

protected override void OnItemsChanged(NotifyCollectionChangedEventArgs e)
{
base.OnItemsChanged(e);
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();
}
}

关于c# - 从数据网格中删除项目后重置行号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24641736/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com