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

Удаление НЕвыделенных строк в datagridview

31.10.2016, 21:19. Показов 3980. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток всем! Понимаю что немного странная задача, но вот так получилось что пользователь у меня должен выбрать все строки которые ему нужны, соответственно те которые не выделены, нужно удалить. С выделенными строками все понятно:
C#
1
2
3
4
5
6
7
8
for (int i = 0; i <= dataGridView1.SelectedCells.Count; i++)
            {
                if (dataGridView1.SelectedCells.Count)
                {
                    int del = dataGridView1.SelectedCells[i].RowIndex;
                    dataGridView1.Rows.RemoveAt(del);
                }
            }
А вот как понять наоборот, как убить строки которые не выделил пользователь?
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
31.10.2016, 21:19
Ответы с готовыми решениями:

Удаление строк и столбцов из DataGridView
В DataGirdView создается квадратная матрица, в которую вводятся данные в виде 0 и 1. Необходимо удалить все столбцы, в которых находятся...

Удаление пустых строк из Datagridview
Добрый день подскажите пожалуйста у меня в dataGridView при загрузке загрузилось ооочень много пустых строк (15000) мне...

Удаление дублирующихся строк dataGridView
Я хочу или удалить, или скрыть повторяющиеся строки в dataGridView. Делаю это в цикле, но удаляет не все одинаковые строки..так как поиск...

15
 Аватар для ViterAlex
8952 / 4864 / 1886
Регистрация: 11.02.2013
Сообщений: 10,246
31.10.2016, 22:40
Цитата Сообщение от player6131 Посмотреть сообщение
с выделенными строками все понятно
код работать не будет
Цитата Сообщение от player6131 Посмотреть сообщение
как убить строки которые не выделил пользователь?
  1. Запомнить количество строк.
  2. Скопировать их в конец.
  3. Удалить количество строк, которое было до копирования
0
1 / 1 / 1
Регистрация: 01.04.2014
Сообщений: 33
31.10.2016, 23:04  [ТС]
Цитата Сообщение от ViterAlex Посмотреть сообщение
код работать не будет
Не то скопировал, вот нужный код:
C#
1
2
3
4
5
6
for (int i = 0; i <= dataGridView1.SelectedCells.Count; i++)
            {
 
                int delet = dataGridView1.SelectedCells[i].RowIndex;
                dataGridView1.Rows.RemoveAt(delet);
            }
Цитата Сообщение от ViterAlex Посмотреть сообщение
Запомнить количество строк.
Скопировать их в конец.
Удалить количество строк, которое было до копирования
Вот тут я не совсем понял. Помимо количества придется ведь еще запоминать и индекс, он ведь мог их не подряд выделить. Как мне выцепить индекс не выделенных строк тогда?
0
 Аватар для ViterAlex
