Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > WPF и Silverlight > Номера строк в дата гриде


Автор: SeregaS 30.3.2009, 19:36
Как сделать что бы в заголовке каждого ряда отображался его номер
желательно задать это в стиле/шаблоне 

Автор: Человек01 31.3.2009, 05:58
SeregaS, смотря какой именно индекс требуется отобразить. 
Если номер строки в DataTable то можно так:
Код

<Window.Resources>
        <CollectionViewSource x:Key="collection"/>
        <loc:RowNumberConverter x:Key="converter"/>
    </Window.Resources>
    <Grid>
        <wpf:DataGrid DataContext="{StaticResource collection}" ItemsSource="{Binding}">
            <wpf:DataGrid.RowHeaderTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type wpf:DataGridRow}},
   Path=Item,Converter={StaticResource converter}}"></TextBlock>
                </DataTemplate>
            </wpf:DataGrid.RowHeaderTemplate>
        </wpf:DataGrid>
    </Grid>
</Window>

Код

public partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();
            this.Loaded += new RoutedEventHandler(Window1_Loaded);
        }

        void Window1_Loaded(object sender, RoutedEventArgs e)
        {
            DataTable dt = new DataTable();
            dt.Columns.Add("name");
            dt.Rows.Add(new object[] { "Александр" });
            dt.Rows.Add(new object[] { "Алекс" });
            dt.Rows.Add(new object[] { "Ал" });
            dt.Rows.Add(new object[] { "Саня" });
            dt.Rows.Add(new object[] { "Санёк" });
            dt.Rows.Add(new object[] { "Саша" });
            dt.Rows.Add(new object[] { "Шурик" });
            ((CollectionViewSource)this.Resources["collection"]).Source = dt.DefaultView;
        }
    }


    public class RowNumberConverter : IValueConverter
    {
        public object Convert(object value, Type targetType,
         object parameter, CultureInfo culture)
        {
            if (value != null && value.GetType() == typeof(DataRowView))            
                return "№"+((DataRowView)value).Row.Table.Rows.IndexOf(((DataRowView)value).Row);            
            return "ха";
        }
        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }

Но это будет отображаться именно номер строки в DataTable
Пользуемся и говорим Человеку спасибо.  smile 

Если же надо конкретный номер строки DataGrid то тогда можно попробовать заменить
((DataRowView)value).Row.Table.Rows.IndexOf(((DataRowView)value).Row);
на
((DataRowView)value).DataView.Find("кого ищем"), но тут будут две проблемы первая перед использованием Find надо применить сортировку к нашей DataView(dt.DefaultView.Sort где нить в Loaded) и вторая одинаковые названия(хотя может и нет)

Еще у DataGridRow есть метод GetIndex(), можно как нить к нему подобраться.
Ну вот собственно такие мысли, надеюсь поможет...
 smile 




Автор: SeregaS 1.4.2009, 08:39
Спасибо, что то в этом роде и надо сделать
видел что то похожее на msdn форуме,  мне удавалось забиндить в неадер номера строк полученные из  SQL запроса ( numROW)
Но как бы хочется верить что существует простое и элегантное решении этой проблеммы .

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)