Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
1 / 1 / 0
Регистрация: 19.10.2022
Сообщений: 5

Получить строку из DataTable

09.11.2022, 14:57. Показов 1598. Ответов 6

Студворк — интернет-сервис помощи студентам
Добрый день!
На входе: DataGridView dgv с биндом к DataTable dt:
C#
1
2
3
4
5
dgv.AutoGenerateColumns = false;
dgv.Columns["col1"].DataPropertyName = "colDt1";
dgv.Columns["col2"].DataPropertyName = "colDt2";
dgv.Columns["col3"].DataPropertyName = "colDt3";
dgv.DataSource = dt;
Возникает проблема с правильным получением строк (индексов строк) после изменения DataTable. Допустим изначально DataTable имела 2 строки, при инициализации бинда строки отображаются в DataGridView. Далее в DataTable добавляется строка, она также отображается в DataGridview, затем выделяется первая или вторая строка в DataGridview, берется индекс выделенной строки, строка удаляется из DataGridView, вместе с тем в DataTable удаленная с грида строка помечается как "Deleted". Получается, что в гриде 2 строки осталось, а в DataTable 3. Как в такой ситуации далее правильно получить индекс выделенной строки в гриде в DataTable?? Ведь если просто получить индекс выделенной строки в гриде, то он не будет соответствовать индексу этой строки в DataTable.
Спасибо!
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
09.11.2022, 14:57
Ответы с готовыми решениями:

DataTable - сделать, чтобы указатель указывал на нужную строку, а не на первую
Есть DataTable, DataGridView Каждый раз когда обновляю DataTable, указатель указывает на первую строку в таблице, что вполне нормально. ...

Как в Datatable найти строку
Создал таблицу dT_NTV = new DataTable("ULD"); DataColumn MEM_ID = new DataColumn("MEM_ID"); ...

Как окончательно стереть строку из DataTable?
В DataTable есть несколько строк. Я стираю командой Delete одну Row (или даже несколько). Но они не стираются физически, а только...

6
2282 / 1598 / 400
Регистрация: 26.06.2017
Сообщений: 4,732
Записей в блоге: 1
09.11.2022, 15:35
А ещё есть сортировка и фильтрация, они чего творят у индексами просто жуть
Почитайте тут.
1
 Аватар для Andrey-MSK
3339 / 2226 / 387
Регистрация: 14.08.2018
Сообщений: 7,517
Записей в блоге: 4
09.11.2022, 16:06
Ti Is, Потому что надо не использовать DataTable, а использовать нормальные коллекции (для форм BindingList<T>) и к ним привязывать DataGridView. И тогда вопрос вообще не возникнет... Потому что просто можно сделать вот так в коде
C#
1
MyCollection.Remove(SelectedItem);
и всё, элемент из коллекции удалится и в DataGridView тоже пропадёт. И с редактированием тоже самое и с добавлением.
1
2282 / 1598 / 400
Регистрация: 26.06.2017
Сообщений: 4,732
Записей в блоге: 1
10.11.2022, 08:28
Andrey-MSK, чем таблица хуже коллекции?
0
 Аватар для Andrey-MSK
3339 / 2226 / 387
Регистрация: 14.08.2018
Сообщений: 7,517
Записей в блоге: 4
10.11.2022, 08:34
Цитата Сообщение от Uswer Посмотреть сообщение
чем таблица хуже коллекции?
Работа с коллекцией проще и быстрее. И при использовании BindingList<T> элементы UI, которые привязаны к ней, при её изменении автоматически обновятся сами.
0
1 / 1 / 0
Регистрация: 19.10.2022
Сообщений: 5
10.11.2022, 09:05  [ТС]
Andrey-MSK,
у меня была задача хранить состояние каждого элемента в коллекции при изменении (добавлении, удалении) любого из них через грид, чтобы потом зафиксировать каждое такое изменение в БД. Насколько я понимаю, чтобы данный функционал реализовать через BindingList<T>, необходимо как минимум: реализовать интерфейс INotifyPropertyChanged в классе объекта <T>, добавить поле состояния, написать код обработчика AnyBindList_ListChanged и для каждого e.ListChangedType изменять поле состояния объекта. В DataTable через механизм состояния строки Rows[i].RowState получаю описанный функционал из "коробки" 1 строкой, правда с особенностями работы с DataTable.

Uswer, к счастью таких задач пока не ставится) Спасибо, в предложенной теме нашел решение своей проблемы:

C#
1
int indexInDt = AnyDataTable.Rows.IndexOf(((DataRowView)dgv.CurrentRow.DataBoundItem).Row)
0
 Аватар для Andrey-MSK
3339 / 2226 / 387
Регистрация: 14.08.2018
Сообщений: 7,517
Записей в блоге: 4
10.11.2022, 10:22
Ti Is, Если весь этот функционал сделать один раз, то потом будет гораздо проще работать с данными.
Цитата Сообщение от Ti Is Посмотреть сообщение
реализовать интерфейс INotifyPropertyChanged в классе объекта <T>
Модель не должна иметь эту реализацию. Достаточно BindingList<T> и при изменении объекта коллекции просто его перезаписывать
C#
1
2
3
4
int index = MyCollection.IndexOf(SelectedItem);
 
MyCollection[index] = new T
{ ... }
А при Remove() и Add() коллекция сама обновит UI.

Добавлено через 7 минут
Ti Is, Вот пример редактирования записи, правда для WPF, но основные моменты я выделил комментариями
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
42
43
44
45
46
47
48
49
private async Task EditHousingAsync()
{
    // Получаем индекс редактируемого элемента
    int index = HousingList.IndexOf(SelectedHousing);
    var vm = _viewModelFactory.CreateViewModel<IHousingEditDialogVM>();
 
    vm.Housing = new Housing
    {
        EObjectID = SelectedHousing.EObjectID,
        HousingID = SelectedHousing.HousingID,
        City = SelectedHousing.City,
        Address = SelectedHousing.Address,
        PlacesToStay = SelectedHousing.PlacesToStay
    };
 
    _windowService.ShowDialog(vm);
 
    if (vm.DialogResult == true)
    {
        // Создаём новый объект нашего типа
        // с новыми данными
        Housing housing = new Housing
        {
            HousingID = vm.Housing.HousingID,
            EObjectID = vm.Housing.EObjectID,
            City = vm.Housing.City,
            Address = vm.Housing.Address,
            PlacesToStay = vm.Housing.PlacesToStay
        };
 
        try
        {
            // Записываем его в БД
            await _mainDA.AccommodationDA.UpdateHousingAsync(housing);
 
            lock (_housingListLock)
            {
                // Записываем его в коллекцию
                HousingList[index] = housing;
            }
 
            SelectedHousing = HousingList.FirstOrDefault(h => h.HousingID == housing.HousingID);
        }
        catch (Exception ex)
        {
            _windowService.ShowErrorMessage(ex.ToString(), "Ошибка");
        }
    }
}
Добавлено через 53 минуты
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
Модель не должна иметь эту реализацию.
Тут я имел ввиду DTO
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
10.11.2022, 10:22
Помогаю со студенческими работами здесь

Как добавить в Datatable строку,инструментами VisualStudio
Как в коде это прописать,информации много,а как в конструкторе сделать я не нашёл.Там только колонку можно добавить.

Получить индекс выделенной строки в DataTable
Добрый день! Не пойму как получить индекс строки при выделении мышкой в DataTable. Может кто объяснить как сделать это?

Как получить ссылку на ячейку DataTable?
КАК получить ссылку на ячейку DataTable???

Получить значение конкретной ячейки DataTable
Привет Мне нужно получить значение, которое хранится в ячейке. Допустим тип колонки — int Я обращаюсь так: int value =...

Получить выборочные значения из ячеек DataTable
Пытаюсь получить выборочные значения из ячеек DataTable. DataTable заполняется данными из SQL запроса и почему то ничего не получается ...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru