web-dev-qa-db-fra.com

C # - Remplissez une zone de liste déroulante avec un DataTable

J'ai l'habitude de travailler avec Java où de grandes quantités d'exemples sont disponibles. Pour diverses raisons, j'ai dû passer en C # et essayer de faire ce qui suit dans 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";

On supposerait de voir certaines valeurs dans la liste déroulante, mais elle est vide. Veuillez me dire ce que je fais mal; (

EDIT: mnuActionLanguage.ComboBox.DataBind () est ce que j'ai également trouvé sur le net, mais cela ne fonctionne pas dans mon cas.

SOLUTION

mnuActionLanguage.ComboBox.BindingContext = this.BindingContext;

à la fin a résolu le problème!

21
MrG

Vous devez définir le contexte de liaison de ToolStripComboBox.ComboBox.

Voici une version légèrement modifiée du code que je viens de recréer à l'aide de Visual Studio. La zone de liste déroulante des éléments de menu s'appelle toolStripComboBox1 dans mon cas. Notez la dernière ligne de code pour définir le contexte de liaison.

J'ai remarqué que si le combo est dans le visible, c'est de la bande d'outils, la reliure fonctionne sans cela mais pas quand elle est dans une liste déroulante. Avez-vous le même problème?

Si vous ne pouvez pas faire fonctionner cela, envoyez-moi une ligne via ma page de contact et je vous enverrai le projet. Vous ne pourrez pas le charger à l'aide de SharpDevelop mais avec 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;
30
BlackWasp
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;
7
Nidz

Par exemple, j'ai créé une table:

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

Ajouter un enregistrement à la table:

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

ou :

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

enfin :

combo.DataSource = dt;
combo.DisplayMember = "Title";
combo.ValueMember = "Value";
3
Masoud Siahkali

Appliquez-vous un RowFilter à votre DefaultView plus loin dans le code? Cela pourrait modifier les résultats renvoyés.

J'éviterais également d'utiliser la chaîne comme membre d'affichage si vous avez une référence directe à la colonne de données, j'utiliserais les propriétés de l'objet:

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

J'ai essayé cela avec un formulaire vierge et un combo standard, et semble fonctionner pour moi.

2
Ady

Quelques points:

1) "DataBind ()" est uniquement pour les applications Web (pas les applications Windows).

2) Votre code semble très 'JAVAish' (pas une mauvaise chose, juste une observation).

Essaye ça:

mnuActionLanguage.ComboBox.DataSource = languages;

Si cela ne fonctionne pas ... alors je suppose que votre source de données est placée ailleurs dans le code.

1
Timothy Khouri

Cette ligne

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

est faux. Changez-le en

mnuActionLanguage.ComboBox.DisplayMember = "Language";

et cela fonctionnera (même sans DataBind ()).

0
Alan