C# 重复使用图片框打开链接

C# 重复使用图片框打开链接,c#,C#,我正在制作一个应用程序,其中有带图标的图片盒。当你点击picturebox时,它会将你拉到一个网站。我重复使用picturebox 50多次,似乎必须有更好的编码方法。目前,我在每个图片框上都有一个事件触发器来打开网站,但这似乎是我为自己的很多工作让路 目前我正在做这样的事情: private void CreditPic1_Click(object sender, EventArgs e) { System.Diagnostics.Process.St

我正在制作一个应用程序,其中有带图标的图片盒。当你点击picturebox时,它会将你拉到一个网站。我重复使用picturebox 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");
更新错误:

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;
                }
            }
        }
错误1“Creditr.Form1”不包含的定义 “CreditPic1\u Click”和无扩展方法“CreditPic1\u Click” 无法找到接受类型为“Creditr.Form1”的第一个参数(是 是否缺少using指令或程序集引用?)

当前代码:

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

您可以尝试以下方法:

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
附加到其
单击事件

与在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);
EventHandler opengoogle=neweventhandler(委托{System.Diagnostics.Process.Start(“http://google.com"); });
堆栈控件=新堆栈();
foreach(控制c在这个.控制)控制.Push(c);
做
{
Control c=Controls.Pop();
如果(c.Name.StartsWith(“谷歌”))
c、 点击+=打开谷歌;
foreach(c.Controls中的控制nc)
控制。推送(nc);
}而(对照组:计数>0);

您可以尝试以下方法:

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
附加到其
单击事件

与在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);
EventHandler opengoogle=neweventhandler(委托{System.Diagnostics.Process.Start(“http://google.com"); });
堆栈控件=新堆栈();
foreach(控制c在这个.控制)控制.Push(c);
做
{
Control c=Controls.Pop();
如果(c.Name.StartsWith(“谷歌”))
c、 点击+=打开谷歌;
foreach(c.Controls中的控制nc)
控制。推送(nc);
}而(对照组:计数>0);

您可以动态地将事件处理程序添加到PictureBox的每个实例中,以便在事件触发时它们指向相同的函数,如下所示

CreditPic1.Click += new EventHandler(YourNewFunctionName);
CreditPic2.Click += new EventHandler(YourNewFunctionName);
。。。
即使是硬编码,这也不算太糟糕,或者您可以使用某种反射来循环所有PictureBox…(或者循环表单上的所有控件)

您可以动态地将事件处理程序添加到PictureBox的每个实例中,以便在事件触发时它们指向相同的函数,如下所示

CreditPic1.Click += new EventHandler(YourNewFunctionName);
CreditPic2.Click += new EventHandler(YourNewFunctionName);
。。。
即使是硬编码,这也不算太糟糕,或者你可以使用某种反射来循环所有PictureBoxes…(或者循环表单上的所有控件)

太棒了,这看起来是最好的选择。谢谢你的帮助和支持!我想我错过了一些基本的东西。我添加了你的代码,并做了测试。当我点击标有“CreditPic1”的图片盒时,什么也没发生。(没有错误)。但是,当我删除旧的click_事件时,我遇到了一个错误。我用这个错误更新了top post。由于某种原因,Visual Studio不会在代码中删除其方法后自动删除事件。您需要在窗体视图中单击控件,然后在控件的属性窗口中单击闪电,然后找到“单击”操作并将其清除。好的,该错误已消失,返回到原始状态-单击picturebox不起任何作用,好像事件没有触发。您是否确保将代码直接放在
InitializeComponent()之后?否则,所有控件都不会添加到表单中。太棒了,这看起来是最好的选择。谢谢你的帮助和支持!我想我错过了一些基本的东西。我添加了你的代码,并做了测试。当我点击标有“CreditPic1”的图片盒时,什么也没发生。(没有错误)。但是,当我删除旧的click_事件时,我遇到了一个错误。我用这个错误更新了top post。由于某种原因,Visual Studio不会在代码中删除其方法后自动删除事件。您需要在窗体视图中单击控件,然后在控件的属性窗口中单击闪电,然后找到“单击”操作并将其清除。好的,该错误已消失,返回到原始状态-单击picturebox不起任何作用,好像事件没有触发。您是否确保将代码直接放在
InitializeComponent()之后?否则,将不会将任何控件添加到