C# – 用DataTable填充combobox

我习惯于使用大量例子的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; 

最终解决了这个问题!

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

这是我刚刚使用Visual Studio重新创build的代码的稍微修改版本。 菜单项combobox在我的情况下被称为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; 
 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 + "';"; SqlCommand Cmd = new SqlCommand(strCmd, Con); 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; 

稍后在代码中将RowFilter应用到DefaultView中吗? 这可能会改变返回的结果。

我也会避免使用string作为显示成员,如果你有一个直接引用的数据列我会使用对象的属性:

 mnuActionLanguage.ComboBox.DataSource = lTable.DefaultView; mnuActionLanguage.ComboBox.DisplayMember = lName.ColumnName; 

我已经试过这个空白表单和标准组合,似乎为我工作。

几点:

1)“DataBind()”仅适用于Web应用程序(不是Windows应用程序)。

2)你的代码看起来非常“JAVA”(不是一件坏事,只是一个观察)。

尝试这个:

 mnuActionLanguage.ComboBox.DataSource = languages; 

如果这不起作用…那么我假设你的数据源正在代码中的其他地方。

例如,我创build了一个表格:

 DataTable dt = new DataTable (); dt.Columns.Add("Title", typeof(string)); dt.Columns.Add("Value", typeof(int)); 

添加logging到表格:

 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"; 

这条线

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

是错的。 将其更改为

 mnuActionLanguage.ComboBox.DisplayMember = "Language"; 

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