Méthode Simple pour afficher les numéros de ligne sur la DataGrid WPF

je veux juste afficher les numéros de ligne dans la colonne de gauche de mon DataGrid . Est-il un attribut pour ce faire?

Gardez à l'esprit, ce n'est pas une clé primaire de ma table. Je ne veux pas que ces numéros de ligne bougent avec leurs lignes quand une colonne est triée. En gros, je veux un comte de course à pied. Il n'a même pas besoin d'avoir un en-tête.

21
demandé sur JohnB 2011-01-11 23:00:04

7 réponses

une façon est de les ajouter dans L'événement LoadingRow pour le DataGrid

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

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

lorsque des éléments sont ajoutés ou supprimés de la liste des sources, les numéros peuvent être désynchronisés pendant un certain temps. Pour une correction à cela, voir le comportement ci-joint:

WPF 4 DataGrid: entrer le numéro de ligne dans le lecteur

utilisable comme ceci

<DataGrid ItemsSource="{Binding ...}"
          behaviors:DataGridBehavior.DisplayRowNumber="True"> 
31
répondu Fredrik Hedblad 2017-05-23 11:54:38

ajoutant une brève information sur la réponse de Fredrik Hedblad.

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

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

...Si vous voulez commencer à numéroter à partir de 1

9
répondu JohnnyJaxs 2013-11-21 07:50:12

si votre data grid a son ItemsSource lié à une collection, liez la propriété AlternationCount de votre data grid à la propriété The count de votre collection, ou aux Items.Compter la propriété de votre DataGrid comme suit:

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

ou:

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

ça devrait marcher.

alors, en supposant que vous utilisez une DataGridTextColumn pour votre colonne de gauche, vous faites ce qui suit dans votre DataGrid.Colonne définition:

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

Si vous ne voulez pas commencer à 0, vous pouvez ajouter un convertisseur à votre liaison à incrémenter l'index.

5
répondu GrantA 2016-11-14 21:41:32

Et juste pour ajouter à la discussion sur ce point... (J'ai passé trop de temps à trouver!).

vous aurez besoin de définir L'EnableRowVirtualization à False sur le datagrid pour prévenir les erreurs dans le séquençage de la ligne:

EnableRowVirtualization="False"

la propriété EnableRowVirtualization est définie à true par défaut. Lorsque la propriété EnableRowVirtualization est définie à true, le DataGrid n'instancie pas un objet DataGridRow pour chaque élément de données dans la source de données liée. Au lieu de cela, le DataGrid crée des objets DataGridRow seulement quand ils sont nécessaires, et les réutilise autant que possible. MSDN référence ici

3
répondu P_Fitz 2015-04-24 15:53:27

C'est une vieille question, mais je voudrais partager quelque chose. J'ai eu un problème similaire, tout ce dont j'avais besoin était une simple RowHeader numération de lignes et la réponse de Fredrik Hedblad était presque complète pour mon problème.

Tout ce qui est excellent:

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

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

mes en-têtes ont foiré en enlevant et en ajoutant des articles. Si vous avez des boutons responsables de cela il suffit d'ajouter dataGrid.Items.Refresh(); sous le code de "suppression" comme dans mon cas:

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

    dataGrid.Items.Refresh();
}

qui a résolu la numération désyncronisée pour moi, parce que les éléments rafraîchissants appelle DataGrig_LoadingRow de nouveau.

2
répondu trollsteen 2016-01-06 19:59:22

juste une autre réponse pour fournir presque copier & coller exemple (à ne pas encourager) pour les nouvelles personnes ou les gens dans une ruée, inspiré par les réponses à l'intérieur de ce post par @GrantA et @Johan Larsson ( + beaucoup d'autres personnes qui ont répondu aux nombreux messages sur ce sujet)

  • vous pouvez ne pas vouloir ajouter l'énumération à l'intérieur d'une colonne
  • vous n'avez pas besoin de recréer votre propre propriété attachée

    <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>
    

Notez les parenthèses () autour de (ItemsControl.AlternationIndex) comme indiqué dans Fredrik Hedblad réponse Cochez si ligne impaire

enter image description here

1
répondu NGI 2017-05-23 12:10:03

utilisant les propriétés attachées, source complète ici .

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>
0
répondu Johan Larsson 2015-07-02 21:08:30