2012-04-03 57 views
0

我正在顯示的ListViewItems,在ListView中的ListView組中分類,顯示的只是它們的Text屬性,並截斷了它(即使它們是唯一的項目在一個特定的集團,並有屏幕房地產畝和公頃可用)。我需要顯示ListViewItems的全部文本(未截斷)

我希望他們的確可以顯示他們的Text屬性,但是完全不會被截斷。

我分配ListViewItem的Text屬性是這樣的:

public LegacyApplication(String AAppName, String ATitle, String ADesc, String AIconFileName, String APathOfExe) { 
    . . . 
    base.Text = ATitle; 
    . . . 
} 

什麼我做錯了或者沒有做對嗎?有沒有我不知道的屬性會控制ListViewItem上的文本的外觀?

回答

2

Windows資源管理器還設置修剪文本的工具提示,它也使用ListView控件。您可以通過處理MouseMove事件並使用ListView.GetItemAt(...)來找出鼠標正在移動的項目,從而模仿它的行爲。或者,您可以使用ItemMouseHover事件,但是我發現MouseMove更加用戶友好,因爲用戶不必實際懸停並等待工具提示彈出....

我使用以下邏輯來模仿Windows資源管理器行爲(此示例只是一個草案,並可能包含錯誤):

 //get the item at the current mouse location. 
    ListViewItem item = myListView.GetItemAt(e.X, e.Y); 
    if (item != null) 
    { 
     using (Graphics graphics = this.myListView.CreateGraphics()) 
     { 
      var itemTextWidth = graphics.MeasureString(item.Text, item.Font).Width; 
      if (itemTextWidth > myListView.Width) 
      { 
       if (!item.Equals(itemsToolTip.Tag) && !itemsToolTip.Active) 
       { 
       //Set the tooltip , tag it with the item and set it as active ... 
       } 
       // Adjacent ' text trimmed' list view items. 
       else if (!item.Equals(itemsToolTip.Tag)) 
       { 
       //set the tooltip as none active. 
       } 
      } 
      else//None trimmed list view items. 
      { 
       //clear the tooltip and set it as none active 
      } 
     } 
    } 
    else 
    { 
     //clear the tooltip and set it as none active 
    } 
    } 
1

如果您想在ListView中使用多行文本,請查看ObjectListView(圍繞.NET WinForms ListView的開源包裝器)。這需要處理與所有者繪圖(和其他ListView煩惱)有關的許多問題。

我把這個作爲一個評論,但它的答案,有一個可愛的截圖:Multi-line list items on WinForms ListView control?

那麼,如果您有任何疑問,請參見後續: How to wordWrap the text in a column using ObjectListView

+0

謝謝,但我們正試圖避免第三方控件 – 2012-04-04 18:32:10

+0

@ClayShannon我通常會同意100%,因爲如果你得到了第三方組件的bug並且你沒有源碼或者他們出去了的業務。但是這個ObjectListView和相關的源代碼是在GNU通用公共許可證下授權的,所以它更開源。 – 2012-04-05 00:14:25

+1

好吧,我會將它捷徑出來,看看「那些力量」是否會適合它。 – 2012-04-05 04:38:54

2

不知道這將適合你的情況,但也許你可以嘗試使用the AutoResizeColumn method;設置爲ColumnContent

+0

我試過了,但是我猜沒法得到正確的語法。我試過:if(listApplications.Groups.Count> 0){ listApplications.Groups [0] .Items [0] .AutoResizeColumn(0, ColumnHeaderAutoResizeStyle.HeaderSize); } - 但那不會編譯... – 2012-04-05 16:26:49

1

我發現最好的解決方案是使用View = View.Tile。

這顯示了文本的大部分;我的解決方法是將文本分配給每個項目的工具提示,以便在全文仍未顯示的情況下,用戶可以懸停並將其放在視線內。

2

我知道這是一個老問題,但我相信Dr.Wilys回答與AutoResizeColumn做的應該是在正確的道路上,所以探討一下...

寫入輸出到列表視圖(我的是一個批量sql的輸出服務器操作)我更新列表視圖(在這裏,lstResults)這樣的:

lstResults.AutoResizeColumn(0, ColumnHeaderAutoResizeStyle.HeaderSize); 
lstResults.AutoResizeColumn(1, ColumnHeaderAutoResizeStyle.ColumnContent); 

這個工作對我來說... NB我的視圖類型爲詳細,我沒有嘗試過其他人。