Поле со списком VSTO Ribbon добавляет элементы динамически

#c# #outlook #vsto #add-in #outlook-addin

#c# #outlook #vsto #надстройка #outlook-добавление

Вопрос:

Как динамически добавлять элементы поля со списком?

У меня есть поле со списком, в котором я буду вызывать API во время события обратного вызова onChange. Возникла проблема при загрузке элементов в поле со списком

     public void OnChange(Office.IRibbonControl control, string text)
    {            
        var result = GETMembersList("https://restcountries.eu/rest/v1/all");

        var members = from member in result
                      select member;

        foreach (var member in members)
        {
            dsMember mem = new dsMember();
            mem.Id = member["numericCode"].ToString();
            mem.Name = member["name"].ToString();

            RibbonDropDownItem item = Globals.Factory.GetRibbonFactory().CreateRibbonDropDownItem();
            item.Label = mem.Name;
            **cmbMembers.Items.Add(item);** ?? //problem here, cant access the combo box
        }
  

Ribbon.xml

     <?xml version="1.0" encoding="UTF-8"?>
<customUI onLoad="Ribbon_Load" xmlns="http://schemas.microsoft.com/office/2006/01/customui">
  <ribbon>
    <tabs>
      <tab id="tabTest" label="TEST">
        <group id="grpTest">
          <comboBox id="cmbMembers" label="Users" showImage="false" 
                  onChange="OnChange"/>
        </group>
      </tab>
    </tabs>
  </ribbon>
</customUI>
  

Комментарии:

1. Вы пробовали Globals.Ribbons.Ribbon1.cmbMembers.Items.Add(item); ?

2. @haindl ya я пытался, но Ribbon1 равно нулю.

3. С точки зрения Office невозможно создавать ленты без XML. Независимо от того, используете ли вы VSTO, COM-надстройку или VBA, вам всегда нужно это Ribbon.xml . Конструктор ленты VSTO — это просто способ упростить этот процесс. С точки зрения XML есть два способа заполнить поле со списком элементами. Если элементы статичны и не меняются, вы просто используете getItemCount/getItemID/getItemLabel on <comboBox> , но если элементы меняются во время выполнения, тогда вам нужно использовать a <dynamicMenu> вместо <comboBox> и построить <menu> внутри getContent .

Ответ №1:

попробуйте это:

  RibbonDropDownItem item = Factory.CreateRibbonDropDownItem();
  

Комментарии:

1. Здесь не сказано, как ссылаться на поле со списком на ленте.

2. @Peter Вопрос касается проблемы при загрузке элементов, а не ссылки. В любом случае, если вы хотите обратиться к самому элементу управления, вы найдете его в офисе объявления методов. Элемент управления IRibbonControl

3. Я думаю, что комментарий Хайндла к вопросу является правильным ответом на вопрос. В вашем ответе указано, как создавать элементы, но не как добавлять их в поле со списком — и я не думаю, что их можно добавить в ленту xml.

4. Хорошо, комментарий Хайнделя тоже хорош, вы можете его выбрать 🙂

Ответ №2:

У VISTO проблема, я тоже пытался добавить несколько элементов из кода, но что-то пошло не так. Но существующие элементы можно изменять динамически. Попробуйте отредактировать в событии Ribbon1_Load.

 public partial class Ribbon1
{
    private void Ribbon1_Load(object sender, RibbonUIEventArgs e)
    {
        this.comboBox1.Items[0].Label = "new Lable";
    }
}
  

Комментарии:

1. Это для ленты, созданной с помощью конструктора, а не для ленты xml.