使用字符串数组动态填充功能区设计组合框?

时间:2014-05-20 17:42:59

标签: c# arrays combobox vsto ribbon

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

我想知道是否有办法用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]: http://i.stack.imgur.com/xzNUO.png

所以,我认为,基本上,在excel 2010插件中,会有一个按钮,用于在网络上使用SQL服务器填充组合框。然后,用户可以从组合框中选择他们想要连接的服务器。我需要做的就是从组合框中获取所选的选项并且我已经设置好了。非常感谢提前!

2 个答案:

答案 0 :(得分:2)

我找到了什么有效,主要使用荷兰人上面所说的。我做了一个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);
        }
    }

答案 1 :(得分:0)

好的,抱歉这个答案是我的错误。我误解了你的问题。

您无法在运行时创建这些项目。我要做的是创建一组项目(比方说5)并在Form_Load事件中隐藏它们。然后,当你需要这个集合时,你可以遍历它们并再次显示它们,另外你可以在循环遍历它们时以编程方式更新属性。

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

抱歉是个懒散。