2012-08-11 37 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