C# 从datagrid中删除项目后重置行号

C# 从datagrid中删除项目后重置行号,c#,wpf,datagrid,C#,Wpf,Datagrid,假设我有一个dataGrid,如下所示:(在运行时) 删除第4行后: 向datagrid再添加两行后: 请注意,在第一张图片中,行编号良好。当我从Datagrid中删除一个项目时,该行号在删除后丢失,如图2所示。在图3中,您可以看到我添加了两个新行,但行号11重复了两次 在这里,我使用LoadingRow事件获得了如下编号: private void maindg_LoadingRow_1(object sender, DataGridRowEventArgs e) { e.Row

假设我有一个dataGrid,如下所示:(在运行时)

删除第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所示的问题后,我明白应该手动重新编号DataGridRowHeader。因此,我在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

我该怎么做才能得到正确的编号

具有ShowRowNumber属性的解决方案,以便开发人员可以打开/关闭行号:

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();
    }
}
公共类ExtendedDataGrid:DataGrid { 公共静态bool GetShowRowNumber(DependencyObject obj) { 返回(bool)对象GetValue(showRowNumberProperty); } 公共静态void setShowRowNumber(DependencyObject对象,布尔值) { 对象设置值(showRowNumberProperty,值); } 公共静态只读从属属性ShowRowNumberProperty= DependencyProperty.RegisterAttached(“ShowRowNumber”、typeof(bool)、typeof(ExtendedDataGrid)、new UIPropertyMetadata(false)); 公共扩展数据网格() { LoadingRow+=(发送方,参数)=> { 如果(GetShowRowNumber(此)) RefreshRowNumber(参数行); }; } 受保护的覆盖无效OnExecutedDelete(已执行路由目标e) { 碱基。一个被切割的小裂片(e); 如果(GetShowRowNumber(此)) 刷新行数(); } 已更改受保护的覆盖(NotifyCollectionChangedEventArgs e) { 碱基(e); 如果(GetShowRowNumber(此)) 刷新行数(); } 私有无效刷新行数() { 对于(int i=0;i 在XAML中:

<DataGrid ......
          ShowRowNumbers="True".....>

似乎更精确的方法是处理
OnExecutedDelete
OnItemChanged
而不是尝试与delete键同步。也许您可以子类化
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();
    }
}
公共类ExtendedDataGrid:DataGrid { 公共扩展数据网格() { LoadingRow+=(发送方,参数)=>RefreshRowNumber(参数行); } 已更改受保护的覆盖(NotifyCollectionChangedEventArgs e) { 碱基(e); 刷新行数(); } 私有无效刷新行数() { 对于(int i=0;i事件名称行已删除。然后写下面的代码

 private void dataGridView1_RowsRemoved(object sender, DataGridViewRowsRemovedEventArgs e)
    {

        int cct = dataGridView1.Rows.Count; //count how many rows in dgv

        int cnt = 0;
        int replace_no = 1;


        while(cnt < cct)
        {
            dataGridView1.Rows[cnt].Cells[0].Value = replace_no.ToString(); //replace S No            
            cnt = cnt + 1;
            replace_no = replace_no + 1;
        }
    }
private void dataGridView1_RowsRemoved(对象发送方,DataGridViewRowsRemovedEventArgs e)
{
int cct=dataGridView1.Rows.Count;//计算dgv中的行数
int-cnt=0;
int替换_no=1;
而(cnt
如果再次进行数据绑定,则应将其修复。对不起,再次进行数据绑定是什么意思?主窗口显示某种GridView控件。删除行后,调用
gridView1.DataSource=然后是
gridView1.DataBind()这是WPF。在WPF中,我没有GridView控件。你明白我的意思,对吧?你需要重新加载你的数据。谢谢你,这很好用。根据stackoverflow的规则,我将在23小时后奖励赏金。我已使用ShowRowNumbers属性使用您的代码打开/关闭行号。我已经用相关代码更新了我的问题。对不起,我有一个小问题。我希望我的用户在每一行上都有一个删除按钮。单击“删除”按钮时,应删除该行。我成功删除了该行,但此时行号未更新。你能解释一下为什么会发生这种情况吗?@Vishal我想使用“OnItemChanged”可以涵盖所有的基础(上面也进行了编辑)。在第一次尝试时,它似乎在你编辑的解决方案之后起作用,但我遇到了一些问题。当我使用我提供的delete按钮删除时,它会删除行,并刷新行号。但它不允许我通过选择行并按delete键来删除行。因此,除了编辑的代码之外,我还试图覆盖OnExecutedDelete。现在它工作得很好。我已经为相关代码更新了我的问题。