Форум программистов, компьютерный форум, киберфорум
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
0 / 1 / 0
Регистрация: 24.04.2020
Сообщений: 80
WPF

Как вывести кол-во определенных строк с DataGrid

08.11.2022, 16:50. Показов 947. Ответов 10

Студворк — интернет-сервис помощи студентам
Вопрос состоит в том, что при прокрутки таблицы вниз, с зоны стрима чекбоксы пропадают, соответственно и их количество с Label'a. Плюс к этому лишний раз считается кол-во проставленных галочек. Как исправить хотя бы, уменьшение кол-ва при прокрутки вниз по таблице.



Отображение данных:
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
35
36
37
38
39
40
41
int countCheck = 0;
 
 
for (int i = 0; i < objectDisplays.Count; i++)
            {
                if (objectDisplays[i].StatusCheck == true)
                {
                    countCheck++;
                }
            }
 
void OnChecked(object sender, RoutedEventArgs e)
        {
            //for (int i = 0; i < objectDisplays.Count; i++)
            //{
            //    if (objectDisplays[i].StatusCheck == true)
            //    {
 
            if (outputCount == 0)
            {
                countCheck = (countCheck + 1) / 2;
                outputCount++;
            }
            else
            {
                countCheck++;
            }
            
            
            //    }
            //}
 
            countBoolCheck.Content = countCheck.ToString();
        }
 
        void OnUnchecked(object sender, RoutedEventArgs e)
        {
            countCheck--;
 
            countBoolCheck.Content = countCheck.ToString();
        }
XAML Datagrid Code
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
46
47
48
49
50
51
<DataGrid x:Name="table"
                              Margin="10, 10, 10, 10"
                              ItemsSource="{Binding}"
                              AutoGenerateColumns="False"
                              CanUserAddRows="False"
                              HorizontalScrollBarVisibility="Hidden">
 
                        <DataGrid.Columns>
 
                            <DataGridTextColumn Header="OBIS"
                                                IsReadOnly="True"
                                                Width="40*"
                                                Binding="{Binding Obis}"/>
 
                            <DataGridTextColumn Header="Название"
                                                IsReadOnly="True"
                                                Width="250*"
                                                Binding="{Binding Title}"/>
 
                            <DataGridCheckBoxColumn Header="Состояние"
                                                    x:Name="StatusCheck"
                                                    Binding="{Binding StatusCheck}"
                                                    Width="50*">
                                
                                <DataGridCheckBoxColumn.CellStyle>
                                    
                                    <Style>
                                        
                                        <EventSetter Event="CheckBox.Checked" 
                                                     Handler="OnChecked"/>
 
                                        <EventSetter Event="CheckBox.Unchecked"
                                                     Handler="OnUnchecked"/>
 
                                    </Style>
                                    
                                </DataGridCheckBoxColumn.CellStyle>
 
                            </DataGridCheckBoxColumn>
 
                            <!--<DataGridComboBoxColumn Header="Порядок"
                                                    x:Name="cmb"
                                                    Width="40*"/>-->
 
                            <DataGridTextColumn Header="Порядок"
                                                Width="50*"
                                                Binding="{Binding Series}"/>
 
                        </DataGrid.Columns>
 
                    </DataGrid>
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
08.11.2022, 16:50
Ответы с готовыми решениями:

Как определить кол-во строк в DataGrid
VisibleRowCount - выдает кол-во строк только после их загрузки. Можно ли посчитать это значение до их загрузки

Как вывести цифру означающую кол-во строк
На вход подается массив строк. Надо вернуть цифру, означающую количество строк, которые: - как минимум два символа длиной - и у...

WPF / UWP DataGrid какое событие возникает после изменения кол-ва строк?
Привет всем! Собственно сабж) Вроде всё перепробовал... (манипуляция, лоадед...) (нужно именно после!) Заранее спасибо ВС

