簡體   English   中英

TreeView會觸發DragEnter,DragOver和DragLeave事件,但不會觸發DragDrop

[英]TreeView fires DragEnter, DragOver and DragLeave events, but won't fire DragDrop

冰雹堆棧!

我很難弄清楚為什么我的樹視圖(或任何其他組件,甚至表單本身)不會觸發事件DragDrop。

我已經按照以下方式結算了我的表格:
內部帶有面板表單
面板具有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上釋放鼠標按鈕時,將打印此行。

我做錯了什么嗎?

這就是我用來拖放到樹形視圖中用於文件的內容:

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);
}

您需要將DragOver e.Effect設置為None以告訴系統您願意e.Effect

您需要確保所拖動的項目中確實有一些數據。 使用以下命令獲取當前內容的字符串數組

e.Data.GetFormats()

使用字符串數組'fmt'的每個元素作為GetData的參數

e.Data.GetData(fmt)

如果它們全為空,則不會觸發DragDrop事件,也不會設置e.Effect來改變它。 如果確定這是原因,則可以更具體地尋找根本原因。 (就我而言,是Internet Explorer)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM