Usuario
combobox en tiempo de ejecucion

Pregunta
-
hola que tal ,,
estoy utilizando controles en tiempo de ejecucion mi pregutna es la siguiente..
como puedo hace para ?
como crear un nuevo combobox en tiempo de ejecucion y llenarlo al igual poner el eventlo selectchange para saber el elemento que se ha seleccionado alguien me puede ayudar
Todas las respuestas
-
mira, puedes arrastrar un combobox en modo de diseño y asi mirar el codigo que se genera, este codigo te serviria para saber las propiedades iniciales. De alli, si quieres llenar el combo, depende del origen de datos con que lo quieres llenar. Por ejemplo, simplemente podrias llenar el combo asi
comboBox1.Items.Add(
"Valor1");comboBox1.Items.Add(
"Valor2");comboBox1.Items.Add(
"Valor3");comboBox1.Items.Add(
"Valor4");comboBox1.Items.Add(
"Valor5");
y recuperar el valor seleccionado asi
string valorSeleccionado = comboBox1.SelectedText; -
protected void Page_Load(object sender, EventArgs e) { DropDownList ddl = new DropDownList(); ddl.Items.Add("Primero"); ddl.Items.Add("Segundo"); ddl.AutoPostBack = true; ddl.SelectedIndexChanged += new EventHandler(ddl_SelectedIndexChanged); form1.Controls.Add(ddl); } protected void ddl_SelectedIndexChanged(object sender, EventArgs args) { DropDownList ddl = (DropDownList)sender; string a = ddl.SelectedValue; }
Ibon Landa - http://geeks.ms/blogs/ilanda -
Hola,
Como sabras cada control en realidad es uan clase por lo que puedes crearla como objeto, esto se hace muy simple, ya que tu tienes la ComboBox (Clase):
System.Windows.Forms.ComboBox comboBox1 = new System.Windows.Forms.ComboBox();
//Podras cargarlo especificando los items
comboBox1.Items.AddRange(new object[] {"Item 1",
"Item 2",
"Item 3",
"Item 4",
"Item 5"});
//o en caso contrario binculandolo a un origen de datos
comboBox1.DataSource = <Data Source> ;
comboBox1.DisplayMember = "<nombre campo a mostrar>";
comboBox1.ValueMember = "<nombre campo a cargar>";
//para asignarle un evento
comboBox1.SelectedValueChanged += new EventHandler(ComboBox1_SelectedValueChanged);
Por supuesto despues tendras que agregarlo a la clase contenedora, ya sea un form, o algun otro objeto.
Saludos
Leandro Tuttini -
hola que tal tengo el siguiente codigo una funcion que me llena el combobox .....
Public Function llena_combo(ByRef combo As ComboBox, ByRef selec As String, ByRef from As String, ByRef where As String, ByRef primercampo As String, ByRef segundocampo As String) As ComboBox
Dim cad As New Conexion: Dim ds As New DataSet(): Dim reader As SqlDataAdapter: Dim my_strsql As String
cad.abrir()combo.DataSource = Nothing
combo.ValueMember = Nothing
combo.DisplayMember = Nothing
combo.Items.Clear()my_strsql = selec & from & where
reader = New SqlDataAdapter(my_strsql, cad.getCon)
reader.Fill(ds, primercampo)
reader.Fill(ds, segundocampo)'combo.DataSource = ds.Tables(0).DefaultView
combo.DataSource = ds.Tables(0)
combo.DisplayMember = primercampo
combo.ValueMember = segundocampocad.cerrar()
Return combo
End Functionesta funcio recibe el combo y lo llena ahora cuando quiero en tiempo de ejecucion llenar el combobox lo hago asi.
public load..
dim obj4 as New ComboBoxobj4.Name = "cmb_estado_" & i + 1
obj4.Text = tablaEst.Rows(i)(7)
obj4.Location = New Point(840, contador + 4)
obj4.Width = 100
obj4.Height = 20
obj4.Anchor = AnchorStyles.Top Or AnchorStyles.Left Or AnchorStyles.Right
obj4.Enabled = True
estados.Add(obj4)
AddHandler estados(i).SelectedIndexChanged, AddressOf selectedindex
## aqui es donde mando a llamar la consulta para llenar el combobox
estado.llena_combo(estados(i), "SELECT pk_estado_est, nom_estado_est ", " FROM estados_est ", " ", " pk_estado_est", " nom_estado_est")
estados(i).Text = tablaEst.Rows(i)(7)
Me.panel1.Controls.Add(obj4)
contador = contador + 38
ultimaprioridad = tablaEst.Rows(i)(6)
end sub....
Private Sub selectedindex(ByVal sender As Object, ByVal e As System.EventArgs)End Sub
el problema es que me muestra en los elementos del combobox .. system.datarowview , como l epuedo hacer para que me muestre los datos tal y como son.. de antemanomuchas gracias -
Hola,
Primeramente queria realizarte algunas observaciones.
- Cuado defines la funcion "llena_combo", estas usando todos parametros por referencia, ehh yo lo evitaria si es que son string y ademas veo que cuando los usas son solo cadenas estaticas, prueba usando ByVal.
Por ahi en el combo no estaria mal el ByRef, aunque como es un objeto si usas por valor tambien te lo tomara, recuerda que los objetos simpre se referencian por sus punteros, no se realizan copiar cuando se pasan por parametro a una funcion, bueno al menos asi es en C#.
- Otra aclaracion porque realizas al final de la funcion "llena_combo" un return del combo, si este lo estas pasando por referencia?
la funcion deberia ser del tipo void, o sea sin retorno, ya que al salir de la funcion, el combo fue modificado
Con respecto al error puedo mencionarte que me da la sensacion que le problema esta en la forma en que estas cargando el DataSet.
O sea no necesitas realizar dos Fill() cuando la consulta es una sola.
Lo que estas haciando es creando dos tablas con los nombres de los campos que le pasas como parametro.
Pero deberias crear uno solo con el nombre de la tabla.
Y ademas no deberias pasarle secciones de sql por parametro con especificar tres parametros de la consutla alcanzaria, o sea la tabla y sus dos columnas a vincular con el combo, eso es todo.
Por ahi tu metodos podria quedar de esta forma:Public Function llena_combo(ByRef combo As ComboBox, ByVal tabla As String, ByVal primercampo As String, ByVal segundocampo As String) As ComboBox Dim cad As New Conexion Dim ds As New DataSet() Dim reader As SqlDataAdapter Dim my_strsql As String cad.abrir() combo.Items.Clear() my_strsql = string.Format("SELECT {0}, {1} FROM {2}", primercampo ,segundocampo, tabla) reader = New SqlDataAdapter(my_strsql, cad.getCon) reader.Fill(ds, tabla) combo.DataSource = ds.Tables(0) combo.DisplayMember = primercampo combo.ValueMember = segundocampo cad.cerrar() End Function
Para realizar la llamada simplemente lo harias de esta forma:estado.llena_combo(estados(i), "estados_est", "pk_estado_est", "nom_estado_est" )
Deje fuera el parametro de filtros para hacer mas simple el ejemplo, pero es facilmente realizable, solo deberias agregar un parametro mas por valor, que sea alguna lista, que tenga campo-valor, podria ser un dictionary, y usarlo para armar el where dinamico.
Otra cosa que no entendi es porque agregas el combo a una coleccion de nombre "estados", si despues tambien la agregas a un panel, o sea en la linea: Me.panel1.Controls.Add(obj4).
Recuerda que puedes buscar entre los controles que contiene, usando la propeidad "Controls" del objeto panel1.
Puedes hacer cosas como estas:
//para buscar por tipo
foreach(Control control in panel1.Controls)
{
TextBox textBox = control as TextBox;
if(textBox != null)
{
//do whatever...
}
}
o como estas:
//para buscar por nombre
foreach (TextBox mp_control in panel1.Controls)
{
//If you want to set a text in the textbox....
if mp_control.Name == "txtUserName"
{
mp_control.Text = "Put your name here...";
// set the focus in the control...
mp_control.Focus();
//....whatever....
}
}
bueno espero te sea util la info.
Saludos
Leandro Tuttini -
hola que tal muchisimas gracias por esos detallitos en los que me acabas de solucionar, soy un poco nuevo y creo que gracias ati de aqui en adelante tomare mas consideracion en esos aspectos, al hacerlo como tu me indicaste me marca el system.datrowview en cada uno de los elementos y por tal motivo lo hice de la siguiente maner ala cual ya tengo los resultados esperadps
Dim cad As New Conexion
'combo.Text = NothingDim dt As New DataTable
Dim ds As New DataSet()
Dim reader As SqlDataReader
Dim comando As New SqlCommand
Dim my_strsql As String
cad.abrir()combo.DataSource = Nothing
combo.ValueMember = Nothing
combo.DisplayMember = Nothing
combo.Items.Clear()my_strsql = selec & from & where
comando.Connection = cad.getCon
comando.CommandText = my_strsql
reader = comando.ExecuteReader
dt.Load(reader)combo.DataSource = dt
combo.DisplayMember = dt.Columns(1).ToString
combo.ValueMember = dt.Columns(0).ToStringcad.cerrar()
agregando los consejos que tu me das, muchisimas graias y disculpa por el tiempo que te he quitado , de antemano me despido , pero protnto otra vez estaremos por aqui ,,,..