如何在Excel自定义功能区控件的下拉控件中设置默认值

Flo*_*ris 5 xml excel vba excel-vba

我为Excel 2010创建了一个自定义的Fluent Ribbon界面,其中包含一个下拉列表.相关的XML代码(简化):

<dropDown id="chooseFilter" showLabel="true" label="Filter" onAction="filterSelected" > 
    <item id="Filter1" label="Filter 1" /> 
    <item id="Filter2" label="Filter 2" /> 
</dropDown>
Run Code Online (Sandbox Code Playgroud)

加载功能区时,未选择任何值 - 下拉列表显示为空.

在此输入图像描述

我希望默认情况下选择第一个项目 - 但找不到任何描述如何操作的文档.我查看了控件的MSDN文档,但它没有涵盖这种情况.我尝试了各种"HTML-like"语句的排列,但它们都被自定义UI编辑器拒绝为无效.我试过的事情的例子:

<item id="Filter1" label="Filter 1" selected="selected" /> 
Run Code Online (Sandbox Code Playgroud)

错误信息: The 'selected' attribute is not declared

我试过其他属性,如selectedItem,valueselected<dropDown .../>declaraction,但似乎没有任何工作.

如果我只有正确的文档,这将是微不足道的,但即使是功能区自定义的完整Microsoft"文档"(在这里找到的是关于这个主题的沉默.

我甚至试图查看位于http://schemas.microsoft.com/office/2006/01/customui的架构是否"人类可读",但当我尝试在浏览器中打开它时,我被告知它是不可用.也许有一招......

所以我转向这个论坛的综合智慧.从我的Q/A比率可以看出,我不经常这样做...

如何修改我的XML以便功能区打开,并在下拉控件中选择任意项?我会满足于它是第一项 - 但"我选择在我的XML中声明的任何项目"都会更好.

我正在为此寻找一个XML解决方案 - 宁愿不必添加onLoadVBA代码或其他VBA技巧.它有多难,对吧?......

Tmd*_*ean 8

看起来您需要使用VBA才能选择默认项目.

引用dropDown元素文档(我的重点):

getSelectedItemID(getSelectedItemID callback)

指定要调用的回调函数的名称,以确定要在此控件中选择的项的标识符.getSelectedItemID和getSelectedItemIndex属性是互斥的.如果两个属性都未指定,则控件不应显示所选项目.例如,请考虑以下XML片段:

<gallery id="gallery" getItemCount="GetGalleryItemCount"  
   getItemID="GetItemID"
   getSelectedItemID="GetGallerySelectedItemID" />
Run Code Online (Sandbox Code Playgroud)

在此示例中,当应用程序需要确定库中的选定项时,将调用GetGallerySelectedItemID回调函数.在此示例中,回调函数返回GetItemID回调函数返回的标识符之一.此属性的可能值由ST_Delegate简单类型定义,如2.3.2节中所述.

根据我对文档的阅读,您需要自己维护过滤器的当前所选项目.GetSelectedItemID处理程序将返回当前选定的项,OnAction处理程序将更新它.

在XML中:

<dropDown id="chooseFilter" showLabel="true" label="Filter"
   getSelectedItemID="GetSelectedItemID" onAction="OnAction"> 
   <item id="Filter1" label="Filter 1" /> 
   <item id="Filter2" label="Filter 2" />
</dropDown>
Run Code Online (Sandbox Code Playgroud)

在您的工作簿的代码模块中:

Private mCurrentItemID As Variant

Sub GetSelectedItemID(control As IRibbonControl, ByRef itemID As Variant)
    If IsEmpty(mCurrentItemID) Then
        mCurrentItemID = "Filter1"
    End If
    itemID = mCurrentItemID
End Sub

Sub OnAction(control As IRibbonControl, selectedID As String, _
             selectedIndex As Integer)
    mCurrentItemID = selectedID
End Sub
Run Code Online (Sandbox Code Playgroud)

  • 现在我已经考虑了一段时间了,我实际上已经开始明白发生了什么.当功能区需要绘制DropDown时,它将调用`GetSelectedItemID`函数; 通过返回所需的状态,我们可以强制显示默认值.令人讨厌的空盒子消失了.谢谢你的帮助! (3认同)

Rex*_*ker 5

我在启动时也遇到了类似的空白下拉菜单问题,因为尚未设置任何内容。但是,当控件无效但下拉列表已填充时,它将再次返回空白选择(我使控件无效,因为我向列表中添加了一些新项目,所以我希望重建它)。

正如这里提到的,解决方案是使用
<dropDown id="ddc0" label="Label Dropdown 0" getSelectedItemIndex="GetSelectedItemIndexDropDown ...提到的。

然后VBA回调:

Sub GetSelectedItemIndexDropDown(control As IRibbonControl, ByRef index) ' Callbackname in XML File "GetSelectedItemIndexDropDown ...

按预期工作。注意:onAction= "onActionCallback"在VBA中用于设置状态并将其广播给任何人;用于getSelectedItemIndex= "onGetSelectedItemIndexCallback"功能区查询其应显示的状态。