最近写一个程序,调用了一个外部的Dll库文件,里面有个事件。不知道怎么去调用它。用事件订阅的方式可以执行,但是在事件处理方法里面对控件赋值时,提示 Form.dll偶尔的类型出错,控件的值没有变化。不知道是怎么回事。下面是代码:        public ExecClass(MainForm From)  //类构造函数中订阅事件    {
            base.onProgressChanged += new _IPSExchangeEvents_onProgressChangedEventHandler(main_onProgressChanged);
   
        }        /// <summary>
        /// 事件处理
        /// </summary>
        public void main_onProgressChanged(object sender, int e)
        {
           TextBox1.Text = e.ToString(); //执行这里时在输出窗口中就提示类型错误了,但是e中是有值的,文本框中就没有值。求解????
                   }    

解决方案 »

  1.   

     main_onProgressChanged(object sender, int e)
    第二个参数是整型,看看那个事件要的是啥类型
      

  2.   

    事件参数,基类是EventArgs,你要传递int数据,自己要派生一个事件参数类:
    public class YourArgs:public EventArgs
    {
       public int data;
    }
    用YourArgs传递数据!
      

  3.   

    那个位置应该是 继承自EventArgs 的一个类你可以先写 EventArgs 然后断点看下具体的类型
      

  4.   

    事件里面的第二个参数是int型数据,这里如何进行传值,具体该去怎么写法public class YourArgs:public EventArgs
    {
       public int data;
    }
      

  5.   

    在你要触发事件的地方:    YourArgs args=new YourArgs ();
        args.data=100;
        
        OnProgress(args);//触发事件你可以看看MSDN上面对事件的介绍
      

  6.   

    已经找到答案了,原来是线程的问题,不同线程访问造成文本框的类型异常,刚开始没想到这个类库会自己开个线程来执行这个事件。还有个问题没有弄清楚,为什么我在第二个参数输入 int 不提示线程间的调用控件的异常,而输入System.Int32后就提示线程调用控件的异常了。。不知道是为什么!附上线程调用控件的处理代码:        public delegate void ProgressChanged(object sender, System.Int e);         public void onProgressChanged(object sender, System.Int e) 
            {
                if (this.textBox1.InvokeRequired)
                {
                    MessageOutputText txt = new MessageOutputText(ProgressChanged);
                   this.textBox1.BeginInvoke(txt, new object[] { sender, e });
                }
                else
               {
                    this.textBox1.AppendText(e) ;
               }
            }