2008-11-02 2 views
15

Я привык работать с Java, где доступно большое количество примеров. По разным причинам мне пришлось перейти на C# и пытается сделать следующее SharpDevelop:C# - заполнить поле со списком данных DataTable

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

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

+0

Ах, вы используете Windows Forms, а не веб-формы. – Ady 2008-11-02 12:27:34

ответ

22

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

Эта линия

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

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

mnuActionLanguage.ComboBox.DisplayMember = "Language"; 

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

+0

Tkx Alan, я тоже пробовал это и исправил его выше, но поведение, к сожалению, не изменилось :(Tkx в любом случае! – MrG 2008-11-02 12:27:38

+0

Ну, я копировал/вставлял ваш код в VS 2008, исправлял его, запускал, а у меня был «английский» 'и' German 'в выпадающем списке. Не так ли вам нужно? – Alan 2008-11-02 19:21:45

+0

О, теперь я вижу, вы также столкнулись с проблемой BindingContext и исправили ее самостоятельно. Хорошо тогда :) – Alan 2008-11-02 19:22:50

1

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

1) "DataBind()" только для веб-приложений (а не окна приложения).

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

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

mnuActionLanguage.ComboBox.DataSource = languages; 

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

+0

mnuActionLanguage.ComboBox.DataSource = языки; тоже не помогает, выпадающее поле остается пустым. Tkx в любом случае! – MrG 2008-11-02 12:54:52

2

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

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

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

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

5
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; 
1

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

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

Добавить Recorde в таблице:

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

или:

dt.Rows.Add("Price",2000); 

finally:

combo.DataSource = dt; 
combo.DisplayMember = "Title"; 
combo.ValueMember = "Value"; 
Смежные вопросы