10
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16124 / 11248 / 2888
Регистрация: 21.04.2018
Сообщений: 33,082
Записей в блоге: 2
08.11.2022, 18:54
Цитата Сообщение от Aigulik Посмотреть сообщение
с зоны стрима чекбоксы пропадают
Непонятно почему.
Что у вас в Контексте Данных, как вы его задаёте?
Сущность строки, как я понял, это objectDisplays.
Покажите реализацию этого типа.
0
0 / 1 / 0
Регистрация: 24.04.2020
Сообщений: 80
09.11.2022, 10:28  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Сущность строки, как я понял, это objectDisplays.
Покажите реализацию этого типа.
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
35
36
37
List<ObjectDisplay> objectDisplays = new List<ObjectDisplay>();
 
 
private class ObjectDisplay
        {
            public GXDLMSObject Obis { get; set; }
            public string Title { get; set; }
            public bool StatusCheck { get; set; }
            public int Series { get; set; }
            public ObservableCollection<int> SeriesList { get => seriesList; set => seriesList = value; }
            private ObservableCollection<int> seriesList = new();
            public ObjectDisplay(GXDLMSObject obis, string title, bool status, int series)
            {
                Obis = obis;
                Title = title;
                StatusCheck = status;
                Series = series;
            }
            public ObjectDisplay(GXDLMSObject obis, string title, bool status, ObservableCollection<int> series)
            {
                Obis = obis;
                Title = title;
                StatusCheck = status;
                seriesList = series;
            }
            public ObjectDisplay(GXDLMSObject obis, string title, bool status)
            {
                Obis = obis;
                Title = title;
                StatusCheck = status;
            }
            public ObjectDisplay(GXDLMSObject obis, string title)
            {
                Obis = obis;
                Title = title;
            }
        }
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16124 / 11248 / 2888
Регистрация: 21.04.2018
Сообщений: 33,082
Записей в блоге: 2
09.11.2022, 10:52
Цитата Сообщение от Aigulik Посмотреть сообщение
private class ObjectDisplay
Классы используемые в WPF представлении старайтесь всегда объявлять в пространстве имён и публичными.
Вообще, в Шарпе используются вложенные классы только для инкапсуляции.
А у вас противоположная задача.

В самом классе нужно сделать реализацию INPC и при изменении свойств уведомлять об этом.
Можете взять для этого базовый класс BaseInpc отсюда: Простые реализации для тем на форуме.
Там же есть пример его использования.

Цитата Сообщение от Aigulik Посмотреть сообщение
Handler="OnChecked"
Оба обработчика замените одним на кликер:
XML
27
28
29
    <Style TargetType="CheckBox">
        <EventSetter Event="Click" Handler="OnCheckBoxClick"/>
    </Style>
C#
12
13
14
15
    private void OnCheckBoxClick(object sender, RoutedEventArgs e)
    {
         countCheck = objectDisplays.Count(item => item.StatusCheck);
    }
Добавлено через 6 минут
Цитата Сообщение от Aigulik Посмотреть сообщение
DataGrid
Если у вас предусмотрено изменение списка objectDisplays после его создания, то это должен быть не лист, а ObservableCollection.

P.S. И что за такое название типа ObjectDisplay?
Название должно отражать Предметную Область. На этот счёт есть официальные Правила Именования.
Что за данные у вас в этой сущности? Какой-то счётчик, датчик? Так и назовите его соответственно.

Добавлено через 1 минуту
Aigulik, будет лучше, если вы в меню Git Студии создадите Репозиторий на GitHub, загрузите в него ваше Решение и предоставите ссылку на него.
0
0 / 1 / 0
Регистрация: 24.04.2020
Сообщений: 80
10.11.2022, 14:28  [ТС]
Добавлено через 30 секунд
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Оба обработчика замените одним на кликер:
C#
1
2
3
4
5
6
7
protected override void OnPropertyChanged(string StatusCheck, object oldValue, object newValue)
        {
            base.OnPropertyChanged(StatusCheck, oldValue, newValue);
 
            // Проверяется имя изменившегося свойства и производятся необходимые действия
            // here code
        }
