Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.05.2017, 00:54   #1
sorockinalex
Пользователь
 
Регистрация: 10.10.2009
Сообщений: 22
По умолчанию Datagridview DragDrop не работает MouseUp

Доброго времени суток! Столкнулся с проблемой. В гриде сделал DragDrop строк в TreeView, всё работает... Но перестало выскакивать контекстное меню. Долго разбирался, и нашёл где-то такое сообщение в одном из форумов интернета:
Цитата:
DoDragDrop() съедает событие WM_LBUTTONUP/WM_RBUTTONUP/...., тем самым нарушая естественную их хронологию

А лечится все просто:
1 вариант) нужно импортировать SendMessage/PostMessage ф-цию и послать WM_XMOUSEUP гриду из твоего обработцика MouseDown
2 вариант) наследоваться от грида, переопределить ф-цию WndProc, и в ней по приходу WM_XMOUSEDOWN проверять был ли осуществлен клик по одной из выбранных строк, и если да { делать DragDrop и не вызывать базовую WndProc}, иначе {вызывать базовую реализацию}.

Кстати в первом варианте тоже хорошо бы проверить, попадает ли курсор в выбранные строки. Это даст возможность пользователю при уже имеющемся выделении, создать новое, выделив мышкой несколько строк сразу. В твоем варианте такое врядли удастся, в любом случае начнется Drag&Drop. Первый способ проще, но по завершении DragDrop, грид будет всегда сбрасывать выделение, делая выбранным строку/ячейку на которой кликнули мышью, на мой взгляд это не правильно.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Нужно, чтобы при простом нажатии правой кнопкой мыши в гриде всплывало контекстное меню, и также правой кнопкой мыши работал DragDrop...

В вышеприведённой цитате ничего не понял, что именно сделать? Ни бум-бум в таких тонкостях. Если можно, просто код дайте...

Код:
        //ПЕРЕМЕЩЕНИЕ СТРОК (DRAGDROP из DATAGRID в TREEVIEW) а также активация строки при опускании правой кнопки мыши
        private void dataGridView1_MouseDown(object sender, MouseEventArgs e)
        {
            try
            {
                //выделяем строку при опускании правой кнопки мыши на ней, и если строка не выделена - очищаем всё выделение в гриде и выделяем её.
                //Если уже выделена - ничего не делаем.
                DataGridView.HitTestInfo Hti;
                if (e.Button == MouseButtons.Right)
                {
                    Hti = dataGridView1.HitTest(e.X, e.Y);
                    if (Hti.Type == DataGridViewHitTestType.Cell)
                    {
                        if (!((DataGridViewRow)(dataGridView1.Rows[Hti.RowIndex])).Selected)
                        {
                            dataGridView1.ClearSelection();
                            ((DataGridViewRow)dataGridView1.Rows[Hti.RowIndex]).Selected = true;
                        }
                    }

                    //перемещаем строки в дерево правой кнопкой мыши
                    if (dataGridView1.SelectedRows.Count < 1) return;
                    // массив с ID строк, которые перемещаем
                    string[] arr = new string[dataGridView1.SelectedRows.Count];
                    for (int i = 0; i < dataGridView1.SelectedRows.Count; i++)
                        arr[i] = dataGridView1.SelectedRows[i].Cells["CODE"].Value.ToString();

                    dataGridView1.DoDragDrop(arr, DragDropEffects.All);
                }
            }
            catch (Exception ex)
            {
                LogException(ex, "dataGridView1_MouseDown");
            }
        }
sorockinalex вне форума Ответить с цитированием
Старый 14.05.2017, 01:41   #2
sorockinalex
Пользователь
 
Регистрация: 10.10.2009
Сообщений: 22
По умолчанию

пока что сделал вот так: драгдроп только с кнопкой Ctrl:
Код:
        //ПЕРЕМЕЩЕНИЕ СТРОК (DRAGDROP из DATAGRID в TREEVIEW) а также активация строки при опускании правой кнопки мыши
        private void dataGridView1_MouseDown(object sender, MouseEventArgs e)
        {
            try
            {
                //выделяем строку при опускании правой кнопки мыши на ней, и если строка не выделена - очищаем всё выделение в гриде и выделяем её.
                //Если уже выделена - ничего не делаем.
                DataGridView.HitTestInfo Hti;
                if (e.Button == MouseButtons.Right)
                {
                    Hti = dataGridView1.HitTest(e.X, e.Y);
                    if (Hti.Type == DataGridViewHitTestType.Cell)
                    {
                        if (!((DataGridViewRow)(dataGridView1.Rows[Hti.RowIndex])).Selected)
                        {
                            dataGridView1.ClearSelection();
                            ((DataGridViewRow)dataGridView1.Rows[Hti.RowIndex]).Selected = true;
                        }
                    }
                }
                if (e.Button == MouseButtons.Left && (Control.ModifierKeys & Keys.Control) == Keys.Control)
                {
                    //перемещаем строки в дерево правой кнопкой мыши
                    if (dataGridView1.SelectedRows.Count < 1) return;
                    // массив с ID строк, которые перемещаем
                    string[] arr = new string[dataGridView1.SelectedRows.Count];
                    for (int i = 0; i < dataGridView1.SelectedRows.Count; i++)
                        arr[i] = dataGridView1.SelectedRows[i].Cells["CODE"].Value.ToString();
                    dataGridView1.DoDragDrop(arr, DragDropEffects.All);
                }

            }
            catch (Exception ex)
            {
                LogException(ex, "dataGridView1_MouseDown");
            }
        }
sorockinalex вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ListView как обработать MouseUp capone641693 C# (си шарп) 5 18.09.2016 16:13
dragdrop из listview niockasd Компоненты Delphi 3 02.12.2015 15:28
Dragdrop в Virtualtreeview NaumOff Компоненты Delphi 0 14.11.2012 00:01
ReleaseCapture в downMouse + mouseUp NaumOff Общие вопросы Delphi 0 22.09.2012 16:50
ListView DragDrop Vipa Компоненты Delphi 10 07.08.2009 11:21