2011-01-11 1 views
19

Я просто хочу отобразить номера строк в крайнем левом столбце моего DataGrid. Есть ли какой-то атрибут для этого?Простой способ отображения номеров строк в WPF DataGrid

Имейте в виду, что это не первичный ключ для моего стола. Я не хочу, чтобы эти номера строк перемещались со своими строками при сортировке столбца. Я в основном хочу работать счет. Ему даже не нужен заголовок.

+0

возможный дубликат [Как показывают индекс строки для МОФ инструментария DataGrid?] (Http://stackoverflow.com/questions/2041168/how-to-show-row-index-for-wpf-toolkit-datagrid) –

+1

Возможно, я пропустил вопрос, хотите ли вы иметь отдельный столбец для этого или есть RowHeader нормально? –

+1

'RowHeader' отлично, спасибо. – JohnB

ответ

30

Один из способов, чтобы добавить их в случае LoadingRow для DataGrid

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

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

Когда элементы добавлены или удалены из списка источников то числа могут выйти из синхронизации на некоторое время. Для исправления этого, вложенном поведение здесь:
WPF 4 DataGrid: Getting the Row Number into the RowHeader

нравится эта Объем доступной

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

Это перемещает номера строк во время сортировки? или во время сортировки также вызывается 'LoadRow', что будет держать рулонный номер в порядке? – VoodooChild

+2

@VoodooChild: Да, я использовал это несколько раз, и ряды чисел всегда находятся в правильном порядке, насколько я могу судить, даже при сортировке, прокрутке, изменении ItemsSource и т. Д. Хотя, один человек здесь сказал что это не сработало для него. Я попросил его получить больше информации, но он так и не ответил. Но для меня я никогда не видел ситуации, когда это не удается :) –

+2

Если вы хотите начать с # 1: 'e.Row.Header = (e.Row.GetIndex() + 1) .ToString();' – JohnB

9

Добавление краткую информацию о Фредрик Hedblad ответ.

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

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

... Если вы хотите, чтобы начать нумерацию с 1

3

И только добавить к дискуссии по этому вопросу ... (я потратил слишком много времени на поиск этого!).

Вам нужно установить EnableRowVirtualization Ложь на сетке, чтобы предотвратить ошибки в строке последовательности:

EnableRowVirtualization="False" 

Свойство EnableRowVirtualization устанавливается в true по умолчанию. Если для свойства EnableRowVirtualization установлено значение true, DataGrid не создает объект DataGridRow для каждого элемента данных в связанном источнике данных. Вместо этого DataGrid создает объекты DataGridRow только тогда, когда они необходимы, и повторно использует их как можно больше. MSDN Reference here

0

Использование прилагаемых свойств, полный источник 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> 
2

Это старый вопрос, но я хотел бы поделиться кое-что. У меня была аналогичная проблема, мне нужна была простая нумерация строк 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(); 
} 

Это решило desyncronized нумерацию для меня, потому что освежает детали снова вызывает DataGrig_LoadingRow.

4

Если сетка данных имеет ItemsSource привязан к коллекции, связать AlternationCount свойство вашей сетки данных, либо счетчик свойство вашей коллекции, или к свойству Items.Count вашего DataGrid следующим образом:

<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, вы можете добавить конвертер к вашей привязке для увеличения индекса.

+1

Это не будет работать правильно, если вы прокрутили в datagrid и перезагрузили свою коллекцию. Нумерация начнется с 0 на элементе вверху, где вы прокручивались в datagrid. – Jesper

+0

Это сработало для меня. Но номер индекса меняется случайным образом, когда я прокручиваю данные по datagrid с помощью мыши. КАК исправить это? –

1

Только один ответ, чтобы предоставить почти копию & пример вставки (не рекомендуется) для новых людей или людей в спешке, вдохновленных ответами в этом сообщении от @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

enter image description here

Смежные вопросы