Question

I have a form with a tabControl and inside of each tab is a flowLayoutPanel where I can drag and drop files and a button is created for each dropped file. Afterwards when I click on a button, the file that i dropped should open. I have managed to do this for one file only.. My problem is how can I tell which button was clicked and to open the file/app stored in the path for each button.. How can I differentiate in the button_click event the clicked button and the path of the app to open?

Code for this part so far:

Process myProcess = new Process();
string path_app;

public Form1()
{
   InitializeComponent();
   this.DragEnter += new DragEventHandler(Form1_DragEnter);
   this.DragDrop += new DragEventHandler(Form1_DragDrop);
}

void Form1_DragEnter(object sender, DragEventArgs e)
{
   if (e.Data.GetDataPresent(DataFormats.FileDrop, false))
      e.Effect = DragDropEffects.All;
}

void Form1_DragDrop(object sender, DragEventArgs e)
{
   string[] fileList = e.Data.GetData(DataFormats.FileDrop) as string[];

   foreach (string s in fileList)
   {

      Button button = new Button(); 
      button.Click += new EventHandler(this.button_Click);
      flowLayoutPanel1.Controls.Add(button);
      path_app = String.Format("{0}", s);
   }
}

private void button_Click(object sender, System.EventArgs e)
{
   myProcess.StartInfo.FileName =path_app;
   myProcess.Start();
} 

Also my tabControl has the possibility to add new tabs but how can I get the selected tab and the inside flowLayoutPanel to know where to create the button?

And by the way, is there a problem of how I open the files? I understood that i have to take into consideration the working directory..

Thank you for your help!

Was it helpful?

Solution

You can utilize Tag property of the Button:

void Form1_DragDrop(object sender, DragEventArgs e)
{
   foreach (String s e.Data.GetData(DataFormats.FileDrop))
   {
      Button button = new Button(); 
      button.Click += new EventHandler(this.button_Click);
      flowLayoutPanel1.Controls.Add(button);
      path_app = String.Format("{0}", s);

      // Add to Tag any data you want to pin to the button
      button.Tag = path_app;
   }
}

private void button_Click(object sender, System.EventArgs e)
{
   // Obtain via Tag
   String path_app = ((sender as Button).Tag as String); 

   myProcess.StartInfo.FileName = path_app;
   myProcess.Start();
} 

OTHER TIPS

You could use button.Tag = "theFancyPath" and in the EventHandler cast the object sender as Button to access the Tag property.

If you need more then you could inherit from Button:

public class ButtonWithPathProperty : Button
{
    public FileInfo PathToOpen { get; private set; }

    public ButtonWithPathProperty(FileInfo path) 
    {
         PathToOpen = path;
         this.Click += new EventHandler(this.button_Click);
    }

    private void button_Click(object sender, System.EventArgs e)
    {
        var yourPath = this.PathToOpen;
    } 
}

This is not tested btw :)

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top