2014-01-09 35 views
2

我想確定用戶將一個對象放入的TableLayoutPanel的哪個單元格(行/列)。目前,我只能夠找到如何確定該項目被丟棄的座標是:確定tablelayoutpanel項目放入

Dim location As Point = TableLayoutPanel1.PointToClient(New Point(e.X, e.Y)) 

但我無法弄清楚如何定位其細胞是在我沒找到命令GetCellPosition和試圖用座標;然而,這也沒有工作。

TableLayoutPanel1.GetCellPosition(location) 

回答

3

你可以試試這個功能:

Private Function GetCellFromPoint(p As Point) As Point 
    Dim result As New Point(-1, -1) 
    Dim colWidths As Integer() = tlp.GetColumnWidths() 
    Dim rowHeights As Integer() = tlp.GetRowHeights() 
    Dim top As Integer = 0 
    For y As Integer = 0 To rowHeights.Length - 1 
    Dim left As Integer = 0 
    For x As Integer = 0 To colWidths.Length - 1 
     If New Rectangle(left, top, colWidths(x), rowHeights(y)).Contains(p) Then 
     result = New Point(x, y) 
     End If 
     left += colWidths(x) 
    Next 
    top += rowHeights(y) 
    Next 
    Return result 
End Function 

它只是通過行和列循環,看看是否在傳遞點是現有的細胞內。請注意,GetColumnWidthsGetRowHeights未顯示在智能感知下拉列表中。

用法:

Private Sub tlp_MouseMove(sender As Object, e As MouseEventArgs) _ 
          Handles tlp.MouseMove 
    Me.Text = GetCellFromPoint(e.Location).ToString 
End Sub 

順便說一句,GetCellPosition期待作爲參數,而不是一個點結構要傳遞的控制。

您也可以使用TableLayoutPanelCellPosition來代替此函數中的Point,因爲GetCellPosition正是在其函數中返回的。

0

我已經使用了這個功能(感謝百萬),但我發現了一個問題。要正確定義對象被放置的單元格,我們需要考慮TableLayoutPanel在屏幕中的位置。我已經解決了這個問題,使得p(在DragDrop事件中用e.X和e.Y構建)和r(在屏幕上的TableLayoutPanel的位置的引用)聲明。 然後,您必須分配p = p -r並將該P發送給函數GetCellFromPoint(p)。

Private Sub TableLayoutPanel1_DragDrop(sender As Object, e As DragEventArgs) Handles TableLayoutPanel1.DragDrop 
Dim p As New Point(e.X, e.Y) 
Dim r As Point 
r = TableLayoutPanel1.PointToScreen(New Point(0, 0)) 
p.X = p.X - r.X 
p.Y = p.Y - r.Y 
MessageBox.Show(GetCellFromPoint(p).ToString) 
End Sub