在A类中有ListBox
在B类中会产生一些日志,现在需把日志及时的显示在ListBox中
请问这个问题该如何解决?
谢谢您们!
在这个休假期间为我解决这个问题

解决方案 »

  1.   

    2个listbox 中间加个按钮,然后再加个按钮事件看看能解决吗
      

  2.   

    1.添加B的日記事件
    2.在A的ListView中添加一個Public函數﹐用來添加B的日記
    3.在B的事件中調用A上面的Public函數
      

  3.   

    比如
    我正在看A类中的ListBox
    这时B类中的某个地方出现了异常,得需及时的显示在A类中的ListBox上
      

  4.   

    楼主就按lmtz(忽隐忽现) 兄,说的试试看,能不能满足需求.
    也可以参考观察者模式.
      

  5.   

    4楼lmtz(忽隐忽现)的回复应该完全足够解决这类问题啊!在类B中添加一个事件,
    日志变化时激发这个事件,
    在A中增加这个事件的处理函数 //严格说应该是类A订阅这个事件,并提供事件处理方法,也就是更新ListBox。其实说白了,winform的数据绑定在内部也是这种方式运行的。
      

  6.   

    server:
    public delegate void MessageHandler(string messageText);
    publci class server
    {
    public event MessageHandler MessageArrived;
    server()
    {
    LogWindow logwindow=new LogWindow();
    this.MessageArrived+=new MessageHandler(logwindow.LogWindow_MessageArrived);
    }
    public  bool ServerStart()
    {
    try
    {
    MessageArrived("服务器启动成功,开始侦听");
    return true;
    }
    catch(Exception ex)
    {
    MessageArrived("服务器启动成功,开始侦听");
    return false;
    }
    }
    }LogWindow:
    public class LogWindow
    {
    public void LogWindow_MessageArrived(string messageText)
    {
      this.listBox_NormalMessage.Items.Add(messageText);
    }}
    this.listBox_NormalMessage.Items.Add(messageText);为什么这句运行后,ListBox上不显示内容呢?
      

  7.   


    public void LogWindow_MessageArrived(string messageText)
    {
      this.listBox_NormalMessage.Items.Add(messageText);
    }
    改为:delegate void SetTextCallback(string text);
      private void LogWindow_MessageArrived(string messageText)
            {
                if (this.listBox_NormalMessage.InvokeRequired)
                {
                    SetTextCallback d = new SetTextCallback(LogWindow_MessageArrived);
                    this.Invoke(d, new object[] { messageText});
                }
                else
                {
                    this.listBox_NormalMessage.Items.Add(messageText)
                }
            }试一试
      

  8.   

    应该可以的..
    你遇到的问题属于跨线程调用Windows窗体控件的问题..我以前也遇到过..就是用socket接收到一个DataTable后.
    再绑定到DataGridView ..就是显示不出来...
    就是这样解快的.
    可以参考MSDN
    ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.VisualStudio.v80.chs/dv_fxmclictl/html/138f38b6-1099-4fd5-910c-390b41cbad35.htm
      

  9.   

    server:
    public delegate void MessageHandler(string messageText);
    publci class server
    {
     public static event MessageHandler MessageArrived;
     server()
     {
     }  public  bool ServerStart()
     { 
      try
      {
            MessageArrived("服务器启动成功,开始侦听");
           return true;
      }
      catch(Exception ex)
       {
            MessageArrived("服务器启动成功,开始侦听");
            return false;
       }
       }
    }LogWindow:
    public class LogWindow
    {
    public LogWindow()
    {
       server.MessageArrived+=new MessageHandler(this.LogWindow_MessageArrived);}
    public void LogWindow_MessageArrived(string messageText)
    {
      this.listBox_NormalMessage.Items.Add(messageText);
    }}先运行server类,到了MessageArrived("服务器启动成功,开始侦听")这出错,因为未将对象引用设置到对象的实例。先运行LOGWINDOW不会出现这种问题。而且我在运行server前,几次打开LOGWINDOW,待server运行后就
    this.listBox_NormalMessage.Items.Add(messageText);
    就会运行几次,虽然LISTBOX上只显示一次结果,但是使用断点可以看见它多次运行,使用静态变量存储MESSAGETEXT的值,结果也是多次的请问我想
    public void LogWindow_MessageArrived(string messageText)
    {
      this.listBox_NormalMessage.Items.Add(messageText);
    }
    只运行一次怎么办?谢谢说明:
    在主窗口中,我是这样打开LOGWINDOW的
    private void menuItem_Log_Click(object sender, System.EventArgs e)
    {
    if(this.checkChildFrmExist("LogWindow")==true)
    return;
    LogWindow logwindow=new LogWindow();
    logwindow.MdiParent=this;
    logwindow.Show();
    }
      

  10.   

    昨天忘记告诉你了
     public  bool ServerStart()
     { 
      try
      {
            MessageArrived("服务器启动成功,开始侦听");
           return true;
      }
      catch(Exception ex)
       {
            MessageArrived("服务器启动成功,开始侦听");
            return false;
       }
       }
    }
    不能用你的这种方法引发事件
    要用这样的方法
     public  bool ServerStart()
     { 
      try
      {
    if(MessageArrived!=null)
            MessageArrived("服务器启动成功,开始侦听");
           return true;
      }
      catch(Exception ex)
       {
    if(MessageArrived!=null)
            MessageArrived("服务器启动成功,开始侦听");
            return false;
       }
       }
    }
    最好的方法是加一个引发事件的方法如:
    void OnMessageArrived(string msg)
    {
    if(MessageArrived!=null)
    MessageArrived(msg);
    }
    然后在需要引发这个事件的地方,调用这个方法,另外主要是由于不知你打算什么时侯开监视窗口,才用的静态事件(非静态事件原理相同)
      

  11.   

    另外在LogWindow的FormClosed事件(如果是VS2003或VS2002是Closed事件)
    加一句
      server.MessageArrived-=new MessageHandler(this.LogWindow_MessageArrived);
    就不会出现多次执行的问题了
      

  12.   

    这样多次打开LOGWINDOW对于
    public void LogWindow_MessageArrived(string messageText)
    {
      this.listBox_NormalMessage.Items.Add(messageText);
    }也会运行多次的虽然在LISTBOX中只显示一次