我制作了一个WindowForm应用程序,用于计算数字的阶乘。一切都很好,但现在我必须使用事件来做。事件的概念对我来说是新的,我一直试图让它在过去的3天里工作无济于事。
所以我有表格
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
... some function declarations...
//public event EventHandler ProgressBarChanged;
public int OnProgressBarChanged()
{
progressBar1.Value++;
return progressBar1.Value;
}
public void button2_Click(object sender, EventArgs e)
{
initialize();
label3.Visible = false;
int wait_time = telltime();
int number = reading();
Facto mth;
if (checkBox1.Checked && checkBox2.Checked)
{
mth = new Facto(label3, wait_time, progressBar1);
}
else if(checkBox1.Checked==false && checkBox2.Checked)
{
mth = new Facto(label3,wait_time);
}
else if (checkBox1.Checked && checkBox2.Checked == false)
{
checkBox1.Checked = false;
mth = new Facto();
}
else
{
mth = new Facto();
}
mth.Subs += new Eventhandler(OnProgressBarChanged);//error, don't understand why
int result = mth.Factorial(number);
string display = result.ToString();
label3.Visible = true;
label3.Text = display;
}
和Facto类:
public class Facto
{
public event EventHandler Subs;
System.Windows.Forms.Label label_for_output;
int wait_time;
System.Windows.Forms.ProgressBar bar;
public Facto()
{
}
public Facto(System.Windows.Forms.Label l, int time)
{
label_for_output = l;
wait_time = time;
}
public int Factorial(int number_to_calculate)
{
int Result;
if (Subs != null)
{
Subs(this, new EventArgs());
}
System.Threading.Thread.Sleep(wait_time);
if (number_to_calculate == 0)
{
return 1;
}
else
{
Result = (number_to_calculate * Factorial(number_to_calculate - 1));
if (label_for_output != null)
{
label_for_output.Visible = true;
label_for_output.Text = Result.ToString();
label_for_output.Update();
}
else
Console.WriteLine(Result);
}
System.Threading.Thread.Sleep(wait_time);
return Result;
} }}
当递归函数调用自身时,应该触发事件。当事件被触发时,来自Form1的progressbar1.value应该以1.递增。(当它从递归返回时它也应该递减,但我更感兴趣的是让它首先工作)。
如果可以,请帮助我。这对我来说真的很困惑,我只能找到显示消息或者解释得非常糟糕的例子。
提前致谢!
答案 0 :(得分:2)
您遇到此错误,因为您的方法签名不相同:
.NET假设你有
public int OnProgressBarChanged()
为
public void OnProgressBarChanged(object o, EventArgs e);
这是所有.net事件的标志性签名。第一个参数 - 是对象,它引发了事件。第二个参数是事件数据。 您可以创建自定义类,继承自EventErgs以将数据传递给事件处理程序
答案 1 :(得分:0)
对于这种任务,我建议使用带有ProgressChanged事件处理程序的BackgroundWorker,以便在不同的线程上执行计算和UI更新。有关斐波纳契数计算和进度条的类似示例,请参阅MSDN docs。