none
winform 下 treeview 以及 panel 的闪烁问题 RRS feed

  • 问题

  • 在this.splitContainer.panel1 中放置treeview控件。在this.splitContainer.panel2中放置三个panel控件。想点击treeView控件中不同的节点显示不同的panel. 这三个panel控件的Name分别为panel_jinTianJiaoFangZhuZhe ,panel_chaXun ,panel_tuiFang . 且panel_jinTianJiaoFangZhuZhe .controls.Add(panel_tuiFang );   panel_tuiFang  .controls.Add(panel_chaXun )代码如下:

    private void treeView1_AfterSelect(object sender, TreeViewEventArgs e)
            {
                if (e.Node.Text == "今天该交房租的人".Trim())
                {
                                    
                    this.splitContainer1.Panel2.Controls.Clear();
                    this.panel_jinTianJiaoFangZhuZhe.Controls.Remove(this.panel_tuiFang);
                   
                    this.splitContainer2.Panel2.Controls.Add(this.panel_jinTianJiaoFangZhuZhe );
                   

                }
                 else if (e.Node.Text == "空房间查询".Trim())
                {
                     this.splitContainer1.Panel2.Controls.Clear();
                                   
                    this.splitContainer2.Panel2.Controls.Add(this.panel_chaXun );
                }
                else if (e.Node.Text == "退房".Trim())
                {
                     this.splitContainer1.Panel2.Controls.Clear();
                    this.panel_tuiFang.Controls.Remove(this.panel_chaXun);
                    this.splitContainer2.Panel2.Controls.Add(this.panel_tuiFang );
                 }
          }

    功能是实现了,但美中不足的是有闪烁。

    还请各位帮我看看怎么解决闪烁的问题。谢谢!


    心悟成佛,心迷成魔.
    2010年8月7日 0:31

答案

  • 你好!

        这个问题通常无法通过开启双缓冲来解决,你可以通过减少重绘的次数来解决:

      treeView1.BeginUpdate();
    
      // 把你更新的代码写在这里;
     treeView1.Nodes.Clear();


    周雪峰
    2010年10月21日 9:16
    版主

全部回复

  • 如果你说的闪烁是先clear然后添加控件那次,这个是无法避免的。你本身就是先删除后添加,肯定会闪烁一下的。除非你将方法改为不删除,直接判断里面的控件是否有过修改,如果修改了,只刷新修改的那个控件。
    而且这个闪烁是很微小的,只会闪烁一下,对程序影响不是很大。

    如果你说的是因为控件颜色设置为透明而产生的不断刷新问题,那么建议你先尽量减少使用透明颜色,然后在透明颜色的地方用双缓存DoubleBuffer试试看。
    2010年8月9日 3:01
    版主
  • 你好,那按你的说的刷新,那可以实现更换panel的目的吗?


    心悟成佛,心迷成魔.
    2010年8月9日 6:51
  • 在this.splitContainer.panel1 中放置treeview控件。在this.splitContainer.panel2中放置三个panel控件。想点击treeView控件中不同的节点显示不同的panel. 这三个panel控件的Name分别为panel_jinTianJiaoFangZhuZhe ,panel_chaXun ,panel_tuiFang . 且panel_jinTianJiaoFangZhuZhe .controls.Add(panel_tuiFang );   panel_tuiFang  .controls.Add(panel_chaXun )代码如下:

    private void treeView1_AfterSelect(object sender, TreeViewEventArgs e)
            {
                if (e.Node.Text == "今天该交房租的人".Trim())
                {
                                    
                    this.splitContainer1.Panel2.Controls.Clear();
                    this.panel_jinTianJiaoFangZhuZhe.Controls.Remove(this.panel_tuiFang);
                   
                    this.splitContainer2.Panel2.Controls.Add(this.panel_jinTianJiaoFangZhuZhe );

                }
                 else if (e.Node.Text == "空房间查询".Trim())
                {
                     this.splitContainer1.Panel2.Controls.Clear();
                                   
                    this.splitContainer2.Panel2.Controls.Add(this.panel_chaXun );
                }
                else if (e.Node.Text == "退房".Trim())
                {
                     this.splitContainer1.Panel2.Controls.Clear();
                    this.panel_tuiFang.Controls.Remove(this.panel_chaXun);
                    this.splitContainer2.Panel2.Controls.Add(this.panel_tuiFang );
                 }
          }

    功能是实现了,但美中不足的是有闪烁。

    还请各位帮我看看怎么解决闪烁的问题。谢谢!


    心悟成佛,心迷成魔.
    dear,
    因位是动态增加删除控制项,所以可先停止更新窗口

    1.先使用Control.SuspendLayout 方法,临时挂起控件的布局逻辑。
    2.然后再使用控件的Control.ResumeLayout 方法,布局逻辑被挂起。

    //依照你的的控件停止更新
    treeView1.SuspendLayout();
    //配置动作完成后
    treeView1.ResumeLayout();

    详情请参考官网
    http://msdn.microsoft.com/zh-cn/library/system.windows.forms.control.suspendlayout.aspx
    http://msdn.microsoft.com/zh-cn/library/system.windows.forms.control.resumelayout.aspx


    秘訣無它,唯勤而已
    2010年10月10日 11:58
  • 你好!

        这个问题通常无法通过开启双缓冲来解决,你可以通过减少重绘的次数来解决:

      treeView1.BeginUpdate();
    
      // 把你更新的代码写在这里;
     treeView1.Nodes.Clear();


    周雪峰
    2010年10月21日 9:16
    版主
  • dear

    下列連結將演練如何設置DoubleBuffered
    http://www.dotblogs.com.tw/yc421206/archive/2010/10/20/18472.aspx

    PropertyInfo info = this.GetType().GetProperty("DoubleBuffered", BindingFlags.Instance | BindingFlags.NonPublic);
    info.SetValue(treeview, true, null);
    

     

     


    秘訣無它,唯勤而已
    2010年10月21日 10:49