C# - 创建动态按钮和事件
本文关键字:事件 按钮 动态 创建 | 更新日期: 2023-09-27 17:55:13
>我有一个带有tabControl的表单,每个选项卡的内部都有一个flowLayoutPanel,我可以在其中拖放文件,并为每个拖放的文件创建一个按钮。之后,当我单击按钮时,我删除的文件应该打开。我设法只为一个文件执行此操作。我的问题是我如何知道单击了哪个按钮并打开存储在每个按钮路径中的文件/应用程序。如何在button_click事件中区分单击的按钮和要打开的应用程序的路径?
到目前为止,这部分的代码:
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();
}
此外,我的选项卡控件可以添加新选项卡,但是我如何才能让所选选项卡和内部flowLayoutPanel知道在哪里创建按钮?
顺便问一下,我如何打开文件有问题吗?我明白我必须考虑工作目录。
感谢您的帮助!
你可以利用Button
Tag
的属性:
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();
}
您可以使用button.Tag = "theFancyPath"
并在事件处理程序中强制转换object sender as Button
以访问 Tag 属性。
如果你需要更多,那么你可以从按钮继承:
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;
}
}
顺便说一句,这没有经过测试:)