Tengo 3 listbox que los lleno un datasource, estos listbox están enlazados es decir dependiendo del país, el otro se llena con los estados dependiendo de que estado se llena con municipios correspondiente... Y tengo un gridview el cual también lleno con un datasource que muestra varios datos como domicilio, calle, id... Y entre ellos el país nada más. Mi problema es que a la hora de hacer clic en el grid en el campo de domicilio por ejemplo pase los datos a los listbox en la misma página, solo los pasas para el primer listbox (de país) para los otros me marca este error : 'ddlEstado' tiene un SelectedValue que no es válido porque no existe en la lista de elementos. Nombre del parámetro: value
espero me hallan entendido y me puedan ayudar...
Más o menos te entendí, tu quieres que al hacer click en el gridview pase se filtren los tres listbox pero solo lo hace para el listbox de país, ¿así es verdad? ¿Qué eventos tienes para cada listbox? Podrías enviarme una parte de tu código y verlo para decirte que debes de cambiar o de que otra manera hacerlo.
Hola gracias por contestarme Bien, mira en el código de vb aun no tengo nada, así es como lleno los lisbox <asp:DropDownList ID="ddlPais" runat="server" AutoPostBack="True" DataSourceID="SqlDataSourcePais" DataTextField="NOMBRE" DataValueField="cve_pais" Font-Names="Arial" Height="20px" Width="120px"> </asp:DropDownList> <asp:SqlDataSource ID="SqlDataSourcePais" runat="server" ConnectionString="<%$ ConnectionStrings:AGENDAConnectionString %>" SelectCommand="SELECT * FROM Paises ORDER BY NOMBRE"> </asp:SqlDataSource> <asp:DropDownList ID="ddlEdo" runat="server" AutoPostBack="True" DataSourceID="SqlDataSourceEdo" DataTextField="NOMBRE" DataValueField="cve_estado" Font-Names="Arial" Height="19px" Width="120px"> </asp:DropDownList> <asp:SqlDataSource ID="SqlDataSourceEdo" runat="server" ConnectionString="<%$ ConnectionStrings:AGENDAConnectionString %>" SelectCommand="SELECT * FROM estado WHERE (cve_pais = @cve_pais) ORDER BY NOMBRE"> <SelectParameters> <asp:ControlParameter ControlID="ddlPais" Name="cve_pais" PropertyName="SelectedValue" /> </SelectParameters> </asp:SqlDataSource> <asp:DropDownList ID="ddlMpio" runat="server" AutoPostBack="True" DataSourceID="SqlDataSourceAsentamiento" DataTextField="nombre" DataValueField="CVE_mpio" Font-Names="Arial" Height="20px" Width="120px"> </asp:DropDownList> <asp:SqlDataSource ID="SqlDataSourceMpio" runat="server" ConnectionString="<%$ ConnectionStrings:AGENDAConnectionString %>" SelectCommand="SELECT * FROM ASENTAMIENTO WHERE (CVE_estado = @cve_estado) ORDER BY nombre"> <SelectParameters> <asp:ControlParameter ControlID="ddlEdo" Name="cve_estado" PropertyName="SelectedValue" /> </SelectParameters> </asp:SqlDataSource> Y bueno hay otro listbox (4 en total ) sobre asentamiento que prácticamente sigue el mismo patrón, en el grid solo muestro el id_domicilio, el nombre de la persona, domicilio(calle, numero) y el país. Porque son varias tablas relacionadas así que no traigo todos los campos. Para que sea editable tiene tengo este evento del grid gvDatos_SelectedIndexChanged: Dim row As GridViewRow txtActivo.Text = "1" row = gvDatos.SelectedRow 'para acceder a los datos de las columnas txtNumero.Text = row.Cells(0).Text ddlPais.SelectedValue = HttpUtility.HtmlDecode(row.Cells(3).Text) conn = New SqlConnection(conexion) conn.Open() cmd = New SqlCommand("consulta " & row.Cells(0).Text, conn) Dim da As New SqlDataAdapter(cmd) Dim dt As New DataTable da.Fill(dt) If dt.Rows.Count > 0 Then txtConNom.Text = dt.Rows(0).Item("cve_contacto").ToString txtNombres.Text = dt.Rows(0).Item("nombre").ToString 'txtPat.Text = dt.Rows(0).Item("apellido_pat").ToString ' txtMat.Text = dt.Rows(0).Item("apellido_mat").ToString txtNumExt.Text = dt.Rows(0).Item("numero_exterior").ToString txtNumInt.Text = dt.Rows(0).Item("numero_interior").ToString txtNumDepto.Text = dt.Rows(0).Item("numero_depto").ToString txtComentario.Text = dt.Rows(0).Item("comentario").ToString txtCalle.Text = dt.Rows(0).Item("calle").ToString txtCp.Text = dt.Rows(0).Item("codigo_postal").ToString intento hacer esto pero me da error el error q te comente 'ddlEsado.SelectedValue = dt.Rows(0).Item("nombre").ToString End If conn.Close() No se si con eso se suficiente... o algo más
Lo que debes de hacer es crear el evento valuetextchanged pero del lado de visual basic (no recuerdo muy bien como se llama el evento busca un evento que tenga un nombre similar) para cada listbox, y dentro de ese evento debe ir el selectcommand OJO: Un ejemplo en el evento de tu listbox país, ahí debe de ir el selectcommand de estado y en el evento de tu listbox estado deberá de ir el selectcommand de asentamiento y así sucesivamente.
Hola Pues mira me sigue marcando el mismo error 'ddlEstado' tiene un SelectedValue que no es válido porque no existe en la lista de elementos. Nombre del parámetro: value intente con estos dos eventos Protected Sub ddlPais_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles ddlEstado.SelectedIndexChanged y el de: Protected Sub ddlPais_TextChanged1(ByVal sender As Object, ByVal e As System.EventArgs) Handles ddlEstado.TextChanged el codigo que pongo es el siguiente: conn = New SqlConnection(conexion) conn.Open() cmd = New SqlCommand("select * from estados where cve_pais=(select cve_pais from paises where nombre= ' " & ddlPais.SelectedValue & " ')", conn) Dim da As New SqlDataAdapter(cmd) Dim dt As New DataTable da.Fill(dt) If dt.Rows.Count > 0 Then ddlEstado.SelectedValue = dt.Rows(0).Item("nombre").ToString End If conn.Close() Pero en cualquiera de los dos me marca el mismo error
1. ¿Una pregunta del lado de ASP borraste el código? ¿O lo dejaste? 2. ¿Cómo estas definiendo el selectdatasource de cada listbox? ¿Lo estas manejando con parámetros o no? Porque si lo manejas con parámetros unicamente deberías de mandar el parámetro y no hacer el new sqlcommand.
¿Hola si deje el código en ASP lo debo quitar? Y la forma como lleno el datasource es así <asp:SqlDataSource ID="SqlDataSourceEdo" runat="server" ConnectionString="<%$ ConnectionStrings:AGENDAConnectionString %>" SelectCommand="SELECT * FROM ESTADOS WHERE (CVE_PAIS=(select cve_pais from Paises where nombre= @pais) )ORDER BY NOMBRE"> <SelectParameters> <asp:ControlParameter ControlID="ddlPais" Name="pais" PropertyName="SelectedValue" /> </SelectParameters> </asp:SqlDataSource> (del de estado) La verdad entiendo porque falla si para pasar los valores del listbox al grid y el hacer el registro en la base si lo hace pero a la inversa no; del grid al listbox
Yo lo hago de otra manera, al crear el listbox, utilizo el wizard para agregar el SqlDataSource y en el SqlDataSource agrego el Query que necesito incluyendo el parámetro a enviar. El mismo Wizard te pregunta cual es el valor a mostrar en pantalla y cual es el valor a utilizar para el que elija el usuario. Y no tengo nada en el lado de ASP más que el mismo código que me genero VB.NET, ahora en el lado de VB.NET en el evento listbox_TextChanged. Envío el parámetro al sqldatasource y luego un rebind() para que me actualice el listbox.
Ok ya te entendí solo una cosa me podrías decir como envías el parámetro al sqldarasource y el rebind() en el evento listbox_TextChanged.
sqldatasource.parameters("nombre_parametro") = valor listbox.databind(). La vez anterior me equivoque no es rebind, sino databind() P.E. en el sqldatasource del listbox de estados tienes "select campo1, campo2 from ESTADOS where pais = @p_pais" campo1 = codigo del estado campo2 = descripcion del estado private ddlPais_TextChanged (..........) sqldatasourceEstado.parameters("p_pais") = listboxpais.seletedvalue ddlEstado.databind() end sub