C# - 使用DataTable填充下拉框

24

我习惯于使用Java,这里有大量的例子可用。由于各种原因,我不得不切换到C#并尝试在SharpDevelop中完成以下操作:

// Form has a menu containing a combobox added via SharpDevelop's GUI

// --- Variables
languages = new string[2];
languages[0] = "English";
languages[1] = "German";
DataSet myDataSet = new DataSet();

// --- Preparation
DataTable lTable = new DataTable("Lang");
DataColumn lName = new DataColumn("Language", typeof(string));
lTable.Columns.Add( lName );
for( int i=0; i<languages.Length; i++ ) {
    DataRow lLang = lTable.NewRow();
    lLang["Language"] = languages[i];
    lTable.Rows.Add(lLang);
}
myDataSet.Tables.Add(lTable);

// --- Handling the combobox
mnuActionLanguage.ComboBox.DataSource = myDataSet.Tables["Lang"].DefaultView;
mnuActionLanguage.ComboBox.DisplayMember = "Language";

有人可能会认为在下拉列表中看到一些值,但它是空的。 请告诉我我做错了什么 ;(

编辑: mnuActionLanguage.ComboBox.DataBind()也是我在网上找到的,但在我的情况下无法使用。

解决方案

mnuActionLanguage.ComboBox.BindingContext = this.BindingContext;

最终解决了问题!


啊,你使用的是Windows Forms,而不是Web Forms。 - Ady
6个回答

34

您需要设置ToolStripComboBox.ComboBox的绑定上下文。

这是我使用Visual Studio刚刚重新创建的代码的略微修改版本。在我的情况下,菜单项组合框称为toolStripComboBox1。请注意最后一行代码以设置绑定上下文。

我注意到,如果组合框位于工具栏的可见区域中,则绑定可以正常工作,但在下拉列表中则不行。您是否遇到了同样的问题?

如果您无法使其工作,请通过我的联系页面与我联系,我将发送给您该项目。您将无法使用SharpDevelop加载它,但可以使用C#Express加载。

var languages = new string[2];
languages[0] = "English";
languages[1] = "German";

DataSet myDataSet = new DataSet();

// --- Preparation
DataTable lTable = new DataTable("Lang");
DataColumn lName = new DataColumn("Language", typeof(string));
lTable.Columns.Add(lName);

for (int i = 0; i < languages.Length; i++)
{
    DataRow lLang = lTable.NewRow();
    lLang["Language"] = languages[i];
    lTable.Rows.Add(lLang);
}
myDataSet.Tables.Add(lTable);

toolStripComboBox1.ComboBox.DataSource = myDataSet.Tables["Lang"].DefaultView;
toolStripComboBox1.ComboBox.DisplayMember = "Language";

toolStripComboBox1.ComboBox.BindingContext = this.BindingContext;

不错的发现,没想到组合框在工具栏中。 - Ady
第一次我也是这样的;-) - BlackWasp

10
string strConn = "Data Source=SEZSW08;Initial Catalog=Nidhi;Integrated Security=True";
SqlConnection Con = new SqlConnection(strConn);
Con.Open();
string strCmd = "select companyName from companyinfo where CompanyName='" + cmbCompName.SelectedValue + "';";
SqlDataAdapter da = new SqlDataAdapter(strCmd, Con);
DataSet ds = new DataSet();
Con.Close();
da.Fill(ds);
cmbCompName.DataSource = ds;
cmbCompName.DisplayMember = "CompanyName";
cmbCompName.ValueMember = "CompanyName";
//cmbCompName.DataBind();
cmbCompName.Enabled = true;

你应该使用参数。 - user2988717

8
例如,我创建了一个表格:
DataTable dt = new DataTable ();
dt.Columns.Add("Title", typeof(string));
dt.Columns.Add("Value", typeof(int));

向表中添加记录:

DataRow row = dt.NewRow();
row["Title"] = "Price"
row["Value"] = 2000;
dt.Rows.Add(row);

或者:
dt.Rows.Add("Price",2000);

最后:

combo.DataSource = dt;
combo.DisplayMember = "Title";
combo.ValueMember = "Value";

3
你是否在代码后面应用了 RowFilter 到你的 DefaultView 中?这可能会改变返回结果。
如果你有一个直接引用数据列的话,我也会避免使用字符串作为显示成员,而是使用对象属性。
mnuActionLanguage.ComboBox.DataSource = lTable.DefaultView;
mnuActionLanguage.ComboBox.DisplayMember = lName.ColumnName;

我用一个空表单和标准组合框试过了,对我来说似乎有效。

不,代码中没有任何RowFilter。似乎问题完全与BindingContext有关,原因不明。 - MrG

1
一些要点:
1)“DataBind()”仅适用于Web应用程序(而非Windows应用程序)。
2)您的代码看起来非常“JAVAish”(这不是坏事,只是一个观察结果)。
尝试这个:
mnuActionLanguage.ComboBox.DataSource = languages;

如果那样不起作用... 那么我假设你的数据源在代码的其他地方被占用了。


mnuActionLanguage.ComboBox.DataSource = languages;但是这并没有帮助,组合框仍然为空。无论如何,谢谢! - MrG

0

这一行

mnuActionLanguage.ComboBox.DisplayMember = "Lang.Language";

是错误的。请将其更改为

mnuActionLanguage.ComboBox.DisplayMember = "Language";

它将会工作(即使没有DataBind()函数)。


谢谢Alan,我也尝试过并已经更正了 - 但是行为不幸没有改变 :( 无论如何还是谢谢! - MrG
好的,我将你的代码复制/粘贴到VS 2008中,进行了修复、运行,然后在组合框中看到了“英语”和“德语”。这不就是你所需的吗? - Alan
哦,现在我明白了,你也遇到了BindingContext问题并自己解决了。那就好 :) - Alan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接