2013-05-28 2 views
1

Есть ли способ получить доступ к панели результатов запроса визуальной студии из Addin?Программный доступ к области результатов запроса для визуальной студии от добавления

Я не имею в виду окно запроса из меню - Data - Transact SQL Editor - новый запрос. Я думаю от сервера исследовать - расширить некоторые базы данных - развернуть таблицы, щелкнуть правой кнопкой мыши по таблице и выбрать новый запрос. После того, как вы выберете, какие таблицы будут включены, проверьте пару столбцов и выберите выполнить. Откроется новое окно. Это окно - это класс Document, который я знаю, но не могу получить содержимое элементов управления или панелей или даже панелей из этого класса. Внизу вы можете увидеть панель со строками и столбцами.

Мне нужно получить доступ к этой панели или управлению сеткой, если это возможно. Или еще лучше как-то пересмотреть отражение, чтобы получить значение ячейки выбранной ячейки в этом окне результатов запроса?

Я уже построил addin для VS, но не смог получить значение ячейки из этой сетки. Пробовал с отражением, но не может дойти до сути проблемы, которая или даже там, где это панель или управление сеткой.

ответ

0
private static IEnumerable<IntPtr> GetChildWindows(IntPtr parent) 
    { 
     List<IntPtr> result = new List<IntPtr>(); 
     GCHandle listHandle = GCHandle.Alloc(result); 
     try 
     { 
      NativeMethods.EnumWindowProc childProc = new NativeMethods.EnumWindowProc(EnumWindow); 
      NativeMethods.EnumChildWindows(parent, childProc, GCHandle.ToIntPtr(listHandle)); 
     } 
     finally 
     { 
      if(listHandle.IsAllocated) 
      { 
       listHandle.Free(); 
      } 
     } 

     return result; 
    } 

    /// <summary> 
    /// Callback method to be used when enumerating windows. 
    /// </summary> 
    /// <param name="handle">Handle of the next window</param> 
    /// <param name="pointer">Pointer to a GCHandle that holds a reference to the list to fill</param> 
    /// <returns>True to continue the enumeration, false to bail</returns> 
    private static bool EnumWindow(IntPtr handle, IntPtr pointer) 
    { 
     GCHandle gch = GCHandle.FromIntPtr(pointer); 
     List<IntPtr> list = gch.Target as List<IntPtr>; 
     if(list == null) 
     { 
      throw new InvalidCastException("GCHandle Target could not be cast as List<IntPtr>"); 
     } 

     list.Add(handle); 

     // You can modify this to check to see if you want to cancel the operation, then return a null here 
     return true; 
    } 

private DataGridView Grid() 
{ 
IEnumerable<IntPtr> a = GetChildWindows(handle); 
      foreach(IntPtr b in a) 
     { 
      Control c = Control.FromHandle(b); 
      if(c == null) 
      { 
       continue; 
      } 

      try 
      { 
       if(c.Name != "DataGridView") 
       { 
        continue; 
       } 

       DataGridView dv = c as DataGridView; 
       if(dv != null) 
       { 
        return dv; 
       } 
      } 
      catch 
      { 
       // It is safe to suppress errors here. 
      } 
     } 

}