2013-05-15 43 views
2

我正在尋找一種簡單的方法來確定WinForms DataGridViewCell.Value是否在其單元格中完全可見。如何檢測winforms DataGridViewCell.Value是否在其單元格中完全可見?

如果該列太窄,只有部分值可見,我需要在代碼中檢測到這種情況。

到目前爲止,我在想,我可以將內容的寬度(Graphics.MeasureString)與單元格的寬度進行比較,但似乎有點笨重。

尋找一些更優雅的東西,如果可能的話。

感謝

+1

使用[Graphics.MeasureString](http://msdn.microsoft.com/en-us/library/6xe5hazb.aspx)。 – Neolisk

+1

啊是的,我的意思是MeasureString,而不是DrawString,哎呀!編輯問題!謝謝。 – ChrisA

+0

我認爲MeasureString是你最好的選擇。 – Neolisk

回答

0

從看source code for DataGridViewCell,它看起來像.NET團隊決定使用TextRenderer MeasureText函數,而不是圖形MeasureString函數(見線2924)。這不是你正在尋找的東西,但它看起來會不那麼笨重,然後不得不檢索一個圖形對象。

除此之外,我不相信有一種方式來確定是否文本單元格是否截斷值。這可能與性能有關。 DataGrid不會爲每個單元格存儲單獨的單元格對象...這對於大型數據集來說將會過於耗費內存。相反,它根據需要存儲樣式信息(通常針對整列,儘管您可以根據需要覆蓋特定單元格的樣式數據)以及單元格值(在巨大的對象數組中)。在渲染單元格時,它會爲列中的每個單元格重複使用同一個單元格對象(使用不同的單元格大小和值等重複調用Paint)。只有在渲染過程中才會知道內容是否過長,但它幾乎立即拋出這些信息(無處存儲,渲染後無需存儲)。

我想.NET團隊可能已經創建了一個函數來爲你做所有的測量等,但是然後又有a lot of features that could have been implemented。這一個不是。

+0

感謝你。使用TextRenderer工作(沒有遇到過),如你所說,比檢索一個Graphics對象更笨拙。 – ChrisA

0

只是一個想法..

Function IsFit() as Boolean 
    Dim szDummy As New SizeF 

    dim picDummy as New Picturebox '--> or refer to your picbox 
    gDummy = Me.picDummy.CreateGraphics 
    szDummy = gDummy.MeasureString(column value , New Font(FontName, _ 
      FontSize, FontStyle, graphicUnitPixel)) 

    if szDummy.Width >= MyDataGrid.Columns(column name).Width then return True 

End Function 
+0

我相信OP正在尋找MeasureString以外的答案。 *「到目前爲止,我認爲我可以將內容的寬度(使用Graphics.MeasureString)與單元格的寬度進行比較,但是看起來有點笨拙,如果可能的話,尋找更優雅的東西。」 ,創建一個PictureBox涉及各種不必要的開銷。如果你打算走這條路線,它可能會更好[創建一個位圖](http://msdn.microsoft.com/en-us/library/5y289054.aspx#sectionToggle3)。 – JDB

+0

@ Cyborgx37:你是對的..這只是一個想法.. picbox只適用於Creategraphics的方法..我敢肯定有更好的主意比這.. – matzone

相關問題