Domanda

Sono abituato a lavorare con Java dove sono disponibili grandi quantità di esempi. Per vari motivi ho dovuto passare a C # e provare a fare quanto segue in 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";

Uno assumerebbe di vedere alcuni valori nel menu a discesa, ma è vuoto. Per favore, dimmi cosa sto facendo di sbagliato; (

EDIT: mnuActionLanguage.ComboBox.DataBind () è quello che ho trovato anche in rete, ma non funziona nel mio caso.

SOLUTION

mnuActionLanguage.ComboBox.BindingContext = this.BindingContext;

alla fine risolto il problema!

È stato utile?

Soluzione

È necessario impostare il contesto di associazione di ToolStripComboBox.ComboBox.

Ecco una versione leggermente modificata del codice che ho appena ricreato usando Visual Studio. La casella combinata della voce di menu si chiama toolStripComboBox1 nel mio caso. Nota l'ultima riga di codice per impostare il contesto di associazione.

Ho notato che se il combo è visibile sono della sequenza comandi, la rilegatura funziona senza questo, ma non quando si trova in un menu a discesa. Hai lo stesso problema?

Se non riesci a farlo funzionare, mandami una riga tramite la mia pagina dei contatti e ti invierò il progetto. Non sarai in grado di caricarlo usando SharpDevelop ma lo farai con 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;

Altri suggerimenti

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;

Ad esempio, ho creato una tabella:

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

Aggiungi record alla tabella:

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

o:

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

finalmente:

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

Stai applicando un RowFilter a DefaultView più avanti nel codice? Ciò potrebbe modificare i risultati restituiti.

Vorrei anche evitare di utilizzare la stringa come membro di visualizzazione se si dispone di un riferimento diretto alla colonna di dati che utilizzerei le proprietà dell'oggetto:

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

L'ho provato con un modulo vuoto e una combo standard e sembra funzionare per me.

Alcuni punti:

1) " DataBind () " è solo per le app Web (non le app di Windows).

2) Il tuo codice sembra molto "JAVAish" (non è una brutta cosa, solo un'osservazione).

Prova questo:

mnuActionLanguage.ComboBox.DataSource = languages;

Se il problema persiste ... suppongo che l'origine dati sia stata spostata da qualche altra parte nel codice.

Questa linea

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

è sbagliato. Modificalo in

mnuActionLanguage.ComboBox.DisplayMember = "Language";

e funzionerà (anche senza DataBind ()).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top