2008-11-02 16 views
15

Estoy acostumbrado a trabajar con Java, donde hay una gran cantidad de ejemplos disponibles. Por diversas razones tuve que cambiar a C# y tratando de hacer lo siguiente en SharpDevelop:C# - Completar un cuadro combinado con una 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"; 

Es de suponer para ver algunos de los valores en el menú desplegable, pero es vacío. Por favor, dime lo que estoy haciendo mal; (

EDIT: mnuActionLanguage.ComboBox.DataBind() es lo que yo también encontrado en la red, pero no funciona en mi caso

. SOLUCIÓN

mnuActionLanguage.ComboBox.BindingContext = this.BindingContext; 

al final resuelto el problema!

+0

Ah, su uso de Windows Forms, en lugar de formularios Web. – Ady

Respuesta

22

Debe establecer el contexto de enlace de ToolStripComboBox.ComboBox.

Aquí hay una versión ligeramente modificada del código que acabo de recrear usando Visual Studio. El cuadro combinado del elemento de menú se llama toolStripComboBox1 en mi caso. Tenga en cuenta la última línea de código para establecer el contexto vinculante.

Me di cuenta de que si el combo está en el visible son de la tira de herramientas, el enlace funciona sin esto, pero no cuando está en un menú desplegable. ¿Tienes el mismo problema?

Si no puede hacer que esto funcione, escríbame a través de mi página de contacto y le enviaré el proyecto. No podrá cargarlo usando SharpDevelop, pero lo hará 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; 
+0

Buen lugar, no se dio cuenta de que el combo estaba en una tira de herramientas. – Ady

+0

Yo la primera vez ;-) – BlackWasp

0

Esta línea

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

es incorrecto. Cámbielo a

mnuActionLanguage.ComboBox.DisplayMember = "Language"; 

y funcionará (incluso sin DataBind()).

+0

Tkx Alan, lo intenté también y lo corregí anteriormente, pero el comportamiento desafortunadamente no cambió :(Tkx de todos modos! – MrG

+0

Bueno, copié/pegué tu código en VS 2008, lo arreglé, lo ejecuté y tuve 'Inglés' 'y' Alemán 'en el cuadro combinado. ¿No es esto lo que necesitabas? – Alan

+0

Oh, ahora veo, también se encontró con el problema BindingContext y lo arregló usted mismo. Bien entonces :) – Alan

1

Unos pocos puntos:

1) "DataBind()" es sólo para aplicaciones web (no aplicaciones de Windows).

2) Tu código se ve muy 'JAVAish' (no es algo malo, solo una observación).

Prueba esto:

mnuActionLanguage.ComboBox.DataSource = languages; 

Si eso no funciona ... entonces yo estoy asumiendo que su fuente de datos se está intensificando en algún otro lugar en el código.

+0

mnuActionLanguage.ComboBox.DataSource = languages; tampoco ayuda, el cuadro combinado permanece vacío. Tkx de todos modos! – MrG

2

¿Está aplicando RowFilter a su DefaultView más adelante en el código? Esto podría cambiar los resultados devueltos.

También me gustaría evitar el uso de la cadena como el elemento de visualización si tiene una referencia directa columna de los datos me gustaría utilizar las propiedades del objeto:

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

He intentado esto con un formulario en blanco y combinación estándar y parece funcionar para mí

+0

No, no hay RowFilter en ninguna parte del código. Parece que el problema estaba completamente relacionado con BindingContext, por la razón que sea. – MrG

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

Por ejemplo, he creado una tabla:

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

Añadir recorde a la mesa:

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