我做了一个用户控件,在一个winform上根据表的行数动态增加用户控件,一行就一个用户控件,但当这个表有几百行数据时,刷新数据还没什么问题,但是窗体一失去焦点再获得焦点时,窗体的用户控件才一个个的出现,几百个用户控件一个一个的出现这个问题太严重了!各位高手有什么绝招教教!

解决方案 »

  1.   

    因为我做的用户控件是用来显示监控数据的!所以每一个控件都是每一个人的工作实时情况,所以监控的人多了控件也就多了!现在我的用户控件只有3个panel,4个label和一个textbox,我用手动拖了100个左右的用户控件出来,就是不接受数据,切换一下焦点的时候,也会慢慢才显示出来!
      

  2.   

    直接用ListView等列表控件来显示吧;
      

  3.   

    用datagridview的我已经做了!现在这个用控件做的就是一个监控地图!
      

  4.   

    private void Form1_Deactivate(object sender, EventArgs e)
            {
                this.SuspendLayout();
            }
            
            private void Form1_Activated(object sender, EventArgs e)
            {
                this.ResumeLayout();
            }
            
      

  5.   

    最好是自己写一个自定义的控件。用gdi+来控制界面你每天加一个控件,就是添加了一个wind对象。
    根据windows的消息循环协议。没一个wind都有自己的运行空间,超过一定数量以后,机器就会吃不消的。很久没看了,大概就是这个意思。
      

  6.   

    那这样
            public Form1()
            {
                InitializeComponent();            this.SetStyle(ControlStyles.OptimizedDoubleBuffer |
                    ControlStyles.AllPaintingInWmPaint |
                    ControlStyles.UserPaint
                    , true); 
            }
      

  7.   

    改变你的设计思路,不要把数据与控件绑定。
    参考Window的List控件的Virtual List-View设计方法数据由自己单独管理,画面当前显示哪些行列的数据在需要显示的时候向这个数据池获取
    比如:
    画面当前只能显示30行5列,当前第一行第一列是这个数据池中的第20个人的第3种状态
    那么在数据池中就存在一个偏移起始点(20,3)也就是说画面的第一行第一列这个时候显示的是数据池中的第20行第3列数据
    如果画面进行了卷动,比如向上滚动一行,那么这个时候第一行第一列显示的数据就是第19行第3列以此类推,因为画面上只有30行5列的空间,你永远只需要记住第一行第一列在数据池中对应的位置,其他的数据根据偏移累加计算即可
      

  8.   

    你这个情况不适合用Windows控件,需要自己绘制比较好。
    你使用了Panel,Label,TextBox控件
    基本上Panel就是绘制边框,Label就是做TextOut输出,而TextBox则有两态,一种状态是非输入状态,也就是没有焦点,那么可以和Label一样处理做TextOut输出来替代,另外一种状态是输入态,需要用真正的TextBox
    如果这样设计,那么你只需要一个TextBox控件,其他的都用GDI/GDI+的绘制来替代,速度会很快,再记得用双缓冲技术避免闪烁即可
      

  9.   

    GDI/GDI+的绘制还没试过,我这个用户控件是用来显示文字和图片,而且有时也会根据状态的不同,边框的颜色和框内颜色也会相应的变化!而且改变也频繁!
    如果用GDI/GDI+能不能实现这些功能啊,难度大不大啊?
      

  10.   

    不同颜色的点也可以  ToolTip来显示概要也可以
    有必要一次放几百个usercontrol在form上?
      

  11.   


    //双缓冲防止闪烁
                SetStyle(ControlStyles.DoubleBuffer | ControlStyles.OptimizedDoubleBuffer | ControlStyles.AllPaintingInWmPaint, true);
                UpdateStyles();
      

  12.   

    这个我已经用过是!我是放在构造函数里和load事件里!
    但是没看出来和原来有什么不同!
    是不是要放在其他地方的啊!
      

  13.   

    GDI+自己画。这个是没办法的。你说的那些东西都是可以自己封装的。从control继承就意味着在界面中重绘会造成很大的开销。
      

  14.   

    把你的控件改成GDI绘制并不需要很多的工作量
    因为你的控件既然是动态生成的,那么所有的控件的位置数据都是已经有的了
    剩下的问题只是在绘制的响应函数中添加一个对所有的数据进行绘制的函数这个函数中根据位置进行绘制,而不是生成控件另外需要处理的就是获得焦点的数据需要生成一个动态的TextBox,这个把原来动态生成控件的代码稍微改动一下就可以了这种代码初步的重构完成大概只需要一天不到的时间
    不过如果你没有用过GDI或者GDI+,那么需要计算你学习GDI相关内容的时间测试去除BUG稳定功能再+一天的时间,差不多也就2~3天的时间就可以全部搞定。
      

  15.   

    如果你们有熟手熟悉GDI或GDI+的操作,那么这些转换工作一天都不用就可以搞定
      

  16.   

    那么请问那有一些比较简单的GDI或GDI+的列子啊!