А как тут фиксировать изменения, просто до этого не приходилось работать с данным интерфейсом.

Добавлено через 1 час 15 минут
Я вот такой обработчик написал на странице.
C#
1
2
3
4
5
private void OnCheckBoxClick(object sender, RoutedEventArgs e)
        {
            countCheck = objectDisplays.Count(item => item.StatusCheck);
            countBoolCheck.Content = countCheck.ToString();
        }
А в классе реализовал переопределенный метод интерфейса
C#
1
2
3
4
5
6
7
8
9
10
11
12
protected override void OnPropertyChanged(string propertyName, object oldValue, object newValue)
        {
            base.OnPropertyChanged(propertyName, oldValue, newValue);
 
            // Проверяется имя изменившегося свойства и производятся необходимые действия
            //if (StatusCheck == nameof(Status) || StatusCheck == nameof(Mod))
            //    ModNumber = Number % Mod;
            if (propertyName != StatusCheck.ToString())
            {
                StatusCheck = true;
            }
        }
Но в итоге он только как будто бы считает только количество, а если ставить галочки, т.к true, то TextBox не обновляется.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16124 / 11248 / 2888
Регистрация: 21.04.2018
Сообщений: 33,082
Записей в блоге: 2
10.11.2022, 15:17
Цитата Сообщение от Aigulik Посмотреть сообщение
// Проверяется имя изменившегося свойства и производятся необходимые действия
Это событие у вас будет происходить в ObjectDisplay, а считать количество нужно на уровне List<ObjectDisplay> objectDisplays.
То есть для подсчёта на уровне коллекции, нужна подписка на все события её элементов.
Это нужно делать либо "руками", либо использовать BindingList.

Цитата Сообщение от Aigulik Посмотреть сообщение
Но в итоге он только как будто бы считает только количество, а если ставить галочки, т.к true, то TextBox не обновляется.
Значит не вызывается метод OnCheckBoxClick. Что-то сделали не так.

Добавлено через 21 минуту
Aigulik, вот пример реализации с BindingList.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
using Simplified;
using System.Collections.Generic;
using System.Text;
using System.Threading.Tasks;
 
namespace Core2022.Aigulik.CountCheckBox
{
    public class Device : BaseInpc
    {
        private bool _isSelected;
        private string _title = string.Empty;
 
        public bool IsSelected { get => _isSelected; set => Set(ref _isSelected, value); }
 
        public string Title { get => _title; set => Set(ref _title, value ?? string.Empty); }
    }
}
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
35
using Simplified;
using System;
using System.ComponentModel;
using System.Linq;
 
namespace Core2022.Aigulik.CountCheckBox
{
    public class DevicesViewModel : BaseInpc
    {
        private int _countSelectedDevices;
 
        public BindingList<Device> Devices { get; } = new BindingList<Device>
        (
            "Классы используемые в WPF представлении старайтесь всегда объявлять в пространстве имён и публичными"
            .Split(' ', StringSplitOptions.RemoveEmptyEntries)
            .Select(text => new Device() { Title = text })
            .ToArray()
        );
 
        public int CountSelectedDevices { get => _countSelectedDevices; private set => Set(ref _countSelectedDevices, value); }
 
        public DevicesViewModel()
        {
            Devices.ListChanged += OnDevicesChanged;
        }
 
        private void OnDevicesChanged(object? sender, ListChangedEventArgs e)
        {
            if (e.PropertyDescriptor?.Name == nameof(Device.IsSelected))
            {
                CountSelectedDevices = Devices.Count(d => d.IsSelected);
            }
        }
    }
}
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<Window x:Class="Core2022.Aigulik.CountCheckBox.DevicesWindow"
        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:Core2022.Aigulik.CountCheckBox"
        mc:Ignorable="d"
        Title="DevicesWindow" Height="450" Width="800">
    <Window.DataContext>
        <local:DevicesViewModel/>
    </Window.DataContext>
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition/>
            <RowDefinition Height="Auto"/>
        </Grid.RowDefinitions>
        <DataGrid ItemsSource="{Binding Devices}"/>
        <TextBlock Grid.Row="1" Text="{Binding CountSelectedDevices}"/>
    </Grid>
