两个类之间的问题,急需高手解决!谢谢 在A类中有ListBox在B类中会产生一些日志,现在需把日志及时的显示在ListBox中请问这个问题该如何解决?谢谢您们!在这个休假期间为我解决这个问题 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 2个listbox 中间加个按钮,然后再加个按钮事件看看能解决吗 1.添加B的日記事件2.在A的ListView中添加一個Public函數﹐用來添加B的日記3.在B的事件中調用A上面的Public函數 比如我正在看A类中的ListBox这时B类中的某个地方出现了异常,得需及时的显示在A类中的ListBox上 楼主就按lmtz(忽隐忽现) 兄,说的试试看,能不能满足需求.也可以参考观察者模式. 4楼lmtz(忽隐忽现)的回复应该完全足够解决这类问题啊!在类B中添加一个事件,日志变化时激发这个事件,在A中增加这个事件的处理函数 //严格说应该是类A订阅这个事件,并提供事件处理方法,也就是更新ListBox。其实说白了,winform的数据绑定在内部也是这种方式运行的。 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上不显示内容呢? 将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) } }试一试 应该可以的..你遇到的问题属于跨线程调用Windows窗体控件的问题..我以前也遇到过..就是用socket接收到一个DataTable后.再绑定到DataGridView ..就是显示不出来...就是这样解快的.可以参考MSDNms-help://MS.VSCC.v80/MS.MSDN.v80/MS.VisualStudio.v80.chs/dv_fxmclictl/html/138f38b6-1099-4fd5-910c-390b41cbad35.htm 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(); } 昨天忘记告诉你了 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);}然后在需要引发这个事件的地方,调用这个方法,另外主要是由于不知你打算什么时侯开监视窗口,才用的静态事件(非静态事件原理相同) 另外在LogWindow的FormClosed事件(如果是VS2003或VS2002是Closed事件)加一句 server.MessageArrived-=new MessageHandler(this.LogWindow_MessageArrived);就不会出现多次执行的问题了 这样多次打开LOGWINDOW对于public void LogWindow_MessageArrived(string messageText){ this.listBox_NormalMessage.Items.Add(messageText);}也会运行多次的虽然在LISTBOX中只显示一次 在C#中"??"是什么意思? c#如何显示一个图片 关于重写Winform.ComboBox控件,在控件内部进行数据绑定 怎样让web服务器发送数据包 求助!树结点问题 URL中传递参数出现乱码?如何处理? 网页中有一个按钮,怎样单击按钮后网页不刷新 自定义列的显示 做了一个安装程序,在安装过程中调用vbs出错,为什么呢?在线等,高分奉送 C#里的HTTP类可以用来写一个代理服务器吗? sql2005怎么用??? 帮忙,我正在做一个用WINFORMC#访问access数据库的小软件
2.在A的ListView中添加一個Public函數﹐用來添加B的日記
3.在B的事件中調用A上面的Public函數
我正在看A类中的ListBox
这时B类中的某个地方出现了异常,得需及时的显示在A类中的ListBox上
也可以参考观察者模式.
日志变化时激发这个事件,
在A中增加这个事件的处理函数 //严格说应该是类A订阅这个事件,并提供事件处理方法,也就是更新ListBox。其实说白了,winform的数据绑定在内部也是这种方式运行的。
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上不显示内容呢?
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)
}
}试一试
你遇到的问题属于跨线程调用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
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();
}
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);
}
然后在需要引发这个事件的地方,调用这个方法,另外主要是由于不知你打算什么时侯开监视窗口,才用的静态事件(非静态事件原理相同)
加一句
server.MessageArrived-=new MessageHandler(this.LogWindow_MessageArrived);
就不会出现多次执行的问题了
public void LogWindow_MessageArrived(string messageText)
{
this.listBox_NormalMessage.Items.Add(messageText);
}也会运行多次的虽然在LISTBOX中只显示一次