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

Выделение нескольких строк в DataGridView с клавишей shift

18.10.2017, 20:35. Показов 8925. Ответов 14

Студворк — интернет-сервис помощи студентам
Всем привет. Прошу помощи в разрешении небольшой проблемы. Имею табличные данные.

Выделение стоит на RowHeaderSelect.

Вот одиночной выделение При щелчке мыши на 1-ю ячейку "№" 2-й строки.

Вот групповое выделение с зажатой клавишей "shift" и щелчком мыши на 1-ю ячейку "№" 6-й строки. для выделения подряд нескольких строк со 2-й по 6-ю строку.

На деле результат выделения всех ячеек заданного диапазона, но не всех строк в этом диапазоне.

Вот моё на быструю руку решение, но, как по мне, так это недовелосипед с быдлокодерством. Я прав? Может есть более лёгкий вариант?

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
        private void dataGridView1_CellClick_1(object sender, DataGridViewCellEventArgs e)
        {
            // Выбрана 1-я ячейка.
            if (e.ColumnIndex == 0)
            {
                // Уже имеется выделенная строка.
                if (dataGridView1.SelectedRows.Count > 0)
                {
                    // Индекс первой выделенной строки в таблице.
                    int index_cur = dataGridView1.SelectedRows[0].Index;
 
                    // Индекс текущей строки с выделенной 1-й ячейкой. (Пока строка не выделена!)
                    int index_finish = dataGridView1.CurrentRow.Index;
 
                    // Выделение в убывающем порядке. По убыванию.
                    if (index_cur > index_finish)
                    {
                        for (; index_cur >= index_finish; index_cur--)
                        {
                            // В текущей строке выделение 1-й ячейки не выставлено. Выделение строки не требуется.
                            if (dataGridView1.Rows[index_cur].Cells[0].Selected == false) continue;
 
                            dataGridView1.Rows[index_cur].Selected = true;
                        }
                    }
                    // Выделение в нарастающем порядке. По возрастанию.
                    else if (index_cur < index_finish)
                    {
                        for (; index_cur <= index_finish; index_cur++)
                        {
                            // В текущей строке выделение 1-й ячейки не выставлено. Выделение строки не требуется.
                            if (dataGridView1.Rows[index_cur].Cells[0].Selected == false) continue;
 
                            dataGridView1.Rows[index_cur].Selected = true;
                        }
                    }
                }
                // Ни одной выделенной строки не найдено.
                else dataGridView1.CurrentRow.Selected = true;
            }
        }
Вот результат кода:

Вот подряд выделение через shift.
Вот выборочно выделение через ctrl.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
18.10.2017, 20:35
Ответы с готовыми решениями:

DataGridView — запретить выделение нескольких строк
Привет В DataGridView можно как-нибудь запретить одновременное выделение нескольких строк? Я хочу, чтобы пользователь мог выделить...

