3

I have the following code in which I am attempting to implement a drag and drop functionality:

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

and the dragDrop and DragEnter events always fire twice. My tick events do not, I am unsure as to the reason behind this. The extra fires are not causing an issue except if the user hits an exception. this will handle the exception twice, which in this case means 2 messageboxes back to the user.

Jacrys
  • 692
  • 1
  • 7
  • 20
  • 7
    Any chance you have the events wired up twice? Once from the designer, once in the constructor? Try commenting out the constructor wirings and see if it still works. – LarsTech Nov 20 '14 at 22:42

2 Answers2

4

@LarsTech had the answer: the event constructors were declared in my designer view as well as in my form constructor.

Jacrys
  • 692
  • 1
  • 7
  • 20
1

Even if the dragEnter has been called twice, the dragDrop is always called once, if you put e.Effect = DragDropEffects.Copy in dragEnter.

private void Location_Alert_DragDrop(object sender, DragEventArgs e)
{
   ToDo();
}
private void Location_Alert_DragEnter(object sender, DragEventArgs e)
{
   e.Effect = DragDropEffects.Copy;
} 
Maya Song
  • 31
  • 4