【问题标题】:Show row index and reset sorting显示行索引并重置排序
【发布时间】:2014-11-12 12:42:50
【问题描述】:

我是 WPF 新手,有两个 DataGrid 问题:

问题 1:

我得到了什么: 从数组中获取数据的 DataGird:

 <DataGrid x:Name="dgMain" ItemsSource="{Binding TestArray}" Margin="0,20,0,0" LoadingRow="dgMain_LoadingRow">
            <DataGrid.Columns>
                <DataGridTextColumn Header="Name" Binding="{Binding Name}"/>
                <DataGridTextColumn Header="Address" Binding="{Binding Address}"/>
                <DataGridTextColumn Header="Age" Binding="{Binding Age}"/>
            </DataGrid.Columns>
 </DataGrid>

我正在使用“LoadingRow”事件来更新行标题:

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

我想要什么: 它应该在行标题中显示行的索引。

有什么问题?:如果我添加项目或加载项目,效果很好,但如果我对 DataGird 进行排序,行的索引不会改变。

左侧未排序,右侧已排序(按名称)。在这个例子中,“F”行的索引应该是 6 而不是 1(右图)。

(与问题无关:为什么所有的RowHeaders都被选中了?)

问题 2:

我得到了什么: 见问题 1

我想要什么:添加一行后,它应该跳转到下一个空行。

什么问题?:如果我对数据网格进行排序,它会跳到下一行,即使它不是空的。

首先我按名称对列表进行排序,然后添加“A:First”,“B:Second”,“C:Third”,然后是“A:Fourth”,由于排序,“A:Fourth”自动得到第二行然后它跳到第三行而不是最后一个空行。

编辑:对不起,我忘了说:它应该 1. 重置排序和 2. 跳转到最后一个空行。顺序应为“A:第一”、“B:S”、“C:T”和“A:第四”。

我真的希望有简单的解决方案。谢谢:)

【问题讨论】:

    标签: c# wpf sorting datagrid


    【解决方案1】:

    对于第一个问题,您必须创建自己的行标题样式(您可能需要更改样式以适合您的设计)。数据网格应如下所示:

    <DataGrid x:Name="dgMain" ItemsSource="{Binding TestArray}" Margin="0,20,0,0" AutoGenerateColumns="False">
        <DataGrid.RowHeaderStyle>
            <Style TargetType="{x:Type DataGridRowHeader}">
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="{x:Type DataGridRowHeader}">
                            <Border BorderThickness="0.3,0.3,0.3,0.3" BorderBrush="Black" Width="40">
                                <TextBlock Text="{Binding Index}" Padding="2,1,1,1"/>
                            </Border>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>
        </DataGrid.RowHeaderStyle>
        <DataGrid.Columns>
            <DataGridTextColumn Header="Name" Binding="{Binding Name}"/>
            <DataGridTextColumn Header="Address" Binding="{Binding Address}"/>
            <DataGridTextColumn Header="Age" Binding="{Binding Age}"/>
        </DataGrid.Columns>
    </DataGrid>
    

    对于{Binding Index} 部分,您必须使用 Id 属性扩展您的模型,该属性将保存每个项目的索引。您应该在创建项目模型时填充该索引 (int)。在我的测试示例中,我使用了静态变量,如下例所示:

    public class ItemModel
    {
        private static int counter = 0;
        public int Index { get; set; }
        public string Name { get; set; }
        public string Address { get; set; }
        public DateTime Age { get; set; }
    
        public ItemModel(string name, string address, DateTime? age = null)
        {
            Name = name;
            Address = address;
            Age = age ?? DateTime.Now;
            Index = ++counter;
        }
    }
    

    对于您的第二个问题:我认为您无法轻松返回原始排序。但是,您可以执行以下操作:

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        // clear sorting!
        foreach (DataGridColumn column in this.dgMain.Columns)
        {
            column.SortDirection = null;
        }
    
        testArray.Add(new ItemModel("A:fourth", "ee"));
    }
    

    在向可观察集合添加新值之前(我希望您使用可观察集合,即使您写了“从数组中获取数据的 DataGird:”),您必须为每个数据网格列清除其排序。这样做,您将始终在数据网格的最后一个位置添加新创建的项目。但是,正如我已经说过的,前几行的顺序将保持不变。我希望这对你有用。

    【讨论】:

    • 谢谢 ^^ 是的,我使用了一个可观察的集合 :)
    • 找到重置排序的解决方案: var view = CollectionViewSource.GetDefaultView(dgMain.ItemsSource); view.SortDescriptions.Clear();
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-28
    • 2022-12-31
    • 1970-01-01
    • 2021-04-30
    • 2021-08-06
    • 1970-01-01
    相关资源
    最近更新 更多