我目前在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);
}
}
答案 0 :(得分:11)
不是在事件处理程序中编写代码,而是将它们分成两个函数,然后以任何方式从事件处理程序中调用这些函数。
答案 1 :(得分: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
}
代码不会将包含在事件处理程序中,事实上,如果您可以将代码分开,您会发现测试代码更容易(如果您有兴趣!)来自您的UI。例如,您可以拥有一个名为ProcessOutputFile
的类,并将WriteToOutputDotTxt
和OtherMethodThatWritesToOutputDotTxt
方法移到该类上。然后为该代码编写测试要容易得多,因为它没有“绑定”到UI代码中。
答案 2 :(得分:2)
我尝试将大多数逻辑保留在事件处理程序之外,并使用我从事件处理程序调用的逻辑名创建函数。然后可以从任何地方调用它们。
答案 3 :(得分:1)
只需将两个事件处理程序附加到某个按钮:
somebutton.Click += new EventHandler(button1_Click);
somebutton.Click += new EventHandler(button2_Click);
答案 4 :(得分: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