3

我有以下代码,我试图在其中实现拖放功能:

public Location_Alert()
    {
        InitializeComponent();
        #region Form Initialization
        Recur_Txt.Text = "1";
        End_Date.Value = Start_Date.Value.Add(new TimeSpan(1,0,0,0));
        Recur_Time_Txt.Text = DateTime.Now.Add(new TimeSpan(0,15,0)).ToString("HH:mm");
        Location_Alert_Timer.Tick += new EventHandler(Location_Alert_Timer_Tick);//allow for timed recurrences in code
        this.DragEnter += new DragEventHandler(Location_Alert_DragEnter);//set up monitoring for a Drag event, changing the cursor as users drags file(s) onto the form.
        this.DragDrop +=new DragEventHandler(Location_Alert_DragDrop);//set up monitoring for a Drop event, allowing user to drag file onto the form
        #endregion
    }

    private void Location_Alert_DragDrop(object sender, DragEventArgs e)
    {
        string[] files = (string[])e.Data.GetData(DataFormats.FileDrop);
        if (files.Length == 1)
        {
            int i = 0;
            int ii = -1;
            foreach(string file in files)
            {
                if (file.Contains("enot"))
                {
                    if (ii == -1)
                    {
                        ii = i;
                    }
                }
                i++;
            }
            ImportFile(files[ii]);
        }
        else
        {
            MessageBox.Show("This application only supports a single drag and drop file, only the first *.enot file will be imported.");
            int i = 0;
            int ii = -1;
            foreach (string file in files)
            {
                if (file.Contains("enot"))
                {
                    if (ii == -1)
                    {
                        ii = i;
                    }
                }
                i++;
            }
            ImportFile(files[ii]);
        }
    }

    private void Location_Alert_DragEnter(object sender, DragEventArgs e)
    {
        if (e.Data.GetDataPresent(DataFormats.FileDrop))
        {
            int i = 0;
            int ii = -1;
            string[] files = (string[])e.Data.GetData(DataFormats.FileDrop);
            foreach (string file in files)
            {
                if (file.Contains("enot"))
                {
                    if (ii == -1)
                    {
                        ii = i;
                    }
                }
                i++;
            }
            if (ii != -1)
            {
                e.Effect = DragDropEffects.Copy;
            }
            else
            {
                e.Effect = DragDropEffects.None;
            }
        }
    }

并且 dragDrop 和 DragEnter 事件总是触发两次。我的滴答事件没有,我不确定这背后的原因。除非用户遇到异常,否则额外的火灾不会导致问题。这将处理两次异常,在这种情况下,这意味着将 2 个消息框返回给用户。

4

2 回答 2

4

@LarsTech 有答案:事件构造函数在我的设计器视图和表单构造函数中声明。

于 2014-11-21T15:12:18.603 回答
1

即使dragEnter 被调用了两次,dragDrop 也总是被调用一次,如果你把e.Effect = DragDropEffects.Copy 放在dragEnter 中。

private void Location_Alert_DragDrop(object sender, DragEventArgs e)
{
   ToDo();
}
private void Location_Alert_DragEnter(object sender, DragEventArgs e)
{
   e.Effect = DragDropEffects.Copy;
} 
于 2017-09-02T13:01:17.320 回答