C#使用事件的数字因子

时间:2012-07-30 07:49:49

标签: c# events factorial

我制作了一个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.递增。(当它从递归返回时它也应该递减,但我更感兴趣的是让它首先工作)。

如果可以,请帮助我。这对我来说真的很困惑,我只能找到显示消息或者解释得非常糟糕的例子。

提前致谢!

2 个答案:

答案 0 :(得分:2)

您遇到此错误,因为您的方法签名不相同: .NET假设你有 public int OnProgressBarChanged()

public void OnProgressBarChanged(object o, EventArgs e);

这是所有.net事件的标志性签名。第一个参数 - 是对象,它引发了事件。第二个参数是事件数据。 您可以创建自定义类,继承自EventErgs以将数据传递给事件处理程序

答案 1 :(得分:0)

对于这种任务,我建议使用带有ProgressChanged事件处理程序的BackgroundWorker,以便在不同的线程上执行计算和UI更新。有关斐波纳契数计算和进度条的类似示例,请参阅MSDN docs