我正在尋找一種簡單的方法來確定WinForms DataGridViewCell.Value是否在其單元格中完全可見。如何檢測winforms DataGridViewCell.Value是否在其單元格中完全可見?
如果該列太窄,只有部分值可見,我需要在代碼中檢測到這種情況。
到目前爲止,我在想,我可以將內容的寬度(Graphics.MeasureString)與單元格的寬度進行比較,但似乎有點笨重。
尋找一些更優雅的東西,如果可能的話。
感謝
我正在尋找一種簡單的方法來確定WinForms DataGridViewCell.Value是否在其單元格中完全可見。如何檢測winforms DataGridViewCell.Value是否在其單元格中完全可見?
如果該列太窄,只有部分值可見,我需要在代碼中檢測到這種情況。
到目前爲止,我在想,我可以將內容的寬度(Graphics.MeasureString)與單元格的寬度進行比較,但似乎有點笨重。
尋找一些更優雅的東西,如果可能的話。
感謝
從看source code for DataGridViewCell,它看起來像.NET團隊決定使用TextRenderer MeasureText函數,而不是圖形MeasureString函數(見線2924)。這不是你正在尋找的東西,但它看起來會不那麼笨重,然後不得不檢索一個圖形對象。
除此之外,我不相信有一種方式來確定是否文本單元格是否截斷值。這可能與性能有關。 DataGrid不會爲每個單元格存儲單獨的單元格對象...這對於大型數據集來說將會過於耗費內存。相反,它根據需要存儲樣式信息(通常針對整列,儘管您可以根據需要覆蓋特定單元格的樣式數據)以及單元格值(在巨大的對象數組中)。在渲染單元格時,它會爲列中的每個單元格重複使用同一個單元格對象(使用不同的單元格大小和值等重複調用Paint)。只有在渲染過程中才會知道內容是否過長,但它幾乎立即拋出這些信息(無處存儲,渲染後無需存儲)。
我想.NET團隊可能已經創建了一個函數來爲你做所有的測量等,但是然後又有a lot of features that could have been implemented。這一個不是。
感謝你。使用TextRenderer工作(沒有遇到過),如你所說,比檢索一個Graphics對象更笨拙。 – ChrisA
只是一個想法..
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
我相信OP正在尋找MeasureString以外的答案。 *「到目前爲止,我認爲我可以將內容的寬度(使用Graphics.MeasureString)與單元格的寬度進行比較,但是看起來有點笨拙,如果可能的話,尋找更優雅的東西。」 ,創建一個PictureBox涉及各種不必要的開銷。如果你打算走這條路線,它可能會更好[創建一個位圖](http://msdn.microsoft.com/en-us/library/5y289054.aspx#sectionToggle3)。 – JDB
@ Cyborgx37:你是對的..這只是一個想法.. picbox只適用於Creategraphics的方法..我敢肯定有更好的主意比這.. – matzone
使用[Graphics.MeasureString](http://msdn.microsoft.com/en-us/library/6xe5hazb.aspx)。 – Neolisk
啊是的,我的意思是MeasureString,而不是DrawString,哎呀!編輯問題!謝謝。 – ChrisA
我認爲MeasureString是你最好的選擇。 – Neolisk