在C#中将两个方法分组在一起

本文关键字:方法 两个 在一起 | 更新日期: 2023-09-27 17:58:38

我目前在C#中有两个不同的事件处理程序,它们执行两种不同的功能。虽然我怎么能把这两种方法结合在一起,所以只有一个按钮可以执行这两个操作?(考虑到必须首先执行button1_Click事件。)

    private void button2_Click(object sender, EventArgs e)
    {
        var file = File.AppendText(@"c:'output2.txt");
        foreach (string tmpLine in File.ReadAllLines(@"c:'output.txt"))
        {
            if (File.Exists(tmpLine))
            {
                file.WriteLine(tmpLine);
            }
        }
        file.Close();
    }
    private void button1_Click(object sender, EventArgs e)
    {
        using (StreamWriter sw = File.AppendText(@"c:'output.txt"))
        {
            StreamReader sr = new StreamReader(@"c:'filename.txt");
            string myString = "";
            while (!sr.EndOfStream)
            {
                myString = sr.ReadLine();
                int index = myString.LastIndexOf(":");
                if (index > 0)
                    myString = myString.Substring(0, index);
                sw.WriteLine(myString);
            }
            button2_Click(sender, e);
        }
    }

在C#中将两个方法分组在一起

不要在事件处理程序中编写代码,而是将它们分成两个函数,然后从事件处理程序以任何方式调用这些函数。

如果我理解正确的话,您可以让一个事件处理程序调用另一个。毕竟,事件处理程序"只是"一个方法,所以:

private void button1_Click(object sender, EventArgs e)
{
    // All the code that's currently there
    button2_Click(sender, e);
}

或者,您可以将事件处理程序中的代码提取到单独的方法中:

private void button1_Click(object sender, EventArgs e)
{
    WriteToOutputDotTxt();
    OtherMethodThatWritesToOutputDotTxt();
}
private void button2_Click(object sender, EventArgs e)
{
    OtherMethodThatWritesToOutputDotTxt();
}
private void WriteToOutputDotTxt()
{
    // Code that's currently in button1_Click
}
private void OtherMethodThatWritesToOutputDotTxt()
{
    // Code that's currently in button2_Click
}

代码不需要包含在事件处理程序中,事实上,如果您可以将代码从UI中分离出来,您会发现测试代码更容易(如果您感兴趣的话!)。例如,您可以拥有一个名为ProcessOutputFile的类,并将WriteToOutputDotTxtOtherMethodThatWritesToOutputDotTxt方法移动到该类上。这样,为该代码编写测试就容易多了,因为它不"绑定"到UI代码中。

我试图将大多数逻辑排除在事件处理程序之外,并使用从事件处理程序调用的逻辑名称创建函数。然后可以从任何地方呼叫他们。

只需在某个按钮上附加两个事件处理程序:

somebutton.Click += new EventHandler(button1_Click);
somebutton.Click += new EventHandler(button2_Click);
// given these two methods extracted from your events
void DoBar(object sender, EventArgs e)
{
    var file = File.AppendText(@"c:'output.txt");
    foreach (string tmpLine in File.ReadAllLines(@"c:'filename.txt"))
    {
        if (File.Exists(tmpLine))
        {
            file.WriteLine(tmpLine);
        }
    }
    file.Close();
}
void DoFoo(object sender, EventArgs e)
{
        using (StreamWriter sw = File.AppendText(@"c:'output.txt"))
        {
            StreamReader sr = new StreamReader(@"c:'filename.txt");
            string myString = "";
            while (!sr.EndOfStream)
            {
                myString = sr.ReadLine();
                int index = myString.LastIndexOf(":");
                if (index > 0)
                    myString = myString.Substring(0, index);
                sw.WriteLine(myString);
            }
        }
}
    // you can subscribe like this
button1.Click += DoFoo;
button1.Click += DoBar;
button2.Click += DoBar;  

编辑忘记了我的发件人和事件参数