2014-01-14 3 views
1

У меня есть элемент управления Treeview и listbox на форме. Отбрасывание элементы из TreeView на ListBox обрабатывается с помощью следующего метода:TableLayoutControl DragNDrop Issue

void ListBoxDrop(Dictionary<string, string> datasource, DragEventArgs e) 
     { 
      // Retrieve the client coordinates of the drop location. 
      Point targetPoint = this.PointToClient(new Point(e.X, e.Y)); 

      // Retrieve the listBox at the drop location. (This is where it sees a TableLayoutControl)  
      object controlAtPoint = this.GetChildAtPoint(targetPoint); 
      if (!(controlAtPoint is ListBox)) 
       return; 

      ListBox targetListbox = this.GetChildAtPoint(targetPoint) as ListBox; 

      // Retrieve the node that was dragged. 
      TreeNode draggedNode = (TreeNode)e.Data.GetData(typeof(TreeNode)); 

      // Only add the item if it doesnt already exist in the list.    
      if (!datasource.ContainsKey(draggedNode.Tag.ToString())) 
      { 
       datasource.Add(draggedNode.Tag.ToString(), draggedNode.Text); 
      } 
     } 

Вопрос в том, когда я перетащить TableLayoutPanel из контейнеров инструментов на мою форму, а затем переместить ListBox в одну из ячеек TableLayoutPanel. Что происходит сейчас, когда перетаскивание из TreeView в Listbox заключается в том, что this.GetChildAtPoint (targetPoint) возвращает ссылку управления TableLayoutPanel вместо элемента управления ListBox.

Есть ли способ получить this.GetChildAtPoint, чтобы вернуть список вместо его управления контейнером?

Dankie

ответ

2

Вы должны изменить ваши this контролю TableLayoutPanel:

Point targetPoint = tlp.PointToClient(new Point(e.X, e.Y)); 
object controlAtPoint = tlp.GetChildAtPoint(targetPoint); 
if (!(controlAtPoint is ListBox)) 
    return; 
ListBox targetListbox = tlp.GetChildAtPoint(targetPoint) as ListBox; 
+0

Это сделал трюк. Благодарю. – TheLegendaryCopyCoder

1

GetChildAtPoint() не делает то, что вы надеетесь, что он делает. Он не выполняет итерацию через вложенные элементы управления и не находит самый глубокий вложенный элемент управления. Он смотрит только на детей , ваша форма. Таким образом, возвращение TableLayoutPanel является ожидаемым результатом.

Так может перебирать его самостоятельно, как это:

Control box = this; 
    do { 
     var targetPoint = box.PointToClient(new Point(e.X, e.Y)); 
     box = box.GetChildAtPoint(targetPoint); 
     if (box == null) return; 
    } while (!(box is ListBox)); 
+0

Спасибо за объяснение и код Ганс. – TheLegendaryCopyCoder

Смежные вопросы