C # – Заполните поле со списком с помощью DataTable

Я привык работать с 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"; 

Можно предположить, что в раскрывающемся списке есть некоторые значения, но они пустые. Скажите, пожалуйста, что я делаю неправильно ((

EDIT: mnuActionLanguage.ComboBox.DataBind () – это то, что я также нашел в сети, но это не работает в моем случае.

РЕШЕНИЕ

 mnuActionLanguage.ComboBox.BindingContext = this.BindingContext; 

в конце концов решил проблему!

Вам нужно установить контекст привязки 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; 
 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; 

Вы применяете RowFilter к своему DefaultView позже в коде? Это может изменить полученные результаты.

Я бы также избегал использования строки в качестве элемента отображения, если у вас есть прямая ссылка на столбец данных, в котором я бы использовал свойства объекта:

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

Я пробовал это с пустой формой и стандартным комбо, и, похоже, работает для меня.

Например, я создал таблицу:

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

Несколько моментов:

1) «DataBind ()» предназначен только для веб-приложений (а не для приложений Windows).

2) Ваш код выглядит очень «JAVAish» (не плохо, просто наблюдение).

Попробуй это:

 mnuActionLanguage.ComboBox.DataSource = languages; 

Если это не сработает … тогда я предполагаю, что ваш источник данных наступает в другом месте кода.

Эта строка

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

неправильно. Измените его на

 mnuActionLanguage.ComboBox.DisplayMember = "Language"; 

и он будет работать (даже без DataBind ()).

Давайте будем гением компьютера.