SQL Server 2012的加载项Management Studio创建了重复的上下文菜单按钮

时间:2015-02-19 08:48:15

标签: c# sql-server visual-studio ssms-2012 ssms-addin

我正在为SQL Server 2012 Management Studio创建一个加载项,该加载项将自定义按钮添加到表的上下文菜单中。

我在codeplex上使用了以下项目的源代码作为指导:

SSMSAddinDenali on Codeplex

代码如下:

void ObjectExplorerContext_CurrentContextChanged(object sender, NodesChangedEventArgs args)
{
        debug_message("ObjectExplorerContext_CurrentContextChanged::");

        try
        {
            // Getting current node context
            Microsoft.SqlServer.Management.UI.VSIntegration.ObjectExplorer.INavigationContextProvider navigationContextProvider = (INavigationContextProvider)sender;
            INavigationContext navigationContext = (INavigationContext)navigationContextProvider.CurrentContext;

            // Find selected node node
            ObjectExplorerService objectExplorer = (ObjectExplorerService)ServiceCache.ServiceProvider.GetService(typeof(IObjectExplorerService));
            INodeInformation node = objectExplorer.FindNode(navigationContext.Context);

            debug_message(string.Format("ObjectExplorerContext_CurrentContextChanged::Selected Node {0}",navigationContext.Context));

            // Code to add extra items to the menu
            if (_tableMenu == null && _tableRegex.IsMatch(node.Context))
            {
                _tableMenu = (HierarchyObject)node.GetService(typeof(IMenuHandler));

                tableMenuItem item = new tableMenuItem();
                _tableMenu.AddChild(string.Empty, item);
            }
        }
        catch (Exception ObjectExplorerContextException)
        {
            debug_message(String.Format("ObjectExplorerContext_CurrentContextChanged::ERROR:{0}", ObjectExplorerContextException.Message));
        }
    }

如果我在桌子上单击一下就没有额外的按钮了。如果我再次单击按钮,则会添加两次按钮。在调试时我发现代码执行了两次。 (我认为该方法是异步调用的。)

不幸的是,关于创建SSMS-addins的文章并不多,这就是我无法通过Google搜索找到解决方案的原因。

有人可以帮我解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

我找到了阻止这种情况发生的方法。

我使用反射来查找上下文菜单中有多少项目,如果有一定数量(在我的情况下它是20)我将添加我的项目。当事件第二次被提升时,有超过20个项目,所以他们不会被添加。

我使用的代码是:

ArrayList menuItems = PropertyHelper.GetPrivateFieldValue<ArrayList>(_tableMenu, "menuItemsInOrder");
if (menuItems.Count == 20)
{
    tableMenuItem tmi = new tableMenuItem();
    _tableMenu.AddChild(string.Empty, tmi);
}

可以找到PropertyHelper-Class here