Search code examples
c#outlookvstoadd-inoutlook-addin

VSTO Ribbon Combo Box Text Changed Event Call back


Am creating the VS Outlook Addin.

how to get the Text changes event of combo box. I want to call my API to retrieve data while user enter some text in the combo box

          <comboBox id="cmbUsers" label="Users" showImage="false" 
               getItemCount="OnGetItemCount"
              getItemLabel="OnGetItemLabel"
              onChange="OnChange"
                getText="GetText"
                getKeytip="GetKeytip"/>

I tried with OnChange Call back, but it doesn't work. But in Ribbon Designer i can see the TextChange event.

How to use callback event for text change

 [ComVisible(true)]
public class Ribbon : Office.IRibbonExtensibility
{
    private Office.IRibbonUI ribbon;

    public Ribbon()
    {
    }

    #region IRibbonExtensibility Members

    public string GetCustomUI(string ribbonID)
    {
        return GetResourceText("UserOutlookAddin.Ribbon.xml");
    }

    #endregion

    #region Ribbon Callbacks
    //Create callback methods here. For more information about adding callback methods, select the Ribbon XML item in Solution Explorer and then press F1

    public void Ribbon_Load(Office.IRibbonUI ribbonUI)
    {
        this.ribbon = ribbonUI;



    }

    public void OnActionCallback(Office.IRibbonControl control)
    {
        if (control.Id == "checkBox1")
        {
            MessageBox.Show("You clicked " + control.Id);
        }
        else
        {
            MessageBox.Show("You clicked a different control.");
        }
    }
    public void OnGetItemCount(Office.IRibbonControl control)
    {
        Debug.WriteLine("##### Am OnGetItemCount");
    }
    public void OnGetItemLabel(Office.IRibbonControl control)
    {
        Debug.WriteLine("##### Am OnGetItemLabel");
    }
    public void OnChange(Office.IRibbonControl control)
    {
        Debug.WriteLine("##### Am OnChange");
    }
    public void GetText(Office.IRibbonControl control)
    {
        Debug.WriteLine("##### Am GetText");
    }
    public void GetKeytip(Office.IRibbonControl control)
    {
        Debug.WriteLine("##### Am GetKeytip");
    }

    #endregion

    #region Helpers

    private static string GetResourceText(string resourceName)
    {
        Assembly asm = Assembly.GetExecutingAssembly();
        string[] resourceNames = asm.GetManifestResourceNames();
        for (int i = 0; i < resourceNames.Length; ++i)
        {
            if (string.Compare(resourceName, resourceNames[i], StringComparison.OrdinalIgnoreCase) == 0)
            {
                using (StreamReader resourceReader = new StreamReader(asm.GetManifestResourceStream(resourceNames[i])))
                {
                    if (resourceReader != null)
                    {
                        return resourceReader.ReadToEnd();
                    }
                }
            }
        }
        return null;
    }

    #endregion
}

Solution

  • Change the signature of the onChange callback from

    public void OnChange(Office.IRibbonControl control)
    

    to

    public void OnChange(Office.IRibbonControl control, string text)
    

    Now it should get called.

    Additionally you should change the signatures of getItemCount, getItemLabel, getText and getKeytip from

    public void OnGetItemCount(Office.IRibbonControl control)
    public void OnGetItemLabel(Office.IRibbonControl control)
    public void GetText(Office.IRibbonControl control)
    public void GetKeytip(Office.IRibbonControl control)
    

    to

    public int OnGetItemCount(Office.IRibbonControl control)
    public string OnGetItemLabel(Office.IRibbonControl control, int index)
    public string GetText(Office.IRibbonControl control)
    public string GetKeytip(Office.IRibbonControl control)