2011-06-08 52 views
1

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

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

     } 

    } 
+0

能否请您expain一点更详细的?显而易见的答案是将代码放在一个方法中。但我想这不是你想要的!? – Achim 2011-06-08 20:05:40

+0

@Achim这正是我想要做的,我不得不调用方法一(按钮单击1),然后调用方法2输入并处理它,输出output2.txt,如果你明白我的意思吗? – James 2011-06-08 20:19:00

+0

StreamReader是IDisposable,并且也应该放在使用块中。 File.AppendText也返回一个StreamWriter,它应该放在一个使用块中。 (是的,你正在关闭它,但是如果写入引发异常呢?) – TrueWill 2011-06-08 20:20:28

回答

11

而不是写在事件处理程序的代码,把他们带出来成两个函数,然后叫你从事件处理程序需要的任何方式的功能。

+1

+1。 “按钮下的代码”很少是一个好主意。更好的是,将I/O逻辑移出一个单独的类。 – TrueWill 2011-06-08 20:22:00

1

只需连接两个事件处理程序的一些按钮:

somebutton.Click += new EventHandler(button1_Click); 
somebutton.Click += new EventHandler(button2_Click); 
+0

不保证排序:http://stackoverflow.com/questions/1645478/order-of-event-handler-execution – Achim 2011-06-08 20:25:16

2

,你可以,如果我正确认识你,有一个事件处理程序调用另一个。事件处理程序是“公正”毕竟是一个方法,所以:

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 
} 

代码不将被包含在事件处理程序中,事实上,如果您可以将其从用户界面中分离出来,则可以更轻松地进行测试(如果您感兴趣的话)。例如,您可以有一个名为ProcessOutputFile的类并将​​和OtherMethodThatWritesToOutputDotTxt方法移动到该类上。因为它没有“绑定到”UI代码中,所以编写测试代码更容易。

+0

嗨,我试过你的方法,虽然它声明output.txt正在使用其他方法,因为我使button2调用output.txt并将其输出为output2.txt,所以我更新了代码以显示我所做的更改 – James 2011-06-08 20:15:29

2

我尽量不使用事件处理程序的大部分逻辑,并用事件处理程序调用的逻辑名创建函数。然后他们可以从任何地方被召唤。

0
// 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; 

编辑 忘记了发送者和EventArgs的