1

Ich habe eine Visual Studio-Erweiterung erstellt, die dem Kontextmenü des Knotens "Tabellen" und jedes untergeordneten Knotens im Abschnitt Server-Explorer-Datenverbindungen ein Menüelement hinzufügt.Visual Studio-Erweiterung, Informationen über Knoten im Server-Explorer erhalten

enter image description here

Ich habe den Menüpunkt verdrahtet, so erscheint die BeforeQueryStatus Ereignis ausgelöst wird, bevor das Menü so kann ich dynamisch den Zustand des Menüpunktes steuern, es aktiviert/deaktiviert oder die Wahl, ob das Element Menü machen sollte erscheinen überhaupt.

Sowohl im BeforeQueryStatus-Ereignis als auch im Invoke-Handler muss ich auf Informationen zu dem Objekt zugreifen, das der ausgewählte Knoten darstellt. Ich muss die Connection String-Eigenschaft der tatsächlichen Datenverbindung kennen, die im übergeordneten Knoten "Tables" dargestellt wird.

Data connection properties

Wenn der ausgewählte Knoten einen Tabellenknoten (Kind von „Tables“) ist brauche ich auch die Tabellennamen und das Schema zu wissen, dass der Knoten repräsentiert.

Ich habe versucht, verschiedene Objekte zu betrachten und kann nicht finden, was ich suche. Jede Hilfe wird geschätzt. Hier ist mein Ausgangspunkt:

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

Antwort

1

Sie alle Verbindungen über IVsDataExplorerConnectionManager bekommen können, und den folgenden Code für Ihre Referenz.

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()); 
        } 
       } 


       } 
      } 

Zusätzlich fügen Sie bitte die folgende Referenz hinzu.

using Microsoft.VisualStudio.Data.Services; 
+0

Das ist großartig! Ich frage mich dann, wie ich eine bestimmte Verbindung im Verbindungsmanager mit einem Knoten im Server-Explorer korrelieren kann. Da Mein Ereignis ausgelöst wird, wenn der Benutzer das Popup-Menü anzeigt, muss ich die Verbindung finden, die mit dem Knoten übereinstimmt, auf den das Benutzerrecht geklickt hat. – Jeremy

+0

Sie können UIHierarchy.SelectedItems verwenden, um die Verbindungsinformationen abzurufen, auf die Benutzerrechte geklickt haben. Ähnliche Code könnten Sie beziehen: https://stackoverflow.com/questions/15541438/how-to-get-the-selected-connection-node-object-of-vs-server-explorer-window-ddex –

Verwandte Themen