一个自定义控件U,里面有5个Label,这5个Label分别读取数据库的不同信息。
也就是说读取数据库的操作在控件U中。目前已经在全屏窗口(大屏幕)中动态生成N个控件U(N=2,4,8,16),封装在一个方法A中。
只要别的程序修改了数据库的内容并发送了消息给屏幕,屏幕就会接收消息并刷新:直接调用方法A。但是目前是全部刷新,而且所有N个控件U都要重新绘制,屏幕会闪。问下怎样实现发送消息时只刷新控件U中的某个Label?
求给下思路或代码,谢谢!
解决方案 »
- 请教事件注册的语法
- Repeater 中LinkButton的显示问题。
- Winfrom Gridview绑定 Ilist<对像>数据源
- 为什幺通过该组件建立的第一个按钮名字为txButton2而不是txButton1呢
- 关于自定义控件UserControl1的问题
- 使用宏失败的一个询问
- 网上下了个c#+sql的程序,本机上数据库也附加进sql2000了,但运行后,进入用户登录界面,登录后说用户"sa"登录失败
- 新手问一个小问题。
- 如何获取GridView中的Button控件
- 请问 XML 问题,路径怎么设置?
- **********100分问题异步委托抱错的问题******************
- 急!!C#程序退出时报错
this.SuspendLayout();//TODO:比较label和数据库的值,如果不同则更新//数据修改之后
this.ResumeLayout(false);
-----------------------------------------------------------
你把U当参数传递到B函数中,或者放在一个指定区域让B函数内部可以访问到。
我现在有A,B,C,D 4个传感器。A,B,C,D 也是这4个传感器ID(或者说标识符)。
那么你可以根据4个传感器信息循环生成U控件,生成控件时设置传感器ID到U控件。
然后传感器更新数据时,数据格式中包含传感器ID 就行了啊。
这样U控件就能根据更新数据中的ID去判断是否更新。这是大概的思路。另外问:你是不是用了TableLayoutPanel了。
tableLayoutPanel1.GetType().GetProperty("DoubleBuffered", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic).SetValue(tableLayoutPanel1, true, null);
客户端异步调用这个广播信息(Activator.GetObject(
typeof(IBroadCast), "http://localhost:8080/BroadMessage.soap");),
无刷新自动更新值。
public void BroadCastingMessage(string message)//客户端接收信息
{
if (this.txtMessage.InvokeRequired)
{
BroadCastEventHandler bdh = new BroadCastEventHandler(BroadCastingMessage);
this.Invoke(bdh, new object[] { message });
}
else
{
txtMessage.Text += message;
txtMessage.Text += System.Environment.NewLine;
}
} 大概意思是这样。细节你可以网上看看。
动态创建控件U的方法写在了一个函数A中,构造函数调用这个函数A。
然而接收信息的函数B又调用了一遍函数A,不慢不闪才怪……
我现在只想找到要刷新的其中的某一个控件U,刷新它,不用再重新new一遍……
在遍历当前窗体(屏幕)里的控件时,却没有找到这N个控件U……foreach (Control ctrl in this.Controls)
{
if (ctrl is UCPointMachineNewStatistic)
{
//UCPointMachineNewStatistic是自定义控件U的类型
//...
}
}在调试时用即时窗口看ctrl.Controls.Count的个数,是生成控件U的个数没错。
然而用"this."的方式找不到生成的控件U……
动态生成的控件应该怎样找到其中的某一个呢?
还有,代码中的if条件"ctrl is UCPointMachineNewStatistic"的结果是"false"……
可是动态创建控件U方法的函数A已经执行了啊……
之前的遍历之所以不成功,是因为我不知道in后面跟的应该是控件U的直接父控件//前面代码获得了要找到的控件的ID,放在了变量USID中
foreach (Control ctrl in this.tableLayoutPanel1.Controls)
{
if (ctrl is UCPointMachineNewStatistic)
{
//UCPointMachineNewStatistic是自定义控件U的类型
UCPointMachineNewStatistic uc = ctrl as UCPointMachineNewStatistic;//重要的一句
if (uc.ID == USID)
{
//相关刷新操作
break;
}
}
}这样就能遍历整个控件并找到我想要的动态生成的那个控件了。