Search code examples
c#eventsbuttontabcontrolflowlayoutpanel

C# - Create dynamic buttons and events


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!


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