在VSTO中获取选定项目的Ribbon ComboBox控件标签(VB.Net)

时间:2016-08-01 09:46:00

标签: vb.net combobox vsto excel-addins ribbon-control

我有一个代码,可以使用Excel加载项项目列出Excel 2010中SQL的所有员工的时间输入(In Time,Out Time,Comments,Employee Name)信息。在这里,我想提前一步,从ComboBox控件列出所选员工的时间输入信息(分别在标签和标签属性中保存员工姓名和员工ID),使用Excel加载项放置在Excel功能区中。

在这里,我无法从我添加的ComboBox中获取所选员工的标签(Id)。

请任何人帮我解决此问题。

由于

1 个答案:

答案 0 :(得分:3)

这有点棘手但可行。首先,你只能通过Ribbon XML(不是通过设计师 - ,至少我不知道它)来做到这一点

我创建了非常简单的XML

<?xml version="1.0" encoding="UTF-8"?>
<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui" onLoad="Ribbon_Load">
  <ribbon>
    <tabs>
      <tab idMso="TabAddIns">
        <group id="MyGroup"
               label="My Group">
          <dropDown id ="cbTest"
                    label="Test Item"
                    getItemID="GetItemID"
                    getItemLabel="GetItemLabel" 
                    getItemCount="GetItemCount" 
                    onAction="OnAction">
          </dropDown > 
        </group>
      </tab>
    </tabs>
  </ribbon>
</customUI>

关键部分是 GetItemCount 您可以根据需要命名) 如果没有此回调,您将永远不会获得getItemID或getItemLabel的任何回调。

其余的很简单,创建一个存储所需信息的对象,例如

public class Employee
    {
        public Employee(int id, string name)
        {
            this.ID = id;
            this.Name = name;
        }
        public int ID { get; set; }
        public string Name { get; set; }
    }

使用下面的值启动对象(为了更容易跟随我将所有内容放在Ribbon类中,但这绝对是错误的方法

public class Ribbon1 : Office.IRibbonExtensibility
    {
        private Office.IRibbonUI ribbon;
        private List<Employee> _employees = new List<Employee>();

        public Ribbon1()
        {
            _employees.Add(new Employee(1, "John"));
            _employees.Add(new Employee(2, "Mark"));
            _employees.Add(new Employee(3, "Tom"));
        }
// ... rest of the code here
}

然后回调(仍在Ribbon1类中) (有关回调列表,请参阅here

    public int GetItemCount(Office.IRibbonControl control)
    {
        return _employees.Count;
    }

    public string GetItemID(Office.IRibbonControl control, int index)
    {
        var employee = _employees[index];
        return employee.ID.ToString();
    }

    public string GetItemLabel(Office.IRibbonControl control, int index)
    {
        var employee = _employees[index];
        return employee.Name;
    }

    public void OnAction(Office.IRibbonControl control, string selectedId, int selectedIndex)
    {
        var selected = string.Format("{0} ({1})", _employees[selectedIndex].Name, _employees[selectedIndex].ID);
        System.Windows.Forms.MessageBox.Show(selected);
    }

然后,您应该在Office应用程序中看到DropDown列表,在此示例中带有树值的加载项选项卡下,当您选择一个时,您应该获得该员工的姓名和ID。