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

Joh*_*hnB 25 c# wpf wpfdatagrid

我只想在我最左边的列中显示行号DataGrid.这有什么属性吗?

请记住,这不是我桌子的主键.当列排序时,我不希望这些行号与它们的行一起移动.我基本上想要一个运行计数.它甚至不需要标题.

Fre*_*lad 35

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

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

void DataGrid_LoadingRow(object sender, DataGridRowEventArgs e)
{
    e.Row.Header = (e.Row.GetIndex()).ToString(); 
}
Run Code Online (Sandbox Code Playgroud)

在源列表中添加或删除项目时,这些数字可能会暂时不同步.有关此问题的修复,请参阅此处附加的行为:
WPF 4 DataGrid:将行号放入RowHeader

可以这样使用

<DataGrid ItemsSource="{Binding ...}"
          behaviors:DataGridBehavior.DisplayRowNumber="True"> 
Run Code Online (Sandbox Code Playgroud)

  • @VoodooChild:是的,我已经使用了几次,就我所知,Row-Numbers总是按照正确的顺序排列,即使是排序,滚动,更改ItemsSource等等.虽然这里有一个人告诉我它不适合他.我向他询问了更多信息,但他从未回复过.但对我来说,我从未见过这种失败的情况:) (2认同)
  • 如果你想从#1开始:`e.Row.Header =(e.Row.GetIndex()+ 1).ToString();` (2认同)

Joh*_*axs 9

添加关于Fredrik Hedblad答案的简短信息.

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

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

...如果你想从1开始编号


Gra*_*ntA 9

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

<DataGrid ItemsSource="{Binding MyObservableCollection}" AlternationCount="{Binding MyObservableCollection.Count}" />
Run Code Online (Sandbox Code Playgroud)

要么:

<DataGrid ItemsSource="{Binding MyObservableCollection}" AlternationCount="{Binding Items.Count, RelativeSource={RelativeSource Self}" />
Run Code Online (Sandbox Code Playgroud)

要么应该工作.

然后,假设您在最左侧的列中使用DataGridTextColumn,则在DataGrid.Columns定义中执行以下操作:

<DataGrid.Columns>
   <DataGridTextColumn Binding="{Binding AlternationIndex, RelativeSource={RelativeSource AncestorType=DataGridRow}}"
</DataGrid.Columns>
Run Code Online (Sandbox Code Playgroud)

如果您不想从0开始,可以在绑定中添加转换器以增加索引.

  • 如果您在数据网格中滚动并重新加载您的集合,这将无法正常工作。编号将从您在数据网格中滚动到的顶部的项目上的 0 开始。 (2认同)

tro*_*een 6

这是一个老问题,但我想分享一些东西。我有一个类似的问题,我所需要的只是一个简单RowHeader的行数,而 Fredrik Hedblad 的回答对我的问题来说几乎是完整的。

虽然这很棒:

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

void DataGrid_LoadingRow(object sender, DataGridRowEventArgs e)
{
    e.Row.Header = (e.Row.GetIndex()).ToString(); 
}
Run Code Online (Sandbox Code Playgroud)

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

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

    dataGrid.Items.Refresh();
}
Run Code Online (Sandbox Code Playgroud)

这为我解决了不同步的计数,因为刷新项目DataGrig_LoadingRow再次调用。