一个自定义控件U,里面有5个Label,这5个Label分别读取数据库的不同信息。
也就是说读取数据库的操作在控件U中。目前已经在全屏窗口(大屏幕)中动态生成N个控件U(N=2,4,8,16),封装在一个方法A中。
只要别的程序修改了数据库的内容并发送了消息给屏幕,屏幕就会接收消息并刷新:直接调用方法A。但是目前是全部刷新,而且所有N个控件U都要重新绘制,屏幕会闪。问下怎样实现发送消息时只刷新控件U中的某个Label?
求给下思路或代码,谢谢!

解决方案 »

  1.   

    Sandy945出手应该已经解决了吧,我来蹭蹭分了。
      

  2.   

    //数据修改之前 
    this.SuspendLayout();//TODO:比较label和数据库的值,如果不同则更新//数据修改之后
    this.ResumeLayout(false);
      

  3.   

    用委托的方式刷新控件,可以对每个控件指定一个id,刷新的时候,只是刷新指定id的控件。
      

  4.   

    谢谢提供思路,现在控件自身是在一个函数A的for循环中生成,ID的话自身也有,只是获得消息并进行相关操作的方法在另一个函数B中,B中上下文没有控件U。不知道如何把U及其ID从A中取出来……
      

  5.   

    楼主的眼神好销魂啊。可以根据id数组循环生成控件,id数组取自于数据库中刷新数据的某列的值(这列能区分数据属于哪个控件),这样刷新时根据id判断是否刷新。
      

  6.   

    重点是获得控件不是它的ID,因为控件获得了,ID迎刃而解……问题同8楼……
      

  7.   

    只是获得消息并进行相关操作的方法在另一个函数B中,B中上下文没有控件U。不知道如何把U及其ID从A中取出来……
    -----------------------------------------------------------
    你把U当参数传递到B函数中,或者放在一个指定区域让B函数内部可以访问到。
      

  8.   

    举个例子,你这个U控件用来监测温度的。每个控件显示对应传感器温度。
    我现在有A,B,C,D 4个传感器。A,B,C,D 也是这4个传感器ID(或者说标识符)。
    那么你可以根据4个传感器信息循环生成U控件,生成控件时设置传感器ID到U控件。
    然后传感器更新数据时,数据格式中包含传感器ID 就行了啊。
    这样U控件就能根据更新数据中的ID去判断是否更新。这是大概的思路。另外问:你是不是用了TableLayoutPanel了。
      

  9.   

    你说对了,我用TableLayoutPanel来处理布局了……因为有显示2、4、8、16这四种显示控件的模式……
      

  10.   

    Invalidate方法可局部刷新界面。
      

  11.   

    没用GDI绘制控件,只是生成的控件也可以用么?
      

  12.   

    双缓冲吧 
    tableLayoutPanel1.GetType().GetProperty("DoubleBuffered", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic).SetValue(tableLayoutPanel1, true, null);
      

  13.   

    思路很简单,你服务器端广播信息(MarshalByRefObject .net Remoting),
    客户端异步调用这个广播信息(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;
                }
            } 大概意思是这样。细节你可以网上看看。
      

  14.   

    我刷新控件的时候,不仅是刷新所有的控件,而且是所有控件都要重新生成一遍……应该是我思路的问题……
    动态创建控件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……
    动态生成的控件应该怎样找到其中的某一个呢?
      

  15.   

    接19楼:
    还有,代码中的if条件"ctrl is UCPointMachineNewStatistic"的结果是"false"……
    可是动态创建控件U方法的函数A已经执行了啊……
      

  16.   

    谢谢俊杰兄的耐心指导!
    之前的遍历之所以不成功,是因为我不知道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;
              }
         }
    }这样就能遍历整个控件并找到我想要的动态生成的那个控件了。