【问题标题】:Visual Studio extension, get information about node in server explorerVisual Studio 扩展,在服务器资源管理器中获取有关节点的信息
【发布时间】:2017-08-30 15:49:33
【问题描述】:

我已经构建了一个 Visual Studio 扩展,它将一个菜单项添加到“表”节点的上下文菜单和服务器资源管理器数据连接部分中的每个子节点。

我已经连接了菜单项,以便在菜单出现之前触发 BeforeQueryStatus 事件,这样我就可以动态控制菜单项的状态,使其启用/禁用或选择是否应该显示菜单项。

在 BeforeQueryStatus 事件和调用处理程序中,我需要访问有关所选节点所代表的对象的信息。我需要知道实际数据连接的 Connection String 属性,它在“Tables”父节点中表示。

如果所选节点是表节点(“表”的子节点),我还需要知道该节点所代表的表名和架构。

我尝试查看各种对象,但似乎无法找到我想要的对象。任何帮助表示赞赏。这是我的出发点:

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

【问题讨论】:

    标签: visual-studio visual-studio-2017 visual-studio-extensions


    【解决方案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;
    

    【讨论】:

    • 这太棒了!我想知道如何将连接管理器中的给定连接与服务器资源管理器中的节点相关联。因为我的事件在用户显示弹出菜单时触发,所以我需要找到与用户右键单击的节点相关的连接。
    • 您可以使用 UIHierarchy.SelectedItems 来获取用户右键单击的连接信息。类似代码,可以参考:stackoverflow.com/questions/15541438/…
    猜你喜欢
    • 1970-01-01
    • 2023-04-08
    • 2019-04-17
    • 2012-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多