DBGrid и выделение правой клавишей мыши несколько строк
Добро времени суток! Это для выделения правой клавиши, но одного значения: procedure TGlb.DBGrid1MouseUp(Sender: TObject; Button:...

Сочетание с клавишей shift
Здравствуйте. Столкнулся с проблемой комбинаций с клавишей shift. Конкретно не работает сочетание левого шифта с буквами е, н. х. ъ. и....

14
8 / 8 / 1
Регистрация: 16.02.2011
Сообщений: 160
18.10.2017, 20:43  [ТС]
Пробовал использовать событие CellStateChanged, но что-то он у меня зависает... Минус моего кода уже очевиден, если мы из 10,000 запись выберем два крайних от начала и конца диапазона, то бедный алгоритм должен будет пройтись аж по 10-ти тысячам записей, даже если они как таковыми для выделения всех не являются.
0
Эксперт .NET
 Аватар для Даценд
5878 / 4755 / 2939
Регистрация: 20.04.2015
Сообщений: 8,361
18.10.2017, 20:49
sptes,
Выделение с Shift и Control реализовано на уровне ОС.
Никакого дополнительного кода не требуется, всё и так выделяется правильно.
Разберитесь, какие настройки вашего DGV привели к ситуации, показанной на 2-м рисунке.
0
8 / 8 / 1
Регистрация: 16.02.2011
Сообщений: 160
18.10.2017, 20:51  [ТС]
Вечер добрый. Я задаю правило выделения всей строки при выделении (фокуса) 1-й ячейки в строке.
0
Эксперт .NET
 Аватар для Даценд
5878 / 4755 / 2939
Регистрация: 20.04.2015
Сообщений: 8,361
18.10.2017, 21:00
sptes,
При выделении HeaderCell или именно ячейки 0-го столбца?
0
8 / 8 / 1
Регистрация: 16.02.2011
Сообщений: 160
18.10.2017, 21:02  [ТС]
именно ячейки 0-го столбца

C#
1
2
3
4
5
6
7
8
9
10
11
        private void dataGridView1_CellStateChanged(object sender, DataGridViewCellStateChangedEventArgs e)
        {
            if (e.Cell.ColumnIndex == 0 && e.StateChanged == DataGridViewElementStates.Selected)
            {
                dataGridView1.Rows[e.Cell.RowIndex].Selected = true;
                //for (int index = 1; index < dataGridView1.Rows[0].Cells.Count; index++)
                //{
                //    dataGridView1.Rows[e.Cell.RowIndex].Cells[index].Selected = true;
                //}
            }
        }
В данном случае код повисает, т.к. при функционале (Добавление, Редактирование и Удаление) строки, с помощью dataGridView1.ClearSelection() очищаются все выделенные элементы.

Участок с комментами выделяет всю строку визуально, однако в dataGridView1.SelectedRows коллекции он не наблюдается.
0
Эксперт .NET
 Аватар для Даценд
5878 / 4755 / 2939
Регистрация: 20.04.2015
Сообщений: 8,361
18.10.2017, 21:04
sptes,
А чем выделение по RowHeaderCell не устраивает?
0
8 / 8 / 1
Регистрация: 16.02.2011
Сообщений: 160
18.10.2017, 21:07  [ТС]
Даценд, что вы имеете ввиду? SelectionMode? Я понимаю, что нужно курить msdn, но не могли бы вы вкратце пояснить?


P.S. я там выше дописал к сообщению дополнение.
0
Эксперт .NET
 Аватар для Даценд
5878 / 4755 / 2939
Регистрация: 20.04.2015
Сообщений: 8,361
18.10.2017, 21:13
Я имею в виду, что строка DGV прекрасно выделяется щелчком по ячейке заголовка строки (HeaderCell). Shift + щелчок по HeaderCell выделяет несколько строк. Так зачем для выделения строки щелкать по ячейке первого столбца?
1
8 / 8 / 1
Регистрация: 16.02.2011
Сообщений: 160
18.10.2017, 21:18  [ТС]
Даценд, Так, я понял о чём вы. У меня данный элемент выключен для удобства отображение и эстетичности вида в силу ряда причин. Мне нужно функционал этого элемента перевести на первую ячейку первого столбца.
0
8 / 8 / 1
Регистрация: 16.02.2011
Сообщений: 160
18.10.2017, 21:19  [ТС]


Или, если будет возможным, на этот элемент RowHeader, занести цифровой индекс элементов, который можно будет смещать при изменении таблицы.
0
Эксперт .NET
 Аватар для Даценд
5878 / 4755 / 2939
Регистрация: 20.04.2015
Сообщений: 8,361
18.10.2017, 21:30
Лучший ответ Сообщение было отмечено sptes как решение

Решение

Цитата Сообщение от sptes Посмотреть сообщение
занести цифровой индекс элементов, который можно будет смещать при изменении таблицы
Как в Excel с номерами строк?
Можно при изменении количества строк таблицы запускать такой код:
C#
1
2
for (int i = 0; i < dataGridView1.Rows.Count; i++)
    dataGridView1.Rows[i].HeaderCell.Value = i.ToString();
Только ширину (RowHeadersWidth) увеличить придется.
1
8 / 8 / 1
Регистрация: 16.02.2011
Сообщений: 160
18.10.2017, 21:32  [ТС]
Даценд, dataGridView1.Rows[0].HeaderCell.Value

Всё, спасибо, благодаря Вам разобрался!

Добавлено через 56 секунд
Даценд, Да, спасибо! А как-либо можно убрать надоедливую стрелку в rowheader текущей строки? И шапку колонки для RowHeader наименовать в "№"?
0
Эксперт .NET
 Аватар для Даценд
5878 / 4755 / 2939
Регистрация: 20.04.2015
Сообщений: 8,361
18.10.2017, 21:45
Лучший ответ Сообщение было отмечено sptes как решение

Решение

Цитата Сообщение от sptes Посмотреть сообщение
убрать надоедливую стрелку в rowheader текущей строки
Свойство DataGridViewCellStyle: Padding Top=3 и Bottom=3.
Цитата Сообщение от sptes Посмотреть сообщение
шапку колонки для RowHeader наименовать в "№"
C#
1
dataGridView1.TopLeftHeaderCell.Value = "№";
1
8 / 8 / 1
Регистрация: 16.02.2011
Сообщений: 160
18.10.2017, 21:47  [ТС]
Спасибо большое, очень помогли!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
18.10.2017, 21:47
Помогаю со студенческими работами здесь

DataGridView выделение нескольких ячеек и нахождение их суммы!
Доброго времени суток! Подскажите пожалуйста как мне сделать так, чтобы при выделении нескольких строк в DataGridView1 и нажатии на button1...

Выделение строк в datagridview
Все привет! Необходимо найти некий текст в datagridview и скопировать все записи после него(вместе с искомым текстом) и вставить в...

Полное выделение строк в datagridview
нужно программно выделить строку в dgv , подробнее объясню на скриншотах : - вот так оно выделяет - а мне нужно что бы выделяло вот...

Выделение строк в двух datagridview
Есть 2 грида, как можно сделать, чтобы при выделении нескольких строк в 1 гриде например с 3 по 5 , во втором гриде тоже выделялись с 3 по...

Выделение строк DataGridView цветом по условию
Здравствуйте! У меня есть DataGridView, которому в DataSource кладу DataTable, взятый из БД. Подскажите, как мне выделить строки, значение...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
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 и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru