用字符串数组动态填充ribbon设计组合框

本文关键字:组合 ribbon 填充 字符串 数组 动态 | 更新日期: 2023-09-27 18:04:11

我想知道如何动态填充excel 2010加载项的Ribbon设计器中的组合框。我有一个按钮,当按下调用一个方法,找到网络上所有可用的SQL服务器的列表。然后,我想显示该方法找到并填充到组合框中的所有SQL服务器。我已经能够在Windows窗体应用程序中使用数据源属性填充组合框,但是在功能区设计器中它缺少一些属性。

我想知道是否有一种方法可以做到这一点与comboBox1.Items.Add(string[] array here)但是看起来comboBox1.Items。Add需要对象,所以我想知道是否有一种方法可以使数组中的每个字符串都变成一个带有for循环的对象。

我还听说另一个可能的解决方案是使用XML Ribbon Designer,但我还不太适应。我对它做了大量的研究,但还没有找到符合我确切情况的东西。提前谢谢你,这是我的一些代码。

public static string[] GetSQLServerList()
{
SqlDataSourceEnumerator dse = SqlDataSourceEnumerator.Instance;
DataTable dt = dse.GetDataSources();
if (dt.Rows.Count == 0)
{
      return null;
}
string[] SQLServers = new string[dt.Rows.Count];
int f = -1;
foreach (DataRow r in dt.Rows)
    {
       string SQLServer = r["ServerName"].ToString();
       string Instance = r["InstanceName"].ToString();
       if (Instance != null && !string.IsNullOrEmpty(Instance))
          {
             int i = 0;SQLServer += "''" + Instance;
          }
       SQLServers[System.Math.Max(System.Threading.Interlocked.Increment(ref f), f - 1)] = SQLServer;
    }
 Array.Sort(SQLServers);
 //not sure how to fill combobox from here
 comboBox1.Items.Add(RibbonDropDownItem here);
 return SQLServers;
 }

在我的Windows窗体应用程序中,我有完全相同的方法,这就是我如何填充组合框。

    private void button1_Click(object sender, EventArgs e)
    {
        Cursor = Cursors.WaitCursor;
        comboBox1.DataSource = GetSQLServerList();
        Cursor = Cursors.Default;
    }

但是就像我之前说的,在Ribbon可视化设计器中没有Datasource属性。

  ![ribbon designer combobox properties][1]
  [1]: https://i.stack.imgur.com/xzNUO.png

所以,我认为基本上,在excel 2010插件中,将有一个按钮填充与网络上的SQL服务器的组合框。然后用户可以从组合框中选择他们想要连接的服务器。所有我需要能够做的是从组合框中得到选择的选项,我设置。提前感谢!

用字符串数组动态填充ribbon设计组合框

我找到了有效的方法,主要使用了荷兰人上面所说的。我创建了一个for循环,它将遍历数组中的每个字符串,并从中获取值。然后我使用他给我的代码并将值添加到组合框中。

private void button2_Click_2(object sender, RibbonControlEventArgs e)
    {
        SqlDataSourceEnumerator dse = SqlDataSourceEnumerator.Instance;
        DataTable dt = dse.GetDataSources();
        if (dt.Rows.Count == 0)
        {
           // return null;
        }
        string[] SQLServers = new string[dt.Rows.Count];
        int f = -1;
        foreach (DataRow r in dt.Rows)
        {
            string SQLServer = r["ServerName"].ToString();
            string Instance = r["InstanceName"].ToString();
            if (Instance != null && !string.IsNullOrEmpty(Instance))
            {
                int i = 0; SQLServer += "''" + Instance;
            }
            SQLServers[System.Math.Max(System.Threading.Interlocked.Increment(ref f), f - 1)] = SQLServer;
        }
        Array.Sort(SQLServers);
        for(int i = 0; i < SQLServers.Length; i++)
        {

            RibbonDropDownItem item = Globals.Factory.GetRibbonFactory().CreateRibbonDropDownItem();
            item.Label = SQLServers.GetValue(i).ToString();
            //item.Label = "yourtext";
            comboBox1.Items.Add(item);
        }
    }

好吧,对不起,这个答案是我的错。我误解了你的问题。

您不能在运行时创建这些项。我要做的是创建一组项目(假设是5个),并将它们全部隐藏在Form_Load事件中。然后,当您需要该集合时,您可以循环遍历它们并再次显示它们,此外,您可以在循环遍历它们时以编程方式更新属性。

编辑:在做了一些研究之后,我发现可以在运行时创建项目;RibbonDropDownItem item = Globals.Factory.GetRibbonFactory().CreateRibbonDropDownItem(); item.Label = "yourtext"; comboBox1.Items.Add(item);