1

「テーブル」ノードのコンテキストメニューとサーバーエクスプローラーのデータ接続セクションの各子ノードにメニュー項目を追加するVisual Studio拡張機能をビルドしました。メニューは、私は動的にメニュー項目がすべきかどうかを無効にするか、選択/有効になって、メニュー項目の状態を制御することができます表示される前に、私はBeforeQueryStatusイベントが発生してメニュー項目を有線ましVisual Studio拡張で、サーバーエクスプローラーのノードに関する情報を取得

enter image description here

まったく現れません。

BeforeQueryStatusイベントと呼び出しハンドラの両方で、選択したノードが表すオブジェクトに関する情報にアクセスする必要があります。私は実際のデータ接続の接続文字列プロパティを知る必要があります。これは "テーブル"親ノードで表されています。

Data connection properties

選択したノードは、テーブルノード(「表」の子)であれば、私はまた、ノードが表しているテーブル名とスキーマを知っておく必要があります。

私は様々なオブジェクトを見てみましたが、私が何をしているのかは分かりません。どんな助けもありがたい。

private void Mnu_BeforeQueryStatus(object sender, EventArgs e) 
{ 
    OleMenuCommand mnu = (OleMenuCommand)sender; 
    EnvDTE.DTE service = (EnvDTE.DTE)this.ServiceProvider.GetService(typeof(EnvDTE.DTE)); 

    EnvDTE.ContextAttributes ctx = service.ContextAttributes; 
    EnvDTE.Window w = service.ActiveWindow; 
    //EnvDTE.Properties p = service.Properties.; 
    EnvDTE.SelectedItems si = service.SelectedItems; 

    EnvDTE.ProjectItem pi = w.ProjectItem; //null 
    var selection = w.Selection; //null 

    var obj = w.Object; 
    var objk = w.ObjectKind; 
} 

答えて

1

あなたがIVsDataExplorerConnectionManagerを経由して、すべての接続、およびあなたの参照のために、次のコードを得ることができる:ここに私の出発点です。

IVsDataExplorerConnectionManager connectionManager = this.ServiceProvider.GetService(typeof(IVsDataExplorerConnectionManager)) as IVsDataExplorerConnectionManager; 
      IDictionary<string, IVsDataExplorerConnection> connections = connectionManager.Connections; 
      foreach (KeyValuePair<string, IVsDataExplorerConnection> connection in connections) 
      { 

       if(connection.Key == "youconnectionkey") 
       { 
        string connstr = connection.Value.Connection.DisplayConnectionString; 
        string NodeText = connection.Value.DisplayName; 
       using (SqlConnection conn = new SqlConnection(connstr)) 
       { 
        conn.Open(); 
        DataTable schema = conn.GetSchema("Tables"); 
        List<string> TableNames = new List<string>(); 
        foreach (DataRow row in schema.Rows) 
        { 
         TableNames.Add(row[2].ToString()); 
        } 
       } 


       } 
      } 

さらに、次のリファレンスを追加してください。

using Microsoft.VisualStudio.Data.Services; 
+0

これは素晴らしいです!私は、接続マネージャの特定の接続をサーバーエクスプローラのノードとどのように関連付けることができるのだろうかと思います。ユーザーがポップアップメニューを表示したときにMyイベントが発生しているので、ユーザーが右クリックしたノードとの関連付けを見つける必要があります。 – Jeremy

+0

UIHierarchy.SelectedItemsを使用して、ユーザーが右クリックした接続情報を取得できます。同様のコードは、次のように参照できます:https://stackoverflow.com/questions/15541438/how-to-get-the-selected-connection-node-object-of-vs-server-explorer-window-ddex –

関連する問題