8952 / 4864 / 1886
Регистрация: 11.02.2013
Сообщений: 10,246
31.10.2016, 23:10
Цитата Сообщение от player6131 Посмотреть сообщение
Помимо количества придется ведь еще запоминать и индекс
Нет. Все выделенные строки из коллекции SelectedCells ты копируешь в конец. Например, было 100 строк, пользователь в разных местах выделил 5. Копируешь их в конец. 100 первых удаляешь. Остаются те 5, которые были выделены.
0
1 / 1 / 1
Регистрация: 01.04.2014
Сообщений: 33
01.11.2016, 00:07  [ТС]
У меня Datagrid заполняется из таблица датасета (dataGridView1.DataSource = dSet.DataTable1. В таблице руками добавлены колонки, а вот все строки добавляются программно. Не могу понять как мне правильно скопировать строки в тот же DataTable и потом еще удалить все сверху. Пытаюсь пробежать циклом по всем выделенным строкам:
C#
1
foreach (DataGridViewRow row in dataGridView.SelectedRows)
А потом записать полученный вывод в dSet.DataTable1.Rows.Add, но ничего путнего не получается. Новые строки не появляются. Как будто грид не видит, что они выделены

Добавлено через 9 минут
Если честно не нашел в интернете нормального примера копирования строк в datagrid и datatable.
0
 Аватар для Serg34
100 / 100 / 33
Регистрация: 20.09.2014
Сообщений: 457
Записей в блоге: 3
03.11.2016, 05:16
player6131, а просто скрыть строки не подходит?
0
1 / 1 / 1
Регистрация: 01.04.2014
Сообщений: 33
03.11.2016, 20:43  [ТС]
Цитата Сообщение от Serg34 Посмотреть сообщение
а просто скрыть строки не подходит?
Не совсем они ведь останутся в DataSource. А мне надо передавать DataSource этот в ReportViewer. У меня вообще первоначальная задумка была сделать так чтобы пользователь мог выделяться строки которые ему надо передать в отчет, я бы просто отлавливал то что он выделил с помощью SelectedCells или SelectedRows, но вот не тут то было. Если я передаю в отчет так, то он пустой получается. Видимо или с датасурса так выдрать не получается или я так и не смог понять почему SelectedRows не сработало у меня. Вот следующей задумкой было просто удалять строки перед передачей в отчет и все. Но тоже не пошло. Видимо буду говорить пользователю чтобы удалял строки которые ему не нужны, а остальное пусть передается в отчет или вообще откажусь от этой идеи.
0
 Аватар для Serg34
100 / 100 / 33
Регистрация: 20.09.2014
Сообщений: 457
Записей в блоге: 3
03.11.2016, 23:25
player6131, Так тебе с источником нужно работать, в твоем случае создавать неполную копию источника. А от DataGridView нужно брать только индексы выбранных строк.
Я здесь уже писал
0
1 / 1 / 1
Регистрация: 01.04.2014
Сообщений: 33
13.11.2016, 22:28  [ТС]
Я понимаю что надо работать с источником, но вот как я не могу понять. В интернете тоже ничего путнего найти не мог. То есть я выделаю то строки в dgv, при этом как я понимаю копировать мне надо из моей таблицы в другую таблицу которая в свою очередь будет привязана к reportviewer. Как мне сказать таблице, что копировать из нее нужно то, что выделено в dgv?

Добавлено через 41 минуту
UPD.
Вроде немного разобрался. Работает вот такой код:
C#
1
2
3
4
5
6
7
8
9
10
var dt = ((DataTable)dataGridView1.DataSource).Clone();
 
            foreach (DataGridViewRow row in dataGridView1.SelectedRows)
            {
                dt.ImportRow(((DataTable)dataGridView1.DataSource).Rows[row.Index]);
            }
 
            dt.AcceptChanges();
 
            dataGridView1.DataSource = dt;
Но, он работает если я выделяю строки нажатем на RowHeaderVisible, то есть на название строк, а если юзер выделяет сам пытается выделить всю строку путем проведения мышкой по ячейкам?

Добавлено через 1 час 18 минут
C#
1
dataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
Добавление этого свойства решает проблему. Но есть другая. При выделении нескольких строк сверху вниз происходит инверсия строк и они добавляется снизу вверх.
0
 Аватар для Serg34
100 / 100 / 33
Регистрация: 20.09.2014
Сообщений: 457
Записей в блоге: 3
14.11.2016, 00:17
Лучший ответ Сообщение было отмечено player6131 как решение

Решение

Цитата Сообщение от player6131 Посмотреть сообщение
происходит инверсия строк
C#
1
2
3
4
5
foreach (DataGridViewRow row in dataGridView1.Rows)
            {
                if (dataGridView1.SelectedRows.Contains(row)
                   dt.ImportRow(((DataTable)dataGridView1.DataSource).Rows[row.Index]);
            }
1
1 / 1 / 1
Регистрация: 01.04.2014
Сообщений: 33
14.11.2016, 12:59  [ТС]
Отлично, то что нужно! Большое спасибо!
0
0 / 0 / 0
Регистрация: 04.08.2015
Сообщений: 11
15.11.2016, 04:18
а разьве не проще просто коллекции строк datagrid(с ним не работал, посему не очень уверен что проканает) присвоить коллекцию селектированых строк?
0
 Аватар для Serg34
100 / 100 / 33
Регистрация: 20.09.2014
Сообщений: 457
Записей в блоге: 3
15.11.2016, 10:47
Xaker_Two, Опять же нужно менять источник. DataGridViewRow - это только отображение в реальном мире нашего объекта.
Пример из жизни: потекла крыша.
Решение №1: чинить крышу.
Решение №2 (более простое): закрасить видимые потеки.
Вывод очевиден.
Почитайте Архитектура ПО в WinForms (FAQ & HowTo)
0
0 / 0 / 0
Регистрация: 04.08.2015
Сообщений: 11
16.11.2016, 11:15
Тут скорее закрасить на фото или заделать в реале уместнее.
окей я не спорю что красить фиговей, однако если я правильно понял есть база, есть её вывод, их надо связывать, если так кто мешает заделать крышу по её фото. Т.е. как то так(к тому же я бы изменения в dt писал бы только по нажатию например Save)
C#
1
dt.ImportRows(((DataTable)dataGridView1.SelectedRows)); //псевдокод!
Почему я избегаю index - делаем пользовательскую сортировку в DataGrid...
Зависит на самом деле от внутренностей, однако сортировка источника всегда накладнее на одну функцию.
Статья хорошая, читал в свое время
0
 Аватар для Serg34
100 / 100 / 33
Регистрация: 20.09.2014
Сообщений: 457
Записей в блоге: 3
16.11.2016, 13:40
Цитата Сообщение от Xaker_Two Посмотреть сообщение
заделать крышу по её фото
Абсолютно с Вами согласен: пользователь показывает на фото (вид) места, требующие вмешательства и в этих местах мы изменяем крышу (модель).
Цитата Сообщение от Xaker_Two Посмотреть сообщение
изменения в dt писал бы
Цитата Сообщение от Xaker_Two Посмотреть сообщение
Почему я избегаю index
Цитата Сообщение от Xaker_Two Посмотреть сообщение
делаем пользовательскую сортировку в DataGrid
По моему Вы FAQ не до конца поняли, иначе этих проблем бы не было
Здесь лучше по другому
Фильтрация - это не изменение базы данных. Это, по-хорошему, создание копии. Как
C#
1
2
private Persons persons;
private PersonsView personsView;
в примере 1 из Архитектуры ПО в WinForms (FAQ & HowTo)
Сам применяю такой подход - не запутаешься что у тебя в базе данных и что у тебя на экране. Все как-то более читабельно и в голове меньше ненужной информации типа: отсортирована сейчас у меня DataGridView или отфильтрована.

Цитата Сообщение от Xaker_Two Посмотреть сообщение
сортировка источника всегда накладнее на одну функцию.
В этом случае это не неопраданная сложность, а скорее борьба со сложностью, так как вышеуказанные вопросы пропадают сами собой. Попробуйте, рекомендую
0
1 / 1 / 1
Регистрация: 01.04.2014
Сообщений: 33
16.11.2016, 22:34  [ТС]
Чтобы не создавать другую тему, вижу что тут люди знающие, не подскажете как можно сделать масштабирование данных грида? В интернете ничего путнего так и не нашел. То есть я выставляю якорь гриду относительно формы со всех 4 сторон и сам то грил увеличивается относительно формы (серая область), а вот данные остаются на месте в том же масштабе. Без просчитывания можно обойтись?

Добавлено через 6 часов 11 минут
UPD:
решил проблемку сам есть событие изменения размеров формы:
C#
1
2
3
4
5
6
7
private void frmMain_ResizeEnd(Object sender, EventArgs e)
        {
            foreach (DataGridViewRow row in dataGridView1.Rows)
            {
                row.Height = this.Size.Height / 19;
            }
        }
Тут прохожусь по всем строкам и делю текущий размер формы на их количество (на самом деле строк у меня 15, но делю на 19 ибо еще есть другие контролы на форме).
Ну и затем вызываю
C#
1
this.Resize += frmMain_ResizeEnd;
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
16.11.2016, 22:34
Помогаю со студенческими работами здесь

Удаление строк DataGridView по индексам
Собственно, выделенные строки удаляю так: if (dataBase.CurrentRow != null) { DialogResult result; ...

Удаление повторяющихся строк в DataGridView
Ребят написал такой цикл для удаления повторяющихся строк ж for (int intI = 0; intI &lt; dataGridView3.Rows.Count; intI++) { for...

Удаление пустых строк / DataGridView
Есть массив, 15х15, исходя из которого создаётся в дальнейшем матрица с аналогичным размером. После создания матрицы я нахожу наибольший...

Удаление строк в DataGridView по заданному условию
У меня есть dataGridView с 2 столбцами и 10 строками. Как удалить все строки, у которых во втором столбце значение = нулю?

DataGridview удаление строк с обновлением данных в DataTable
уважаемые форумчане, у меня такой вопрос.Есть DataTable, без бд, и привязанный к нему Datagridview. При выделении какой либо строчки в...


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru