Гость
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / WPF DataGrid поле счетчик / 25 сообщений из 105, страница 1 из 5
06.02.2020, 22:22
    #39923689
WPF DataGrid поле счетчик
Добрый вечер, уважаемые!

Подскажите пожалуйста, как можно сделать поле счетчик в DataGrid. Который бы тупо нумеровал записи, начиная с 1. При удалении записи - пересчитывался бы без образовавшейся "дырки". Я так полагаю нужно написать выражение в binding поля, но как его составить правильно для такого случая?

Благодарю.
...
Рейтинг: 0 / 0
06.02.2020, 23:28
    #39923696
ВМоисеев
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WPF DataGrid поле счетчик
>Евгений Стронг, сегодня, 22:22 https://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1322025&msg=22075178][22075178]
>Подскажите пожалуйста, как можно сделать …
<Можно так - поместите информацию в List и привяжите List к DataGrid: dataGrid1.DataSource = list;
...
Рейтинг: 0 / 0
07.02.2020, 00:49
    #39923707
Roman Mejtes
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WPF DataGrid поле счетчик
Индекс элемента в DataGrid нужно вычислять по индексу контейнера, а не самого элемента

Модель представления, просто предоставляет список объектов Person:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
    public class BaseModel : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;

        protected void OnPropertyChanged(string propertyName) 
            => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
    public class Person : BaseModel
    {
        public string Name { set; get; }
        public int Age { set; get; }

    }
    public class MainModel : BaseModel
    {
        public MainModel()
        {
            _persones = new ObservableCollection<Person>();
            int count = 100;
            while(count-- > 0)
            {
                _persones.Add(new Person() { Name = $"Person #{count}", Age = 20 + count % 10 });
            }
            Persones = new ListCollectionView(_persones);
        }

        internal void RemovePerson(object currentItem)
        {
            _persones.Remove(currentItem);
        }

        private IList _persones;
        public ICollectionView Persones { set; get; } 
    }


Конвертер, в качестве параметров передается объект DataGrid и элемент списка Person (или другие NewPlaceHolder, для примера), определяется контейнер элемента (DataGridRow) и её индекс:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
    public class RowNumberConverter : IMultiValueConverter
    {
        public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
        {
            DataGrid dataGrid = (DataGrid)values[0];
            object value = values[1];
            System.Windows.DependencyObject container = dataGrid.ItemContainerGenerator.ContainerFromItem(value);
            if (container == null) return string.Empty;
            return (dataGrid.ItemContainerGenerator.IndexFromContainer(container) + 1).ToString();
        }

        public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
        {
            return new object[2];
        }
    }


Представление, в ресурсах переопределен шаблон заголовка строки DataGrid'а, можно это делать как угодно.
Тут есть 1 лайфхак, в мультибиндинге в конвертер передается ожидаемый объект списка и датагрид, но еще передается количество элементов в представлении коллекции, как только добавляется элемент или удаляется из коллекции он изменяется и это приводит к обновлению биндинга и обновлению значения, без этого работать нормально не будет.
Так же нужно выключить тип виртуализации Recycled и включить Standard, иначе так же работать будет криво.
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
<Window x:Class="DataGridColumn.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:DataGridColumn"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Window.DataContext>
        <local:MainModel/>
    </Window.DataContext>
    <Window.Resources>
        <local:RowNumberConverter x:Key="RowNumberConverter"/>
        <Style TargetType="{x:Type DataGridRowHeader}">
            
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type DataGridRowHeader}">
                        <Border BorderThickness="{TemplateBinding BorderThickness}" BorderBrush="{TemplateBinding BorderBrush}"
                                Background="{TemplateBinding Background}" Margin="{TemplateBinding Margin}">
                            <TextBlock Margin="0,5" TextAlignment="Right">
                                <TextBlock.Text>
                                    <MultiBinding Converter="{StaticResource RowNumberConverter}" Mode="OneWay">
                                        <Binding RelativeSource="{RelativeSource FindAncestor, AncestorType={x:Type DataGrid}}"/>
                                        <Binding />
                                        <Binding Path="Items.Count" RelativeSource="{RelativeSource FindAncestor, AncestorType={x:Type DataGrid}}"/>
                                    </MultiBinding>
                                </TextBlock.Text>
                            </TextBlock>
                        </Border>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </Window.Resources>
    <Grid>
        <DataGrid x:Name="PART_DataGrid" ItemsSource="{Binding Persones}" AutoGenerateColumns="False"
                  VirtualizingPanel.VirtualizationMode="Standard">
            <DataGrid.Columns>
                <DataGridTextColumn Header="Name" Binding="{Binding Name}"/>
                <DataGridTextColumn Header="Age" Binding="{Binding Age}"/>
            </DataGrid.Columns>
        </DataGrid>
    </Grid>
</Window>


всякие проверки в код не включаю, так как делал на коленке
...
Рейтинг: 0 / 0
07.02.2020, 18:27
    #39924019
WPF DataGrid поле счетчик
Roman Mejtes,

Мама дорогая. Это вот только нужно всего, чтобы тупо отображался порядковый номер строки? Жесть... Я лучше в хранимке в результатирующий набор добавлю поле, в котором циклом буду проставлять порядок.
...
Рейтинг: 0 / 0
07.02.2020, 20:30
    #39924055
WPF DataGrid поле счетчик
Roman Mejtes,

Нашел такое вот решение:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
    public class NumerRow : IValueConverter
    {
        public object Convert(object value, Type TargetType, object parameter, CultureInfo culture)
        {
            var item = (DataGridRow)value;
            var datgrid = ItemsControl.ItemsControlFromItemContainer(item) as DataGrid;
            int index = datgrid.ItemContainerGenerator.IndexFromContainer(item) + 1;
            return index.ToString();
        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }



WPF

Код: xml
1.
2.
3.
    <DataGridTextColumn Binding="{Binding Converter={StaticResource NumberRow}, Mode=OneWay, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGridRow}}}"
                    ClipboardContentBinding="{x:Null}"
                    Header="№"/>



Всё срабатывает, но почему нумерация сбивается, совершенно не понятно...
...
Рейтинг: 0 / 0
07.02.2020, 20:48
    #39924057
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WPF DataGrid поле счетчик
Потому что виртуализация и переиспользование контейнера.
...
Рейтинг: 0 / 0
07.02.2020, 21:05
    #39924063
WPF DataGrid поле счетчик
Shocker.Pro
Потому что виртуализация и переиспользование контейнера.


Круто конечно. Но прозвучало честно говоря, как заклинание. Можно немного подробнее и есть ли решение?
...
Рейтинг: 0 / 0
07.02.2020, 23:58
    #39924102
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WPF DataGrid поле счетчик
Евгений Стронг
Можно немного подробнее
Неплохо бы начинать с учебника, а не с метода тыка. Особенно это касается WPF, ведь он непрост.
https://metanit.com/sharp/wpf/14.5.php

Евгений Стронг
есть ли решение?
я бы делал нумерацию строк на уровне модели, то бишь источника данных
...
Рейтинг: 0 / 0
08.02.2020, 00:47
    #39924112
ВМоисеев
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WPF DataGrid поле счетчик
>Shocker.Pro, вчера, 23:58 https://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1322025&msg=22075858][22075858]
>я бы делал нумерацию строк на уровне модели, то бишь источника данных
<
так оно и есть,
но не понятен смысл нумерации, что она даёт, изменил сортировку - и поплыла нумерация
...
Рейтинг: 0 / 0
08.02.2020, 04:22
    #39924131
Сон Веры Павловны
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WPF DataGrid поле счетчик
ВМоисеев
но не понятен смысл нумерации, что она даёт, изменил сортировку - и поплыла нумерация

Иногда полезно вникать в код, приведённый выше. У того решения, которое привёл Роман, нумерация при сортировке остаётся неизменной.
...
Рейтинг: 0 / 0
08.02.2020, 12:43
    #39924168
WPF DataGrid поле счетчик
Сон Веры Павловны
ВМоисеев
но не понятен смысл нумерации, что она даёт, изменил сортировку - и поплыла нумерация

Иногда полезно вникать в код, приведённый выше. У того решения, которое привёл Роман, нумерация при сортировке остаётся неизменной.


Я написал про то, что как сложно оно реализуется. Такой достаточно стандартный функционал, можно было и добавить как стандартную фичу в DataGrid. Вроде преимущества WPF, но в то же время по сравнению с вин контролами - достаточно напутано.
...
Рейтинг: 0 / 0
08.02.2020, 12:44
    #39924169
ВМоисеев
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WPF DataGrid поле счетчик
>Сон Веры Павловны, сегодня, 04:22 https://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1322025&msg=22075896][22075896]
>Иногда полезно вникать в код…
<
Согласен.
Но не менее полезно знать для чего это нужно.
Что нужно задавшему вопрос? Он хочет пронумеровать строки грида, или строки выборки? И что это дает?
Если строки грида, то при сортировке закрепление номера за строкой выборки изменится.
Если нумеруются строки выборки, то при сортировке нарушится последовательность номеров.
...
Рейтинг: 0 / 0
08.02.2020, 12:50
    #39924171
WPF DataGrid поле счетчик
ВМоисеев
>Сон Веры Павловны, сегодня, 04:22 https://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1322025&msg=22075896][22075896]
>Иногда полезно вникать в код…
<
Согласен.
Но не менее полезно знать для чего это нужно.
Что нужно задавшему вопрос? Он хочет пронумеровать строки грида, или строки выборки? И что это дает?
Если строки грида, то при сортировке закрепление номера за строкой выборки изменится.
Если нумеруются строки выборки, то при сортировке нарушится последовательность номеров.


Да, мне хотелось просто нумерацию, сверху вниз, не зависимо от сортировки данных. И если сортировка выполнена по какому-то полю, то в любом нумерация снова сверху вниз от 1 до ...
...
Рейтинг: 0 / 0
08.02.2020, 13:12
    #39924176
Eld Hasp
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WPF DataGrid поле счетчик
Евгений Стронг
Такой достаточно стандартный функционал, можно было и добавить как стандартную фичу в DataGrid.

Стандартный...?
Мне он не разу не понадобился.

Я, вообще, не понимаю, что такое номер строки при работе с БД?
В базе это почти ID (если не было удалений).

А если была неполная выборка или с сортировкой? Номер строки выборки? Тогда это должна делать Модель.

А если сортировку, фильтрацию делает ViewModel или View?

Какую полезную информацию, вообще, этот номер может нести в DataGrid?

Допустим, список покупок в корзине. Но список покупок это данные из БД. И номер покупки это часть этих данных хранящихся в БД. И View никоим образом не должна сама ставить эти номера. Она может только отсортировать по ним. А изменение номеров (при удалении, добавлении, пересоритровке) - это функция Модели.

Roman Mejtes , как всегда на высоте.
Решение мне его очень понравилось.
Всё корректно и ничего лишнего.

Евгений Стронг , но вот где вы его собираетесь применить...?
Только может, для редактирования матриц..?
Даже в голову не приходит вариант где может понадобиться в View ставить номера строк.
...
Рейтинг: 0 / 0
08.02.2020, 13:18
    #39924178
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WPF DataGrid поле счетчик
Евгений Стронг
можно было и добавить как стандартную фичу в DataGrid
Чтение учебника опять же помогло бы понять, что DataGrid сам по себе отображает представление - View. Поэтому добавить этот функционал к DataGrid-у как к таковому, не получится. Датагрид - это просто ItemsControl, который отображает коллекцию элементов с помощью своих контейнеров.

Евгений Стронг
по сравнению с вин контролами
не нужно сравнивать с винконтролами. Винконтролы - это прибитые гвоздями жесткие и конечные вещи. Контролы в WPF - это пластилин, из которых можно лепить что хочешь. Но нужно понимать, как они устроены.

В одном из учебников был простейший пример, как сделать вот такое представление для карточной игры (см. картинку). Это обычный ListBox. Можно ли сделать это с помощью винконтроловского листбокса?
...
Рейтинг: 0 / 0
08.02.2020, 13:20
    #39924179
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WPF DataGrid поле счетчик
Eld Hasp
Мне он не разу не понадобился.
+1
я писал ERP с огромным количеством представлений данных в виде гридов. Ни разу не требовалась нумерация строк.
...
Рейтинг: 0 / 0
08.02.2020, 15:30
    #39924201
Сон Веры Павловны
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WPF DataGrid поле счетчик
Eld Hasp
Даже в голову не приходит вариант где может понадобиться в View ставить номера строк.

Я навскидку знаю один пример, где в гриде есть порядковые номера строк - в гриде результатов запроса SSMS. Но это очень специфический случай.

Евгений Стронг
Вроде преимущества WPF, но в то же время по сравнению с вин контролами - достаточно напутано.

А в чём, по-вашему, заключаются эти самые преимущества WPF? Зачем вы решили использовать именно его?
...
Рейтинг: 0 / 0
08.02.2020, 16:05
    #39924209
WPF DataGrid поле счетчик
Shocker.Pro
Eld Hasp
Мне он не разу не понадобился.
+1
я писал ERP с огромным количеством представлений данных в виде гридов. Ни разу не требовалась нумерация строк.


Ну вообще нумерация прекрасный способ увидеть номер вашей строки, на которую вы обратили внимания или хотите запомнить. Даже в MS Studio в результативном наборе тебе возвращаются номера строк. В редакторе кода можно (и нужно) его включать, так как ошибка указывает именно на строку с ошибкой и тд.
...
Рейтинг: 0 / 0
08.02.2020, 16:06
    #39924210
WPF DataGrid поле счетчик
Shocker.Pro
Евгений Стронг
можно было и добавить как стандартную фичу в DataGrid
Чтение учебника опять же помогло бы понять, что DataGrid сам по себе отображает представление - View. Поэтому добавить этот функционал к DataGrid-у как к таковому, не получится. Датагрид - это просто ItemsControl, который отображает коллекцию элементов с помощью своих контейнеров.

Евгений Стронг
по сравнению с вин контролами
не нужно сравнивать с винконтролами. Винконтролы - это прибитые гвоздями жесткие и конечные вещи. Контролы в WPF - это пластилин, из которых можно лепить что хочешь. Но нужно понимать, как они устроены.

В одном из учебников был простейший пример, как сделать вот такое представление для карточной игры (см. картинку). Это обычный ListBox. Можно ли сделать это с помощью винконтроловского листбокса?


О том и речь, что на WPF можно сделать всё, что угодно красивого, а вот добавить элементарный функционал, который на тех же контролах вообще по умолчанию включен - надо плясать с бубном несколько суток.
...
Рейтинг: 0 / 0
08.02.2020, 16:08
    #39924211
WPF DataGrid поле счетчик
Сон Веры Павловны
Eld Hasp
Даже в голову не приходит вариант где может понадобиться в View ставить номера строк.

Я навскидку знаю один пример, где в гриде есть порядковые номера строк - в гриде результатов запроса SSMS. Но это очень специфический случай.

Евгений Стронг
Вроде преимущества WPF, но в то же время по сравнению с вин контролами - достаточно напутано.

А в чём, по-вашему, заключаются эти самые преимущества WPF? Зачем вы решили использовать именно его?


Поддался на маркетинг от мелкософта. Якобы как круто, вы только посмотрите. Всё настраивается и всё очень гибко. Только вот забыли добавить, что это настолько гибко, что вы будете гуглить как сумасшедший не один день ещё, чтобы сделать элементарную настройку, которая на вин контролах делается с помощью настроек мышкой. Ну это ладно) Надо же идти в ногу со временем. Ну а если серьезно, то преимуществ то много на самом деле и то, что я описал выше - является одним из главных - современные технологии.
...
Рейтинг: 0 / 0
08.02.2020, 16:31
    #39924220
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WPF DataGrid поле счетчик
Евгений Стронг
В редакторе кода можно (и нужно) его включать, так как ошибка указывает именно на строку с ошибкой и тд.
Вот видишь, тебе зачем-то нужно. Я лично наоборот - принудительно выключаю нумерацию строк, потому что это лишняя информация, которая рябит в глазах и мешает работать с кодом и отнимает полезное место у экрана.
Перейти в большинстве программ на нужную строку (и студия - не исключение) - Ctrl+G, номер текущей строки всегда отображается в строке состояния, и этого совершенно достаточно, чтобы не мозолить себе глаза ненужным столбцом.
...
Рейтинг: 0 / 0
08.02.2020, 16:32
    #39924221
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WPF DataGrid поле счетчик
Евгений Стронг
Поддался на маркетинг от мелкософта. Якобы как круто, вы только посмотрите. Всё настраивается и всё очень гибко. Только вот забыли добавить, что это настолько гибко, что вы будете гуглить как сумасшедший не один день ещё, чтобы сделать элементарную настройку, которая на вин контролах делается с помощью настроек мышкой. Ну это ладно) Надо же идти в ногу со временем. Ну а если серьезно, то преимуществ то много на самом деле и то, что я описал выше - является одним из главных - современные технологии.
Поэтому существует множество контролов, которые уже написаны, к которым добавлена та или иная функциональность.
...
Рейтинг: 0 / 0
08.02.2020, 16:37
    #39924223
ВМоисеев
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WPF DataGrid поле счетчик
>Евгений Стронг, сегодня, 16:05 https://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1322025&msg=22076023][22076023]
>Ну вообще нумерация прекрасный способ увидеть номер вашей строки, на которую вы обратили внимания или хотите запомнить.
<
Не думаю.
Сортировка и фильтр Ваш прекрасный способ опускают ниже плинтуса.
Для работы хватает этого преобразования:
Код: c#
1.
2.
3.
//-- Получим индекс элемента коллекции
xrow = (row_Entity)dgv_Entity.SelectedItem;
iRow = oc_Entity.IndexOf(xrow);
...
Рейтинг: 0 / 0
08.02.2020, 16:38
    #39924224
WPF DataGrid поле счетчик
Shocker.Pro
Евгений Стронг
В редакторе кода можно (и нужно) его включать, так как ошибка указывает именно на строку с ошибкой и тд.
Вот видишь, тебе зачем-то нужно. Я лично наоборот - принудительно выключаю нумерацию строк, потому что это лишняя информация, которая рябит в глазах и мешает работать с кодом и отнимает полезное место у экрана.
Перейти в большинстве программ на нужную строку (и студия - не исключение) - Ctrl+G, номер текущей строки всегда отображается в строке состояния, и этого совершенно достаточно, чтобы не мозолить себе глаза ненужным столбцом.


Не могу тут согласиться. Грид - это сетка данных. И у каждой ячейки должна быть координата. Прекрасный пример тому - Excel. Элементарная ситуация: Сотрудник выводит набор данных в гриде и подзывает коллегу, говоря ему, что не может найти ту или иную информацию в списке заказов. А тот ему в ответ: Ну вот ведь! На 23 строку посмотри. В противном случае ему пришлось бы тыкать пальцем или говорить - ниже, выше и тд. Нумерация - это идентификатор строки.
...
Рейтинг: 0 / 0
08.02.2020, 16:45
    #39924227
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WPF DataGrid поле счетчик
Евгений Стронг
не может найти ту или иную информацию в списке заказов
ВМоисеев
Сортировка и фильтр Ваш прекрасный способ опускают ниже плинтуса.

У меня несколько десятков человек работали со списком заказов. И за 20 лет ни у кого не возникло потребности, подобной твоей.
...
Рейтинг: 0 / 0
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / WPF DataGrid поле счетчик / 25 сообщений из 105, страница 1 из 5
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]