TreeView запускает события DragEnter, DragOver и DragLeave, но не запускает DragDrop - PullRequest
1 голос
/ 22 февраля 2011

Славься!

Мне трудно понять, почему мое древовидное представление (или любой другой компонент, даже сама форма) не вызовет событие DragDrop.

Я установил свою форму следующим образом:
A Форма с панелью внутри.
Панель имеет TreeView и этот TreeView( MyTree ) имеет следующий код:

MyTree.AllowDrop = true;
MyTree.DragDrop += new System.Windows.Forms.DragEventHandler(onDragDrop);
MyTree.DragEnter += new System.Windows.Forms.DragEventHandler(onDragEnter);
MyTree.DragLeave += new System.EventHandler(onDragLeave);
MyTree.DragOver += new System.Windows.Forms.DragEventHandler(onDragOver);

Обработчики выглядят так:

private void onDragEnter(object sender, DragEventArgs e)
{
    Console.WriteLine(" === DragEnter === ");
}

private void onDragLeave(object sender, EventArgs e)
{
    Console.WriteLine(" === DragLeave === ");
}

private void onDragOver(object sender, DragEventArgs e)
{
    Console.WriteLine(" === DragOver === ");
}

private void onDragDrop(object sender, DragEventArgs e)
{
    Console.WriteLine(" === DragDrop === ");
}

Когда я тестирую свое приложение, перетаскивая файл * .txt(или что-нибудь) вывод выглядит примерно так:

=== DragEnter ===
=== DragOver ===
=== DragOver ===
...
=== DragOver ===
=== DragLeave ===

Последняя строка (=== DragLeave ===) не должна была быть событием отпуска.
Фактически, эта строкапечатается, когда я отпускаю кнопку мыши на TreeView.

Я что-то делаю ужасно неправильно?

Ответы [ 3 ]

2 голосов
/ 22 февраля 2011

это то, что я использую для перетаскивания в древовидную структуру для файлов:

public class DragDropManager
{
    private UserControl _parent;

    private AddFilesEventHandler OnAddFiles;   

    public DragDropManager()
    {
    }

    public UserControl Parent
    {
        set
        {
            _parent = value;    

            if ( ! ( _parent is IDropFileTarget ) )
            {
                throw new Exception("DragDropManager: Parent usercontrol does not implement IDropFileTarget interface");
            }

            OnAddFiles = new AddFilesEventHandler(((IDropFileTarget)_parent).AddFiles);
            _parent.AllowDrop = true;
            _parent.DragEnter += new System.Windows.Forms.DragEventHandler(this.OnDragEnter);
            _parent.DragDrop += new System.Windows.Forms.DragEventHandler(this.OnDragDrop);
        }
    }

    /// <summary>
    /// Handle parent form DragEnter event
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void OnDragEnter(object sender, System.Windows.Forms.DragEventArgs e)
    {
        string[] formats = e.Data.GetFormats(true);

        //e.Effect = DragDropEffects.All;

        for (int formatIndex = 0; formatIndex < formats.Length; formatIndex++)
        {
            switch (formats[formatIndex])
            {
                case Consts.DragDropFormats.FileDrop:
                    e.Effect = DragDropEffects.Copy;
                    break;
                case Consts.DragDropFormats.Text:
                    e.Effect = DragDropEffects.Move;
                    break;
                case Consts.DragDropFormats.UniformResourceLocator:
                    e.Effect = DragDropEffects.Link;
                    break;
            }
        }
    }

    /// <summary>
    /// Handle parent form DragDrop event
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void OnDragDrop(object sender, System.Windows.Forms.DragEventArgs e)
    {
        try
        {
            string[] formats = e.Data.GetFormats(true);
            string[] values = new string[1];
            string url = string.Empty;

            for (int formatIndex = 0; formatIndex < formats.Length; formatIndex++)
            {
                switch (formats[formatIndex])
                {
                    case Consts.DragDropFormats.FileDrop:
                        Array itemList = (Array)e.Data.GetData(Consts.DragDropFormats.FileDrop);

                        if (itemList != null)
                        {
                            _parent.BeginInvoke(OnAddFiles, new Object[] { itemList });
                            _parent.Focus();
                        }
                        break;
                    case Consts.DragDropFormats.Text:
                    case Consts.DragDropFormats.UniformResourceLocator:
                        values[0] = e.Data.GetData(Consts.DragDropFormats.Text).ToString();
                        _parent.BeginInvoke(OnAddFiles, new Object[] { values });
                        _parent.Focus();
                        break;
                    default:
                        break;
                }
            }
        }
        catch (Exception ex)
        {
            Trace.WriteLine("Error in DragDropManager.OnDragDrop function: " + ex.Message);
        }
    }

}

Вы можете использовать его следующим образом:

DragDropManager dragDropManager = new DragDropManager();
dragDropManager.Parent = this;

и необходимо реализовать это в UserControl

public interface IDropFileTarget
{
    void AddFiles(Array Files);
}
1 голос
/ 22 февраля 2011

Вам нужно установить e.Effect в DragOver на что-то отличное от None, чтобы сообщить системе, что вы хотите быть сброшенным.

0 голосов
/ 21 марта 2019

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

e.Data.GetFormats()

Используйте каждый элемент массива строк 'fmt' в качестве аргумента для GetData

e.Data.GetData(fmt)

Если все они равны NULL, то событие DragDrop не будет запущено, и никакое количество настроек e.Effect не изменит этого. Если вы определите, что это является причиной, вы можете более конкретно искать основную причину. (в моем случае Internet Explorer)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...