powered by simpleCommunicator - 2.0.28     © 2024 Programmizd 02
Map
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / WPF DataGrid поле счетчик
25 сообщений из 105, страница 1 из 5
WPF DataGrid поле счетчик
    #39923689
Добрый вечер, уважаемые!

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

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

Мама дорогая. Это вот только нужно всего, чтобы тупо отображался порядковый номер строки? Жесть... Я лучше в хранимке в результатирующий набор добавлю поле, в котором циклом буду проставлять порядок.
...
Рейтинг: 0 / 0
WPF DataGrid поле счетчик
    #39924055
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
WPF DataGrid поле счетчик
    #39924057
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Потому что виртуализация и переиспользование контейнера.
...
Рейтинг: 0 / 0
WPF DataGrid поле счетчик
    #39924063
Shocker.Pro
Потому что виртуализация и переиспользование контейнера.


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

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

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

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


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


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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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


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

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

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

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


Поддался на маркетинг от мелкософта. Якобы как круто, вы только посмотрите. Всё настраивается и всё очень гибко. Только вот забыли добавить, что это настолько гибко, что вы будете гуглить как сумасшедший не один день ещё, чтобы сделать элементарную настройку, которая на вин контролах делается с помощью настроек мышкой. Ну это ладно) Надо же идти в ногу со временем. Ну а если серьезно, то преимуществ то много на самом деле и то, что я описал выше - является одним из главных - современные технологии.
...
Рейтинг: 0 / 0
WPF DataGrid поле счетчик
    #39924220
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Евгений Стронг
В редакторе кода можно (и нужно) его включать, так как ошибка указывает именно на строку с ошибкой и тд.
Вот видишь, тебе зачем-то нужно. Я лично наоборот - принудительно выключаю нумерацию строк, потому что это лишняя информация, которая рябит в глазах и мешает работать с кодом и отнимает полезное место у экрана.
Перейти в большинстве программ на нужную строку (и студия - не исключение) - Ctrl+G, номер текущей строки всегда отображается в строке состояния, и этого совершенно достаточно, чтобы не мозолить себе глаза ненужным столбцом.
...
Рейтинг: 0 / 0
WPF DataGrid поле счетчик
    #39924221
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Евгений Стронг
Поддался на маркетинг от мелкософта. Якобы как круто, вы только посмотрите. Всё настраивается и всё очень гибко. Только вот забыли добавить, что это настолько гибко, что вы будете гуглить как сумасшедший не один день ещё, чтобы сделать элементарную настройку, которая на вин контролах делается с помощью настроек мышкой. Ну это ладно) Надо же идти в ногу со временем. Ну а если серьезно, то преимуществ то много на самом деле и то, что я описал выше - является одним из главных - современные технологии.
Поэтому существует множество контролов, которые уже написаны, к которым добавлена та или иная функциональность.
...
Рейтинг: 0 / 0
WPF DataGrid поле счетчик
    #39924223
ВМоисеев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Евгений Стронг, сегодня, 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
WPF DataGrid поле счетчик
    #39924224
Shocker.Pro
Евгений Стронг
В редакторе кода можно (и нужно) его включать, так как ошибка указывает именно на строку с ошибкой и тд.
Вот видишь, тебе зачем-то нужно. Я лично наоборот - принудительно выключаю нумерацию строк, потому что это лишняя информация, которая рябит в глазах и мешает работать с кодом и отнимает полезное место у экрана.
Перейти в большинстве программ на нужную строку (и студия - не исключение) - Ctrl+G, номер текущей строки всегда отображается в строке состояния, и этого совершенно достаточно, чтобы не мозолить себе глаза ненужным столбцом.


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

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


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