1

アドインからビジュアル スタジオのクエリ結果ペインにアクセスする方法はありますか?

Menu - Data - Transact SQL Editor - new query からのクエリ ウィンドウについては言及していません。サーバーの探索から考えています-いくつかのデータベースを展開します-テーブルを展開し、テーブルを右クリックして新しいクエリを選択します。含めるテーブルを選択したら、いくつかの列をチェックして、実行を選択します。新しいウィンドウが開きます。そのウィンドウは私が知っている Document クラスですが、そのクラスからコントロールやペイン、さらにはパネルの内容を取得することはできません。下部には、行と列を含むペインが表示されます。

可能であれば、そのペインまたはグリッド コントロールにアクセスする必要があります。または、リフレクションを介して、そのクエリ結果ウィンドウで選択したセルのセル値を取得する方がよいでしょうか?

VS 用のアドインを既に作成しましたが、そのグリッドからセルの値を取得するのに問題があります。リフレクションを試してみましたが、このペインまたはグリッド コントロールがどこにあるのか、さらにはどこにあるのか、問題の根底に到達できません。

4

1 に答える 1

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.
            }
        }

}

于 2013-06-06T11:53:37.623 に答える