如何在C#中点击一个按钮时调用另一个按钮的单击事件

4
我在我的Windows应用程序中有两个按钮。
Button1执行一个任务:
private void button1_Click(object sender, EventArgs e)
{
    progressBar1.Value = 0;
    String[] a = textBox7.Text.Split('#');
    progressBar1.Maximum = a.Length;
    for (var i = 0; i <= a.GetUpperBound(0); i++)
    {
        ansh.Close();
        progressBar1.Value++;
    }
}

按钮2执行以下操作。
private void button2_Click(object sender, EventArgs e)
{
    foreach (string item in listBox2.Items)
        textBox7.Text += item.Contains("@") ? string.Format("{0}#", item.Split('@')[0]) : string.Empty;
}

我只想用一个按钮来触发两个事件。但我希望先调用button2的事件,然后再调用button1的事件。也就是说,我想使用一个按钮替代按钮1和按钮2,并且当我点击时,首先要做的事情是将列表框中的项目获取到文本框中。
{
    foreach (string item in listBox2.Items)
        textBox7.Text += item.Contains("@") ? string.Format("{0}#", item.Split('@')[0]) : string.Empty;
}

然后开始进度条事件并关闭连接 X。
progressBar1.Value = 0;
String[] a = textBox7.Text.Split('#');
progressBar1.Maximum = a.Length;
for (var i = 0; i <= a.GetUpperBound(0); i++)
{
    ansh.Close();
    progressBar1.Value++;
}

1
一个好的解决方案是将功能提取到方法中,并在按钮处理程序内调用这些方法。这样,您不需要触发点击事件,而是调用一个方法。这也更容易维护。 - keenthinker
1
@pasty 非常感谢你。 - Dr.zeus
4个回答

14
你可以使用按钮对象的 PerformClick 方法。
    Button button1 = new Button(), button2 = new Button();
    button1.Click += new EventHandler(button1_Click);
    button2.Click += new EventHandler(button2_Click);

    void button1_Click(object sender, EventArgs e)
    {
        /* .................... */
        button2.PerformClick(); //Simulate click on button2
        /* .................... */
    }

    void button2_Click(object sender, EventArgs e)
    {
        /* .................... */
    }

1
需要注意的是,PerformClick 并不总是有效的。例如,如果 "CanSelect" 为 false(例如,因为按钮不可见),PerformClick 将不起作用。 - Jeff Roe

7
我建议将点击事件后面的逻辑移至单独的方法中。
private void MethodOne()
{
    progressBar1.Value = 0;
    String[] a = textBox7.Text.Split('#');
    progressBar1.Maximum = a.Length;
    for (var i = 0; i <= a.GetUpperBound(0); i++)
    {
        ansh.Close();
        progressBar1.Value++;
    }
}

private void MethodTwo()
{
    foreach (string item in listBox2.Items)
        textBox7.Text += item.Contains("@") ? string.Format("{0}#", item.Split('@')[0]) : string.Empty;
}

private void button1_Click(object sender, EventArgs e)
{
    MethodTwo();
    MethodOne();
}

private void button2_Click(object sender, EventArgs e)
{
    MethodTwo();
}

根据我的经验,这种方法更易于维护和测试。不同控件的事件相互调用会使逻辑更加难以理解。


3
您可以手动触发Button2的点击事件:
private void button1_Click(object sender, EventArgs e)
{
    button2_Click(sender,e);
    ...
}

2

如果您需要事件:

Button1.click += method1;
Button1.click += method2;


void method1(object sender, EventArgs e)
{
    // do your stuff
}
void method2(object sender, EventArgs e)
{
    // do your stuff
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接