2013-12-19 21 views
5

我想添加一個體面的AutoResize機制到我的列表視圖,但我不知道該怎麼做。爲Listview列實現一個不錯的自動調整機制?

我設定的最後一列自動調整itselfs當窗體調整大小:

Private Sub Form1_Resize(sender As Object, e As EventArgs) _ 
Handles MyBase.Resize 

    ColumnDownload.AutoResize(ColumnHeaderAutoResizeStyle.HeaderSize) 

End Sub 

但這本地自動調整大小的方法是錯的,因爲當我調整應用程序,顯示水平滾動條:

enter image description here

enter image description here

Ofcourse如果我選擇我自己用鼠標次e最後一列分隔符增加列寬,然後我想看到/使用水平滾動條,但框架自動調整大小隻是自動增加顯示水平滾動條的大小,非常難看,不需要在調整窗體大小時自動顯示該滾動條!

的樣子,我會就像JDownloader和一切好節目了,一個自動調整時停止正好在垂直滾動條的開始,而不顯示,如果沒有必要的醜陋水平滾動條,例如像這樣:

enter image description here

我希望你能理解我的問題。

編輯:

'神奇的解決方案' 像這樣的:

MyColumnHeader.Width = -2 
MyColumnHeader.Width = -1 

...是否相同。在這裏看到很好的文章:http://visualbasic.about.com/od/quicktips/qt/ListViewQT.htm

真的所有關於在.NET中調整Listview大小的Google搜索結果都使用它,任何比例調整大小或替代方法,任何體面的自動縮放器,令人難以置信。

+0

編寫代碼來調整每個列的大小,與控件的新寬度成比例** less **垂直滾動的寬度。 OnSizeChanged也許,重置每列寬度然後調用Invalidate。可能還需要一個'rectOldSize'來做比例部分。 – Plutonix

+0

調整應用程序的大小時,這些大小如何調整?正在使用TableLayoutPanel或gobs的代碼?我有一個VScrolls出現的過程,但我不確定這是否是你以後的(或者如果它與TLP一起工作,或TLP對寬度有什麼影響)。 – Plutonix

+0

'調整應用程序的大小時,這些大小是如何調整的?'我詳細介紹了用於調整最後一列大小的(怪異)方法,當我調整應用程序的大小時,我也展示了'LV'的方面。上面的圖片,所有必要的信息在問題中,沒有更多的代碼。我沒有使用'TLP',當Form被調整大小時,我使用'Anchor'屬性來調整'LV'的大小。我認爲一個知道什麼時候VSCroll出現的函數不能幫助我做任何事情,一個完美的解決方案(夢想是免費的)可以是使用ObjectListView來按比例調整大小以便通用的大小的代碼。 – ElektroStudios

回答

4

ObjectListView,一個.NET ListView的開源包裝器,有一個FillsFreeSpace屬性,它正是這樣做的。

隨着用戶調整控件的大小,該列將變得更大或更小,從而不會顯示水平滾動條。執行正確的話相對比較複雜:)

請參閱this link瞭解更多詳情。

[編輯]

基本方案:

  1. 請收聽的ListView Resize事件。
  2. 計算除最後一列以外的所有列的寬度
  3. 將最後一列的大小調整爲其他列的寬度和ListView的ClientSize的差值。

這將工作:

private void ResizeLastColumn(int listViewWidth) 
{ 
    int totalColumnWidth = 0; 
    for (int i =0 ; i < listView1.Columns.Count - 1; i++) { 
     totalColumnWidth += listView1.Columns[i].Width; 
    } 

    colLast.Width = Math.Max(listViewWidth - totalColumnWidth, 10); 
} 

private void listView1_Resize(object sender, EventArgs e) 
{ 
    ResizeLastColumn(this.listView1.ClientSize.Width); 
} 

這個限制是萎縮的控制時,水平滾動條會出現輕微閃爍現象。要繞過,您需要截取WM_WINDOWPOSCHANGING消息,並將列的大小調整爲控制爲將變爲的大小。這有些複雜 - 而且正是ObjectListView的作用:)

+0

我欣賞這些信息,但抱歉對我來說不是一個可行的方法,使用ObjectListView意味着編寫一個1000行的模型類只需將1個字符串項添加到ListView,並替換所有我寫的Listview事物以將它們轉換爲ObjectListview。另外我使用由我設計的自定義列表視圖用戶控件,只是我無法使用它,對於任何種類的項目都有任何容易的方式。通過源代碼中的方式,我試圖找到FillsFreeSpace方法來理解和複製/複製它們,但C#代碼太複雜了C#我是VBNET程序員我只知道C#的基礎知識。再次感謝 – ElektroStudios