Переопределение OnMouseDown для DataGridView отключает флажки даже при вызове метода родителя - PullRequest
1 голос
/ 13 мая 2009

Я работаю с WinNET-формами .NET 2008, я пытаюсь перетаскивать объекты из DataGridView в какой-либо другой элемент управления. Поэтому мне пришлось переопределить обработчик события OnMouseDown. Поскольку у меня есть флажки там, их состояние никогда не меняется. Вот мой переопределенный метод

public class SeriesGrid : DataGridView
{

    protected override void OnMouseDown(MouseEventArgs e)
    {
        base.OnMouseDown(e);
        DataGridViewSelectedRowCollection selectedRows = this.SelectedRows;
        if (selectedRows.Count == 0) return;

        List<AppDataSeries> toDrag = new List<AppDataSeries>();
        for (int i = 0; i < selectedRows.Count; i++)
        {
            toDrag.Add((AppDataSeries)selectedRows[i].DataBoundItem);
        }
        this.DoDragDrop(toDrag, DragDropEffects.Copy);

    }

}

DoDragDrop, кажется, вызывает проблему, потому что, если я уберу его, флажки будут работать нормально, однако я не получаю ничего, чтобы пропустить другой элемент управления

Любая помощь?

Ответы [ 2 ]

2 голосов
/ 13 мая 2009

ОК, это хакерство - но это работает. Он вставляет небольшую задержку в перетаскивание, позволяя проверке / снятию флажка работать нормально:

(отредактировано для включения cancelDrag, чтобы избежать некоторых глюков пользовательского интерфейса при щелчках)

volatile bool cancelDrag;
protected override void OnMouseUp(MouseEventArgs e)
{
    cancelDrag = true;
    base.OnMouseUp(e);
}
protected override void OnMouseDown(MouseEventArgs e)
{
    base.OnMouseDown(e);
    cancelDrag = false;
    ThreadPool.QueueUserWorkItem(delegate
    {
        Thread.Sleep(250);
        if (!cancelDrag)
        {
            BeginInvoke((MethodInvoker)delegate
            {
                if (!cancelDrag)
                {
                    // your code here...
                    var sel = this.SelectedRows;
                    if (sel.Count > 0)
                    {
                        this.DoDragDrop("test", DragDropEffects.All);
                    }
                }
            });
        }
    });
}
0 голосов
/ 13 мая 2009

Попробуйте позвонить base.OnMouseDown(e); в конце метода.

...