我正在制作一个应用程序,其中我有带图标的图片框。当您单击图片框时,它会将您拉到网站。我重复使用了50多次图片框,似乎必须有一个更好的方法来编码它。目前,我在每个图片框上都有一个事件触发器来打开网站,但这似乎让我为自己做了很多工作。
目前我正在做这样的事情:
private void CreditPic1_Click(object sender, EventArgs e)
{
System.Diagnostics.Process.Start("website");
}
private void CreditPic2_Click(object sender, EventArgs e)
{
System.Diagnostics.Process.Start("website");
更新错误:
错误1'Creditr.Form1'不包含的定义 'CreditPic1_Click'并没有扩展方法'CreditPic1_Click' 接受第一个'Creditr.Form1'类型的参数可以找到(是 你错过了使用指令或程序集引用?)
当前代码:
public Form1()
{
InitializeComponent();
EventHandler openwebsite = new EventHandler(delegate { System.Diagnostics.Process.Start("http://warframe.wikia.com/wiki/Credits"); });
foreach (Control c in this.Controls)
{
if (c.Name.StartsWith("CreditPic"))
{
c.Click += openwebsite;
}
}
}
答案 0 :(得分:1)
您可以尝试以下方式:
EventHandler openwebsite = new EventHandler(delegate { System.Diagnostics.Process.Start("website"); });
foreach (Control c in this.Controls)
{
if(c.Name.StartsWith("CreditPic")) {
c.Click += openwebsite;
}
}
直接在表单InitializeComponent();
的构造函数中。
它应该遍历表单中的每个控件,如果控件的名称以“CreditPic”开头,它会将委托openwebsite
附加到其Click
事件。
执行此操作的优势与通过Visual Studio中的表单查看器添加新事件处理程序,或手动添加一个(请参阅Grantly的答案)相反,这种添加事件处理程序的方法在每次删除或添加时都是动态的您不需要修改代码的新“CreditPic”图片框,它会自动在运行时添加事件(假设控件的名称以'CreditPic'开头)。
这仅适用于作为表单直接子控件的控件。为了避免这种情况,您可以使用堆栈将控件的子项推送到堆栈中,同时进行迭代:
EventHandler opengoogle = new EventHandler(delegate { System.Diagnostics.Process.Start("http://google.com"); });
Stack<Control> Controls = new Stack<Control>();
foreach (Control c in this.Controls) Controls.Push(c);
do
{
Control c = Controls.Pop();
if (c.Name.StartsWith("GooglePic"))
c.Click += opengoogle;
foreach (Control nc in c.Controls)
Controls.Push(nc);
} while (Controls.Count > 0);
答案 1 :(得分:1)
您可以动态地将事件处理程序添加到PictureBox的每个实例,以便它们在事件触发时指向相同的函数,如此
CreditPic1.Click += new EventHandler(YourNewFunctionName);
CreditPic2.Click += new EventHandler(YourNewFunctionName);
... 即使硬编码也不错,或者您可以使用某种反射来遍历所有PictureBox ...(或循环遍历表单上的所有控件)