2011-01-26 67 views
10

我有面對listview列調整大小的問題。如果你的主播/對接的listview比正常的winform比listview的主播或者對接效果還好。我的意思是listview會調整大小,並適合winforms作爲winforms最大化,但你已經設計的列,而不是與listview調整大小。調整ListView列以適應WinForms

我的問題是:有什麼辦法來調整列表視圖的列與列表視圖以適應winform的大小?

列表視圖設計規範:

private void Form1_Load(object sender, EventArgs e) 
    { 

     listView1.View = View.Details; 
     listView1.LabelEdit = true; 
     listView1.BackColor = Color.GreenYellow; 
     listView1.Columns.Add("Date", 100, HorizontalAlignment.Left); 
     listView1.Columns.Add("TransID", 50, HorizontalAlignment.Left); 
     listView1.Columns.Add("voucher", 100, HorizontalAlignment.Right); 
     listView1.Columns.Add("particulars", 300, HorizontalAlignment.Left); 
     listView1.Columns.Add("deposit", 100, HorizontalAlignment.Right); 
     listView1.Columns.Add("withdrawal", 100, HorizontalAlignment.Right); 

     string connstr = "server=.;initial catalog=DataBase;uid=UID;pwd=PWD"; 
     SqlConnection con = new SqlConnection(connstr); 
     con.Open(); 
     listView1.Items.Clear(); 
     listView1.Refresh(); 
     string sql = "select date=convert(varchar,date,103),transID,max(particulars)as particulars,sum(deposit)as deposit,sum(withdrawal) as withdrawal,voucher from debank group by date,transID,voucher"; 
     SqlCommand cmd = new SqlCommand(sql, con); 
     SqlDataAdapter dap = new SqlDataAdapter(cmd); 
     DataSet ds = new DataSet(); 
     dap.Fill(ds); 
     DataTable dt = ds.Tables[0]; 

     for (int i = 0; i < dt.Rows.Count; i++) 
     { 
      DataRow dr = dt.Rows[i]; 
      ListViewItem lvi = new ListViewItem(dr["date"].ToString()); 
      lvi.SubItems.Add(dr["transID"].ToString()); 
      lvi.SubItems.Add(dr["voucher"].ToString()); 
      lvi.SubItems.Add(dr["particulars"].ToString()); 
      lvi.SubItems.Add(dr["deposit"].ToString()); 
      lvi.SubItems.Add(dr["withdrawal"].ToString()); 
      listView1.Items.Add(lvi); 
      listView1.FullRowSelect = true; 

     } 

     SizeLastColumn(listView1); 


    } 

回答

27
  1. 程序化的。你必須在代碼中維護它。
  2. 您可以調整列表視圖中的最後一列大小,以便它自動調整大小。 網樣本:

ListView控件,以查看 屬性設置爲詳細信息,您可以 創建多列輸出。 有時你會希望列表視圖的最後一個 列自己調整其大小 佔用所有剩餘空間。您可以通過將列 寬度設置爲魔術值-2來完成此操作。

在下面的例子中, ListView控件的名稱是lvSample:

[c#] 
private void Form1_Load(object sender, System.EventArgs e) 
{ 
    SizeLastColumn(lvSample); 
} 

private void listView1_Resize(object sender, System.EventArgs e) 
{ 
    SizeLastColumn((ListView) sender); 
} 

private void SizeLastColumn(ListView lv) 
{ 
    lv.Columns[lv.Columns.Count - 1].Width = -2; 
} 

編輯:

Programaticaly你可以做到這一點與自己的實現算法。問題是列表視圖不知道你想調整什麼樣的列,哪些不是。因此,您需要在resize方法(或resizeEmd方法)中指定所有列大小更改。因此,您計算列表視圖的所有寬度,然後按比例分配所有列之間的值。 你的列寬是多到50.因此,你的整個列表視圖寬度爲15 *х(x = 50,默認狀態下,我根據你的列數和它們的寬度計算15值)常規單位。當窗體的大小時,就可以計算出新的x = ListView.Width/15,然後每列的寬度設置爲需要的值,所以

private void SizeLastColumn(ListView lv) 
{ 
int x = lv.Width/15 == 0 ? 1 : lv.Width/15; 
lv.Columns[0].Width = x*2; 
lv.Columns[1].Width = x; 
lv.Columns[2].Width = x*2; 
lv.Columns[3].Width = x*6; 
lv.Columns[4].Width = x*2; 
lv.Columns[5].Width = x*2; 
} 
+0

@LexRema,我用Listview Design編輯了我的問題。您的代碼對調整大小的問題進行排序,但前四列和最後一列的其餘列保持較長的距離。 – mahesh 2011-01-26 09:45:09

+0

@LexRema,如何解決其餘四個以前的列距離問題? – mahesh 2011-01-26 09:57:15

2

描述here您可以通過內容調整列寬或者你要聽的一個ListView的Resize事件和設置運行時的列大小。

9

這是我的解決方案;

而不是調整大小事件我更喜歡resizeEnd的形式,以便代碼將在調整大小完成後只運行一次。

private void Form1_ResizeEnd(object sender, EventArgs e) 
{ 
    this.ResizeColumnHeaders(); 
} 

ResizeColumnHeaders函數設置除最後一列以外的所有列以適應列內容。最後一列將使用LexRema暗示的魔法值。

private void ResizeColumnHeaders() 
{ 
    for (int i = 0; i < this.listView.Columns.Count - 1;i++) this.listView.AutoResizeColumn(i, ColumnHeaderAutoResizeStyle.ColumnContent);   
    this.listView.Columns[this.listView.Columns.Count - 1].Width = -2; 
} 

另外不要忘記在加載初始數據後調用ResizeColumnHeaders()

private void Form1_Load(object sender, EventArgs e) 
{    
    this.LoadEntries(); 
    this.ResizeColumnHeaders(); 
} 

還有一件事是防止閃爍,而列調整大小,你需要雙緩衝列表視圖。

public Form1() 
{ 
    InitializeComponent();    
    this.listView.DoubleBuffer();    
} 

雙緩衝()實際上是易於使用的擴展。

public static class ControlExtensions 
{ 
    public static void DoubleBuffer(this Control control) 
    { 
     // http://stackoverflow.com/questions/76993/how-to-double-buffer-net-controls-on-a-form/77233#77233 
     // Taxes: Remote Desktop Connection and painting: http://blogs.msdn.com/oldnewthing/archive/2006/01/03/508694.aspx 

     if (System.Windows.Forms.SystemInformation.TerminalServerSession) return; 
     System.Reflection.PropertyInfo dbProp = typeof(System.Windows.Forms.Control).GetProperty("DoubleBuffered", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance); 
     dbProp.SetValue(control, true, null); 
    } 
} 
0

使用本

Private Sub ListView1_Resize(sender As Object, e As EventArgs) Handles ListView1.Resize 
    Dim k = ListView1.Width - 10 
    Dim i = k/3 
    ListView1.Columns(0).Width = k - i 
    ListView1.Columns(1).Width = i/2 
    ListView1.Columns(2).Width = i/2 
End Sub 

三列 一個更大的兩次與相同尺寸

2

一個簡單的解決方案,需要一個ListView和要自動調整列的索引較小,所以整個列表視圖的客戶區的大小被用於最後一個像素,不多也不少,即,即使調整大小也不會出現醜陋的水平滾動條,從而使控制變得更小。

你想從你的調整大小事件處理函數調用此方法,並且如果將一個元素後也增加更多的線比對照有空間用於垂直後垂直滾動條出現。

我不同意在ResizeEnd事件上作出反應的想法,正如其他帖子中提到的一樣,因爲如果Windows設置爲在移動和調整大小時繪製窗口,屏幕上看起來不太好。計算速度很快,所以不會產生任何問題來不斷調整大小。

static private void ResizeAutoSizeColumn(ListView listView, int autoSizeColumnIndex) 
{ 
    // Do some rudimentary (parameter) validation. 
    if (listView == null) throw new ArgumentNullException("listView"); 
    if (listView.View != View.Details || listView.Columns.Count <= 0 || autoSizeColumnIndex < 0) return; 
    if (autoSizeColumnIndex >= listView.Columns.Count) 
    throw new IndexOutOfRangeException("Parameter autoSizeColumnIndex is outside the range of column indices in the ListView."); 

    // Sum up the width of all columns except the auto-resizing one. 
    int otherColumnsWidth = 0; 
    foreach (ColumnHeader header in listView.Columns) 
    if (header.Index != autoSizeColumnIndex) 
     otherColumnsWidth += header.Width; 

    // Calculate the (possibly) new width of the auto-resizable column. 
    int autoSizeColumnWidth = listView.ClientRectangle.Width - otherColumnsWidth; 

    // Finally set the new width of the auto-resizing column, if it has changed. 
    if (listView.Columns[autoSizeColumnIndex].Width != autoSizeColumnWidth) 
    listView.Columns[autoSizeColumnIndex].Width = autoSizeColumnWidth; 
}