2012-08-11 105 views
0

我试图调整所有列的ListView均匀调整,它的工作原理应该,但我所做的代码是使屏幕闪烁和闪烁太多......我不知道是什么我可以修改代码以使其顺利运行吗? 这里是代码:C#调整ListView与“滞后”

using System; 
using System.Collections.Generic; 
using System.Collections; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 
using System.IO; 
using System.Runtime.InteropServices; 

namespace Test_ListViews 
{ 
    public partial class Form1 : Form 
    { 
     Double[] pesos; 
     private bool resizing = false; 
     private bool limpando = false; 

     public Form1() 
     { 
      InitializeComponent(); 

      int i = 0; 

      float dx = 96; 

      Graphics g = this.CreateGraphics(); 
      try 
      { 
       dx = g.DpiX; 
      } 
      finally 
      { 
       g.Dispose(); 
      } 

      pesos = new Double[listView1.Columns.Count]; // usado para o resize das colunas da ListView ser proporcional. 
      for (i = 0; i < listView1.Columns.Count; i++) 
       pesos[i] = ((Double)listView1.Columns[i].Width * dx)/(listView1.Width * 96); 
      _listView1_Resize(); 

      listView1.FullRowSelect = true; 

      this.listView1.Resize += new System.EventHandler(this.listView1_Resize); 
      this.listView1.ColumnWidthChanged += new System.Windows.Forms.ColumnWidthChangedEventHandler(this.listView1_ColumnWidthChanged); 
     } 

     private void bntFill_Click(object sender, EventArgs e) 
     { 
      int i = 0; 

      for (i = 0; i < 5; i++) 
      { 
       ListViewItem item = new ListViewItem("Test 1"); 
       item.SubItems.Add("Test 2"); 
       item.SubItems.Add("Test 3"); 
       item.SubItems.Add("Test 4"); 
       item.SubItems.Add("Test 5"); 
       item.SubItems.Add("Test 6"); 
       item.SubItems.Add("Test 7"); 
       item.SubItems.Add("Test 8"); 
       item.SubItems.Add("Test 9"); 
       listView1.Items.Add(item); 
      }    

      SetWindowTheme(listView1.Handle, "Explorer", null); 
     } 

     [DllImport("uxtheme.dll")] 
     public static extern int SetWindowTheme([In] IntPtr hwnd, [In, MarshalAs(UnmanagedType.LPWStr)] string pszSubAppName, [In, MarshalAs(UnmanagedType.LPWStr)] string pszSubIdList); 

     private void btnDelete_Click(object sender, EventArgs e) 
     { 
      ArrayList list = new ArrayList(); 

      foreach(ListViewItem item in listView1.SelectedItems) 
      { 
       list.Add(item); 
      } 

      foreach (ListViewItem item in list) 
      { 
       listView1.Items.Remove(item); 
      } 
     } 

     private void listView1_Resize(object sender, System.EventArgs e) 
     { 
      _listView1_Resize(); 
     } 
     private void _listView1_Resize() 
     { 
      if (resizing == false && pesos != null) 
      { 
       resizing = true; 

       Int32 largura = listView1.Width; 
       int i = 0; 


       for (i = 0; i < listView1.Columns.Count; i++) 
       { 
        listView1.Columns[i].Width = Convert.ToInt32(pesos[i] * largura); 
       } 

       if (listView1.Controls.Count > 0) 
       { 
        Int32 x = listView1.Items[0].SubItems[listView1.Items[0].SubItems.Count - 1].Bounds.Location.X + 3;//pegando a referencia da ultima coluna. 

        for (i = 0; i < listView1.Controls.Count; i++) 
        { 
         listView1.Controls[i].Location = new System.Drawing.Point(x, listView1.Controls[i].Location.Y); 
         listView1.Controls[i].Width = listView1.Columns[listView1.Columns.Count - 1].Width - 9; 
        } 
       } 

       if (listView1.Items.Count > 8) 
       { 
        listView1.Columns[listView1.Columns.Count - 1].Width -= 10; 
       } 

       listView1.Scrollable = false; 
       listView1.Scrollable = true; 

       resizing = false; 
      } 

      SetWindowTheme(listView1.Handle, "Explorer", null); 

     } 

     private void listView1_ColumnWidthChanged(object sender, ColumnWidthChangedEventArgs e) 
     { 
      _listView1_Resize(); 
      //int i = 0; 
      //for (i = 0; i < listView1.Columns.Count; i++) 
      //{ 
      // if (listView1.Columns[i].Width < 20) 
      //  listView1.Columns[i].Width = 20; 
      //} 
     } 

    }  
} 

谢谢!!

回答

1

在调整操作呼叫开始listView1.BeginUpdate(),然后调用listView1.EndUpdate()当您完成

这样,窗户就不会在每次更改向它提出的时间重绘控制,或者它的任何儿童和当您调用EndUpdate()时,将重新绘制它们全部一次()

+0

Woow!好多了,谢谢你Ben! 它仍然有一点点闪烁,但我猜它预期的权利?或者我可以进一步改进它? – mFeinstein 2012-08-12 00:36:18

+0

在任何操作的开始和结束时,您肯定会呼叫任何循环之外的人?它应该只是一瞬间,然后它看起来像新的......如果你仍然按住鼠标拖动,并且在调整大小的过程中重画,看起来每次调用resize事件时都会闪烁应用程序,我猜?看看下面的堆栈溢出问题,特别是围绕SetStyle的东西,无论你启用双缓冲或在调整大小期间关闭绘图,尽管直到你 – 2012-08-12 02:09:43

+0

是的,我按住鼠标并拖动屏幕,所以resize事件越来越多被称为“跟随堆溢出问题”的那个? – mFeinstein 2012-08-12 03:44:05