C# 在C语言中将两个方法组合在一起
我目前在C中有两个不同的事件处理程序,它们执行两个不同的函数。虽然我如何将这两种方法结合在一起,所以只有一个按钮可以执行这两种操作?考虑到必须首先执行按钮单击事件C# 在C语言中将两个方法组合在一起,c#,.net,windows,C#,.net,Windows,我目前在C中有两个不同的事件处理程序,它们执行两个不同的函数。虽然我如何将这两种方法结合在一起,所以只有一个按钮可以执行这两种操作?考虑到必须首先执行按钮单击事件 private void button2_Click(object sender, EventArgs e) { var file = File.AppendText(@"c:\output2.txt"); foreach (string tmpLine in File.ReadAll
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);
}
}
不要在事件处理程序中编写代码,而是将它们分成两个函数,然后从事件处理程序中以任何方式调用这些函数。不要在事件处理程序中编写代码,将它们分成两个函数,然后从事件处理程序中以任何方式调用这些函数。只需将两个事件处理程序附加到某个按钮:
somebutton.Click += new EventHandler(button1_Click);
somebutton.Click += new EventHandler(button2_Click);
只需将两个事件处理程序附加到某个按钮:
somebutton.Click += new EventHandler(button1_Click);
somebutton.Click += new EventHandler(button2_Click);
如果我理解正确,您可以让一个事件处理程序调用另一个事件处理程序。事件处理程序毕竟只是一个方法,因此:
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和其他WriteToOutputDotTxt方法移动到该类上。这样,为该代码编写测试就容易多了,因为它没有绑定到UI代码中。如果我理解正确,您可以让一个事件处理程序调用另一个事件处理程序。事件处理程序毕竟只是一个方法,因此:
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和其他WriteToOutputDotTxt方法移动到该类上。这样,为该代码编写测试就容易多了,因为它没有绑定到UI代码中。我尝试将大多数逻辑排除在事件处理程序之外,并使用从事件处理程序调用的逻辑名称创建函数。然后可以从任何地方调用它们。我尝试将大多数逻辑排除在事件处理程序之外,并使用从事件处理程序调用的逻辑名称创建函数。然后他们可以从任何地方被呼叫
// 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;
编辑
忘记了我的发件人和事件参数
编辑
忘记了我的发件人和事件参数您能详细解释一下吗?显而易见的答案是将代码放在一个方法中。但我想那不是你想要的@Achim这正是我想要做的,我必须调用方法1按钮点击1,然后调用方法2,接受方法1的输入并处理它,输出output2.txt,如果你明白我的意思的话?StreamReader是IDisposable的,也应该进入使用块。File.AppendText还返回一个StreamWriter,它应该放在using块中。是的,您正在关闭它,但是如果写入引发异常怎么办?而不是按2\u clicksender,e,你可以说只是按钮;你能解释得更详细一点吗?显而易见的答案是将代码放在一个方法中。但我想那不是你想要的@Achim这正是我想要做的,我必须调用方法1按钮点击1,然后调用方法2,接受方法1的输入并处理它,输出output2.txt,如果你明白我的意思的话?StreamReader是IDisposable的,也应该进入使用块。File.AppendText还返回一个StreamWriter,它应该放在using块中。是的,您正在关闭它,但是如果写入引发异常怎么办?而不是按2\u clicksender,e,你可以说只是按钮;您好,我尝试过您的方法,虽然它声明output.txt正在被其他方法使用,但当我让button2调用output.txt并将其输出为output2.txt时,我已经更新了我的代码以显示我所做的更改。我尝试过您的方法,尽管它声明output.txt正在被其他方法使用,当我使用button2调用output.txt并将其输出为output2.txt时,我已经更新了代码,以显示我所做的更改+1。按钮下的代码很少是个好主意。更好的是,将I/O逻辑移出到一个单独的类中。+1。按钮下的代码很少是个好主意。更好的是,将I/O逻辑移出到一个单独的类中。不保证排序:不保证排序: