[英]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.