我只想在DataGrid的最左边的列中显示行号。有什么属性可以做到这一点吗?
DataGrid
请记住,这不是我的表的主键。我不希望在对列进行排序时,这些行号随它们的行移动。我基本上是要一个运行计数。它甚至不需要一个标题。
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">
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开始编号
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开始,你可以在绑定中添加一个转换器来增加索引。
mw3dktmi4#
这是一个老问题,但我想分享一些东西。我有一个类似的问题,我所需要的只是一个简单的RowHeader行计数,Fredrik Hedblad的答案几乎完成了我的问题。虽然这是伟大的:
RowHeader
我的标题混乱时删除和添加项目。如果你有按钮负责,只需在“删除”代码下添加dataGrid.Items.Refresh();,就像我的情况一样:
dataGrid.Items.Refresh();
private void removeButton_Click(object sender, RoutedEventArgs e) { // delete items dataGrid.Items.Refresh(); }
这就解决了我的去同步计数问题,因为刷新项会再次调用DataGrig_LoadingRow。
DataGrig_LoadingRow
fhity93d5#
为了补充一下关于这个的讨论...(我花了很多时间来发现这一点!).您需要将数据网格上的EnableRowVirtualization设置为False,以防止行排序中出现错误:
EnableRowVirtualization="False"
默认情况下,EnableRowVirtualization属性设置为true。当EnableRowVirtualization属性设置为true时,DataGrid不会为绑定数据源中的每个数据项示例化DataGridRow对象。相反,DataGrid仅在需要时创建DataGridRow对象,并尽可能多地重用它们。MSDN Reference here
EnableRowVirtualization
true
DataGridRow
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中所警告的
8wigbo567#
在使用RowHeaderStyle进行了一些测试后,NGI的修复和扩展样本:
RowHeaderStyle
<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>
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>
8条答案
按热度按时间q0qdq0h21#
一种方法是将它们添加到DataGrid的LoadingRow事件中
当从源列表中添加或删除项目时,数字可能会在一段时间内失去同步。有关此问题的修复,请参阅此处附带的行为:
WPF 4 DataGrid:将行号输入行标题
像这样可折叠的
wfypjpf42#
添加有关Fredrik Hedblad回答的简短信息。
.如果要从1开始编号
vtwuwzda3#
如果您的数据网格将其ItemsSource绑定到集合,请将数据网格的AlternationCount属性绑定到集合的count属性或DataGrid的Items.Count属性,如下所示:
或者:
两者都应该工作。
然后,假设您正在为最左侧的列使用DataGridTextColumn,则在DataGrid.Columns定义中执行以下操作:
如果你不想从0开始,你可以在绑定中添加一个转换器来增加索引。
mw3dktmi4#
这是一个老问题,但我想分享一些东西。我有一个类似的问题,我所需要的只是一个简单的
RowHeader
行计数,Fredrik Hedblad的答案几乎完成了我的问题。虽然这是伟大的:
我的标题混乱时删除和添加项目。如果你有按钮负责,只需在“删除”代码下添加
dataGrid.Items.Refresh();
,就像我的情况一样:这就解决了我的去同步计数问题,因为刷新项会再次调用
DataGrig_LoadingRow
。fhity93d5#
为了补充一下关于这个的讨论...(我花了很多时间来发现这一点!).
您需要将数据网格上的EnableRowVirtualization设置为False,以防止行排序中出现错误:
默认情况下,
EnableRowVirtualization
属性设置为true
。当EnableRowVirtualization
属性设置为true时,DataGrid不会为绑定数据源中的每个数据项示例化DataGridRow
对象。相反,DataGrid仅在需要时创建DataGridRow对象,并尽可能多地重用它们。MSDN Reference hereu2nhd7ah6#
只是另一个答案,提供几乎复制和粘贴的例子(不鼓励)为新人或匆忙的人,灵感来自@GrantA和@Johan Larsson(+许多其他人谁回答了关于这个问题的许多帖子)的答案
注意(ItemsControl.AlternationIndex)周围的括号(),如Fredrik Hedblad answer in Check if Row as odd number中所警告的
8wigbo567#
在使用
RowHeaderStyle
进行了一些测试后,NGI的修复和扩展样本:4jb9z9bj8#
使用附加的属性,完整的源代码here。
Xaml: