我想知道如何在功能区设计器中为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服务器填充组合框。然后,用户可以从组合框中选择他们想要连接的服务器。我需要做的就是从组合框中获取所选的选项并且我已经设置好了。非常感谢提前!
答案 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);
抱歉是个懒散。