![]() |
Модераторы: gambit |
![]() ![]() ![]() |
|
allknower |
|
||||
![]() Новичок Профиль Группа: Участник Сообщений: 15 Регистрация: 21.12.2006 Где: Краснодар Репутация: нет Всего: нет |
На данном этапе реализовал копирование одной ячейки:
Теперь встала задача реализовать копирование любой выделенной области. То есть строк, столбцов, нескольких ячеяк нескольких строк: +------+------+------+------+------+ | | | | | | +------+------+------+------+------+ | | | S | S | | +------+------+------+------+------+ | | | S | S | | +------+------+------+------+------+ S - выделенные ячейки Я создал класс Range
Идея такова: оборачиваем коллекцию DataGridView.SelectedCell в этот класс и толкаем в буфер. При вставке - выталкиваем из буфера и втавляем в грид начиная с ячейки, над которой было вызвано меню. Все что не вошло усекаем. Проблема в том что DataGridView.SelectedCell - есть ничто иное как ArrayList в котором списком хранятся выделенные ячейки. Как мне получить количество колонок и столбцов?? Свойства DataGridView.SelectedRow.Count и DataGridView.SelectedColumn.Count при неполном выборе (как на картинке) хранят нули. Хотя реально выбрано две строки и два столбца. Хотелось бы увидеть какой то SelectedRange (на подобие Delphi'йского. У StringGrid'a кажется таковой был.) |
||||
|
|||||
Idsa |
|
||||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2086 Регистрация: 5.12.2006 Где: Томск Репутация: 15 Всего: 62 |
Ага, есть такое. В MSDN'е объяснено такое поведение:
Такое поведение вполне логично. Стоит представить, что ячейки выделены не так, как Вы описали, а, например, вот так: +------+------+------+------+------+ | | | | | | +------+------+------+------+------+ | | | S | S | | +------+------+------+------+------+ | | | S | S | | S +------+------+------+------+------+ Действительно, непонятно, чему должны быть равны SelectedRowCount и SelectedColumnCount. Так что пусть уж они будут равны нулю от греха подальше ![]() Это небольшой офтоп. А теперь к делу. Вообще, в MSDN'е в Best Practices по DataGridView есть интересная заметка по поводу использования SelectionMode.CellSelect
Мило, да? ![]() На фоне всего этого безобразия, думаю, придется Вам писать алгоритм на базе DataGridViewCell.ColumnIndex и DataGridViewCell.RowIndex. Мне на ум пришел примерно следующий алгоритм. 1. Находим минимальный ColumnIndex и минимальный RowIndex из SelectedCells. 2. Вычитаем для всех выделенных ячеек из их ColumnIndex минимальный ColumnIndex, а из их RowIndex минимальный RowIndex. Если рассматривать предыдущий пример, то мы получим ячейки, которые расположились бы в DataGridView следующим образом: +------+------+------+------+------+ | S | S | | | | +------+------+------+------+------+ | S | S | | S | | +------+------+-----+------+------+ | | | | | | | +------+------+------+------+------+ На самом деле мы работаем с массивом ячеек: эта таблица только для демонстрации. 3. При вставке располагаем наши ячейки в ячейке с номером колонки, равным: номер колонки, в которой было вызвано контекстное меню, + "нормированный" номер текущей вставляемой ячейки. Аналогично со строками. P. S. Не исключаю, что есть красивый способ реализовать подобный функционал... но поверхностный гуглинг не помог. |
||||||
|
|||||||
allknower |
|
||||
![]() Новичок Профиль Группа: Участник Сообщений: 15 Регистрация: 21.12.2006 Где: Краснодар Репутация: нет Всего: нет |
Idsa, обнаружился такой вот негатиффчик:
Пи выделении строк в ArrayList "DataGridView.SelectedCell" они попадают в совершенно немыслемом порядке. Выкладываю то что наваял, может кому пригодится. Конечно сыровато, но работает. Пинами не ногать!!! Класс Range
SimpleData здесь это просто пользовательский тип данных, не более того. На логику никак не влияет. Клик по пунктам Copy и Paste:
Этот код выдаст ошибку если попытаться скопировать и вставить строку, выбранную за заголовок (там где стрелочка)... Это нужно обробатывать отдельно. Это сообщение отредактировал(а) allknower - 23.6.2008, 14:18 |
||||
|
|||||
stashe |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 153 Регистрация: 5.1.2007 Где: Донецк Репутация: нет Всего: 1 |
А это не в тему? |
|||
|
||||
allknower |
|
||||||
![]() Новичок Профиль Группа: Участник Сообщений: 15 Регистрация: 21.12.2006 Где: Краснодар Репутация: нет Всего: нет |
Сколько я не колдовал с ячейками - вытащить их из буфера у меня так и не получилось. Может что не правильно делал? Какой format нужно указать в
C пользовательским форматом у меня не заработало. :( А самописный Range развязал руки, и теперь я копирую, дублирую (как в Excel) как хочу... Это сообщение отредактировал(а) allknower - 24.6.2008, 15:48 |
||||||
|
|||||||
![]() ![]() ![]() |
Прежде чем создать тему, посмотрите сюда: | |
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, stab, mr.DUDA, Exception. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Базы данных под .NET | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |