在WPF DataGrid上显示行号的简单方法

yyhrrdl8  于 2023-10-22  发布在  其他
关注(0)|答案(8)|浏览(313)

我只想在DataGrid的最左边的列中显示行号。有什么属性可以做到这一点吗?

请记住,这不是我的表的主键。我不希望在对列进行排序时,这些行号随它们的行移动。我基本上是要一个运行计数。它甚至不需要一个标题。

q0qdq0h2

q0qdq0h21#

一种方法是将它们添加到DataGrid的LoadingRow事件中

<DataGrid Name="DataGrid" LoadingRow="DataGrid_LoadingRow" ...

void DataGrid_LoadingRow(object sender, DataGridRowEventArgs e)
{
    e.Row.Header = (e.Row.GetIndex()).ToString(); 
}

当从源列表中添加或删除项目时,数字可能会在一段时间内失去同步。有关此问题的修复,请参阅此处附带的行为:
WPF 4 DataGrid:将行号输入行标题
像这样可折叠的

<DataGrid ItemsSource="{Binding ...}"
          behaviors:DataGridBehavior.DisplayRowNumber="True">
wfypjpf4

wfypjpf42#

添加有关Fredrik Hedblad回答的简短信息。

<DataGrid Name="DataGrid" LoadingRow="DataGrid_LoadingRow" ...

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

.如果要从1开始编号

vtwuwzda

vtwuwzda3#

如果您的数据网格将其ItemsSource绑定到集合,请将数据网格的AlternationCount属性绑定到集合的count属性或DataGrid的Items.Count属性,如下所示:

<DataGrid ItemsSource="{Binding MyObservableCollection}" AlternationCount="{Binding MyObservableCollection.Count}" />

或者:

<DataGrid ItemsSource="{Binding MyObservableCollection}" AlternationCount="{Binding Items.Count, RelativeSource={RelativeSource Self}" />

两者都应该工作。
然后,假设您正在为最左侧的列使用DataGridTextColumn,则在DataGrid.Columns定义中执行以下操作:

<DataGrid.Columns>
   <DataGridTextColumn Binding="{Binding AlternationIndex, RelativeSource={RelativeSource AncestorType=DataGridRow}}" />
</DataGrid.Columns>

如果你不想从0开始,你可以在绑定中添加一个转换器来增加索引。

mw3dktmi

mw3dktmi4#

这是一个老问题,但我想分享一些东西。我有一个类似的问题,我所需要的只是一个简单的RowHeader行计数,Fredrik Hedblad的答案几乎完成了我的问题。
虽然这是伟大的:

<DataGrid Name="DataGrid" LoadingRow="DataGrid_LoadingRow" ...

void DataGrid_LoadingRow(object sender, DataGridRowEventArgs e)
{
    e.Row.Header = (e.Row.GetIndex()).ToString(); 
}

我的标题混乱时删除和添加项目。如果你有按钮负责,只需在“删除”代码下添加dataGrid.Items.Refresh();,就像我的情况一样:

private void removeButton_Click(object sender, RoutedEventArgs e)
{
    // delete items

    dataGrid.Items.Refresh();
}

这就解决了我的去同步计数问题,因为刷新项会再次调用DataGrig_LoadingRow

fhity93d

fhity93d5#

为了补充一下关于这个的讨论...(我花了很多时间来发现这一点!).
您需要将数据网格上的EnableRowVirtualization设置为False,以防止行排序中出现错误:

EnableRowVirtualization="False"

默认情况下,EnableRowVirtualization属性设置为true。当EnableRowVirtualization属性设置为true时,DataGrid不会为绑定数据源中的每个数据项示例化DataGridRow对象。相反,DataGrid仅在需要时创建DataGridRow对象,并尽可能多地重用它们。MSDN Reference here

u2nhd7ah

u2nhd7ah6#

只是另一个答案,提供几乎复制和粘贴的例子(不鼓励)为新人或匆忙的人,灵感来自@GrantA和@Johan Larsson(+许多其他人谁回答了关于这个问题的许多帖子)的答案

  • 您可能不希望在列中添加枚举
  • 您不需要重新创建自己的附加属性
<UserControl...

<Grid>
    <DataGrid ItemsSource="{Binding MainData.ProjColl}" 
              AutoGenerateColumns="False"
              AlternationCount="{ Binding MainData.ProjColl.Count}" >
        <DataGrid.Columns>
            <!--Columns given here for example-->
            ...
            <DataGridTextColumn Header="Project Name" 
                                Binding="{Binding CMProjectItemDirName}"
                                IsReadOnly="True"/>
            ...
            <DataGridTextColumn Header="Sources Dir" 
                                Binding="{Binding CMSourceDir.DirStr}"/>
            ...
        </DataGrid.Columns>

        <!--The problem of the day-->
        <DataGrid.RowHeaderStyle>
            <Style TargetType="{x:Type DataGridRowHeader}">
                <Setter Property="Content" 
                 Value="{Binding Path=(ItemsControl.AlternationIndex),
                 RelativeSource={RelativeSource AncestorType=DataGridRow}}"/>
            </Style>
        </DataGrid.RowHeaderStyle>
    </DataGrid>
</Grid>

</UserControl>

注意(ItemsControl.AlternationIndex)周围的括号(),如Fredrik Hedblad answer in Check if Row as odd number中所警告的

8wigbo56

8wigbo567#

在使用RowHeaderStyle进行了一些测试后,NGI的修复和扩展样本:

<DataGrid EnableRowVirtualization="false" ItemsSource="{Binding ResultView}" AlternationCount="{Binding ResultView.Count}" RowHeaderWidth="10">
            <DataGrid.RowHeaderStyle>
                <Style TargetType="{x:Type DataGridRowHeader}">
                    <Setter Property="Content" Value="{Binding Path=AlternationIndex, RelativeSource={RelativeSource AncestorType=DataGridRow}}" />
                </Style>
            </DataGrid.RowHeaderStyle>
        </DataGrid>
4jb9z9bj

4jb9z9bj8#

使用附加的属性,完整的源代码here

using System.Windows;
using System.Windows.Controls;

public static class Index
{
    private static readonly DependencyPropertyKey OfPropertyKey = DependencyProperty.RegisterAttachedReadOnly(
        "Of",
        typeof(int),
        typeof(Index),
        new PropertyMetadata(-1));

    public static readonly DependencyProperty OfProperty = OfPropertyKey.DependencyProperty;

    public static readonly DependencyProperty InProperty = DependencyProperty.RegisterAttached(
        "In",
        typeof(DataGrid),
        typeof(Index),
        new PropertyMetadata(default(DataGrid), OnInChanged));

    public static void SetOf(this DataGridRow element, int value)
    {
        element.SetValue(OfPropertyKey, value);
    }

    public static int GetOf(this DataGridRow element)
    {
        return (int)element.GetValue(OfProperty);
    }

    public static void SetIn(this DataGridRow element, DataGrid value)
    {
        element.SetValue(InProperty, value);
    }

    public static DataGrid GetIn(this DataGridRow element)
    {
        return (DataGrid)element.GetValue(InProperty);
    }

    private static void OnInChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        var row = (DataGridRow)d;
        row.SetOf(row.GetIndex());
    }
}

Xaml:

<DataGrid ItemsSource="{Binding Data}">
    <DataGrid.RowStyle>
        <Style TargetType="{x:Type DataGridRow}">
            <Setter Property="dataGrid2D:Index.In" 
                    Value="{Binding RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}" />
        </Style>
    </DataGrid.RowStyle>

    <DataGrid.RowHeaderStyle>
        <Style TargetType="{x:Type DataGridRowHeader}">
            <Setter Property="Content" 
                    Value="{Binding Path=(dataGrid2D:Index.Of), 
                                    RelativeSource={RelativeSource AncestorType={x:Type DataGridRow}}}" />
        </Style>
    </DataGrid.RowHeaderStyle>
</DataGrid>

相关问题