</Window>
Класс BaseInpc отсюда: Простые реализации для тем на форуме.
0
0 / 1 / 0
Регистрация: 24.04.2020
Сообщений: 80
10.11.2022, 15:47  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
вот пример реализации с BindingList.
Спасибо, что помогаете и подсказываете

Добавлено через 13 минут
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Значит не вызывается метод OnCheckBoxClick. Что-то сделали не так.
Вот что я заметил. При первом клике на галочку, в визуале он ставится, при этом событие OnCheckBoxClick не срабатывает, но во 2-ю попытку он начинает срабатывать, и на true и false.

upd:
Все же не все так однозначно. Он не обязательно с 1 попытки не сработает. Если с 1-й попытки не сработает, то на 2-й работает. Но, если я сверну окно программы и обратно вернусь, то он опять 1 раз не сработает. Странная штука
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16124 / 11248 / 2888
Регистрация: 21.04.2018
Сообщений: 33,082
Записей в блоге: 2
10.11.2022, 15:52
Цитата Сообщение от Aigulik Посмотреть сообщение
Вот что я заметил....
Там "гонка" между обработкой клика для выделения строки и для изменения CheckBox.
0
0 / 1 / 0
Регистрация: 24.04.2020
Сообщений: 80
10.11.2022, 16:13  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Там "гонка" между обработкой клика для выделения строки и для изменения CheckBox.
Еще один вопрос не касающийся данной темы: А какие ресурсы стоит изучить для повышении знаний ассинхронного программирования. Данный раздел у меня мягко сказать хромает. Мои знания об ассинхронке на уровне Тасков только, и то практического применения им у меня не было.
0
 Аватар для Andrey-MSK
3336 / 2223 / 387
Регистрация: 14.08.2018
Сообщений: 7,490
Записей в блоге: 4
10.11.2022, 16:16
Цитата Сообщение от Aigulik Посмотреть сообщение
для повышении знаний ассинхронного программирования
Как вариант
Aсинхронное программирование
Асинхронное программирование с использованием ключевых слов async и await

Добавлено через 1 минуту
Ну и в поиске - c# async/await
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16124 / 11248 / 2888
Регистрация: 21.04.2018
Сообщений: 33,082
Записей в блоге: 2
10.11.2022, 16:34
Цитата Сообщение от Aigulik Посмотреть сообщение
какие ресурсы стоит изучить для повышении знаний ассинхронного программирования
Не могу сказать.
Источников очень много. Но я мало что из них читал и рекомендовать их не могу.
Сам в основном изучал по документации и примерам.
Очень помогло общение здесь на Форуме.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
10.11.2022, 16:34
Помогаю со студенческими работами здесь

Как вывести в таблицу определенное кол-во строк из БД для печати? Не пагинация!
Доброго времени суток. Вопрос в следующем. Из БД идет запрос на выборку данных. Два поля, картинка и описание. Таблица в динамике имеет...

Как в макросе определить кол-во строк и кол-во столбцов таблицы?
Подскажите, плз, как в макросе определить кол-во строк и кол-во столбцов таблицы.

Сделать таблицу n строк: адрес, кол-во проживающих, кол-во комнат и кол-во метров в каждой комнате
В задании нужно сделать таблицу n строк. Адрес, кол-во проживающих, кол-во комнат и кол-во метров в каждой комнате. public class second {...

Как найти кол-во определённых символов в ячейке?
Подскажите пожалуйста, как найти кол-во определённых символов в ячейке?Допустим, что есть ячейка a1, в которой написано &quot;Пример...

как в запросе подсчитать кол-во определенных значений
Используются 2 поля таблицы - title и state с названием и значением соответственно. Варианты значений поля state ограничены (от 1 до 4 ). ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru