Control de usuario (ascx) y GridView Asp.net
-
miércoles, 09 de mayo de 2012 3:36
En asp.net
Tengo controles de usuario ascx.
En un página ejemplo.aspx arrastro del cuadro de herramientas un control GridView. En un ItemTemplate de este control, ubico un control de usario ascx, pero este no se hace visible en el control GridView.
Que debo o que tengo que hacer, para que el control GridView me permita ver el control ascx (DropDownlist).
Todas las respuestas
-
miércoles, 09 de mayo de 2012 3:56
-
miércoles, 09 de mayo de 2012 3:57Moderador
Que debo o que tengo que hacer, para que el control GridView me permita ver el control ascx (DropDownlist).
debes asignarle datos para que se vuesualice, sino asignas registros que mostrar en el Datasource del grod nunca lo veras
'aqui cargas el datatable
da.Fill(dt)
GridView1.DataSource = dt
GridView.DataBind()
con el dt que es un datatable que cargas desde una query a la db asignas regiustro y haces que el template se genere
Leandro Tuttini
Blog
Buenos Aires
Argentina -
miércoles, 09 de mayo de 2012 3:59
-
miércoles, 09 de mayo de 2012 4:02
hola, en tiempo de diseño no creo q lo puedas ver, ademas si lo que deseas es trabajar con ese control usando el cuadro de propiedades te cuento q no podras hacerlo, debes modificar lo q debas todo por medio del html, ademas ese control tuyo no lo podras acceder directamente en tu codebehind, debes hacerlo por medio de findcontrol accediendo a una determinada fila de tu grdiview, ya que cada fila de tu grid va a tener una referecencia a ese control, para enlazarlo como te coloco Leandro lo puedes hacer.
Saludos
Julio Avellaneda
Core Group Comunidad BDotNet
MCP - MCC - MCS
Blog !! -
miércoles, 09 de mayo de 2012 4:04
Lo que mencionas, ya lo he asignado y funciona. Solo es, que en tiempo de diseño, arrastro el control de usuario (ascx) al control contro GridView (normal) en un ItemTemplate y este no se ve en tiempo de diseño.Que debo o que tengo que hacer, para que el control GridView me permita ver el control ascx (DropDownlist).
debes asignarle datos para que se vuesualice, sino asignas registros que mostrar en el Datasource del grod nunca lo veras
'aqui cargas el datatable
da.Fill(dt)
GridView1.DataSource = dt
GridView.DataBind()
con el dt que es un datatable que cargas desde una query a la db asignas regiustro y haces que el template se genere
Leandro Tuttini
Blog
Buenos Aires
Argentina -
miércoles, 09 de mayo de 2012 4:25Moderador
es que los ascx no tiene representacion grafica en tiempo de diseño
si visualizas un rectangulo de color gris entonces esta funcionando perfecto, en diseño el ascx no se muestra
Leandro Tuttini
Blog
Buenos Aires
Argentina -
miércoles, 09 de mayo de 2012 4:41
No visualizo el rectángulo gris. Me queda pendiente hacer esta práctica o también verificar si en tiempo de ejecución me permite visualizar este control grid.es que los ascx no tiene representacion grafica en tiempo de diseño
si visualizas un rectangulo de color gris entonces esta funcionando perfecto, en diseño el ascx no se muestra
Leandro Tuttini
Blog
Buenos Aires
Argentina -
sábado, 12 de mayo de 2012 2:32
En asp.net
Tengo controles de usuario ascx.
En un página ejemplo.aspx arrastro del cuadro de herramientas un control GridView. En un ItemTemplate de este control, ubico un control de usario ascx, pero este no se hace visible en el control GridView.
Que debo o que tengo que hacer, para que el control GridView me permita ver el control ascx (DropDownlist).
Otra inquietud:
Pienso que la pregunta apropiada para mi inquietud seria:¿Cómo obtener o leer un control ascx dentro de un gridview asp.net?
1. ****************************Archivo ascx para reutilizar con el nombre de: Lect.ascx<%@ Control Language="VB" AutoEventWireup="false" CodeFile="Lect.ascx.vb" Inherits="Control_Lect" %><asp:DropDownList ID="DropL" runat="server" AppendDataBoundItems="True"AutoPostBack="True" DataTextField="PerLect" DataValueField="Lec"Font-Names="Arial" Font-Size="Small"><asp:ListItem Value="-1">Seleccione un período</asp:ListItem></asp:DropDownList>
2. **********************Página aspx...<%@ Register src="../Control/Lect.ascx" tagname="Lect" tagprefix="uc13" %>...Cuando arrastro el control a un itemtemplate del gridview ubica lo siguiente:<uc13:Lect ID="DropObs" runat="server" />
3. ..................................En la página subyacente: Aspx.vb tengo el siguiente método, pero no se como manejar el control Lect.ascx.Protected Sub GridObsv_RowDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles GridObsv.RowDataBound...Dim Ind As DropDownList = CType(e.Row.FindControl("DropObs"), DropDownList)..CType(e.Row.FindControl("DropObs"), DropDownList).SelectedValue = GridObsv.DataKeys(e.Row.RowIndex).Values(0).ToStringendsub
Nota:
Si lo anterior lo realizo fuera de un control gridview, su uso seria el siguiente:
CType(DropObs.FindControl("DropL"), DropDownList).SelectedValue = "2012"No se como hacerlo en este punto, dentro de un Gridview y en un itemtemplate:
CType(e.Row.FindControl("DropObs"), DropDownList) que te menciono en el evento anterior. -
sábado, 12 de mayo de 2012 14:23
Estimado Campeon_01
Para tu ultima pregunta puntal, estos tres temas:
- Tienes un usercontrol que dentro hay un dropdownlis
- Quieres agregarlo a una columna ItemTEmplate de un GRidview y...
- Asignarle un valor seleccionado dependiendo de un valor de un campo del item enlazado a la fila del gridview
Veo que la ultima parte estas codificando en el evento RowDatabound, asi que aqui te muestro directamente en la grilla esa asignacion sin necesidad de codificar dentro del evento.
Posible solución a tus necesidades.
Veamos como seria ayudandonos con POO (Programacion Orientada a Objetos) y los artefactos que nos proporciona ASP.NET
TEMA 1: USERCONTROL: En tu UserControl deberias encapsular el valor seleccionado en una propiedad
Para asi asignarlo/obtenerlo) si necesidad de conocer el control que esta renderizando
Como seria en C#:
private string _valorSeleccionado; public string ValorSeleccionado { get { return DropL.SelectedValue; } set { _valorSeleccionado = value; DropL.SelectedValue = value; } }En VB.NET
Private _valorSeleccionado As String Public Property ValorSeleccionado() As String Get Return DropL.SelectedValue End Get Set _valorSeleccionado = value DropL.SelectedValue = value End Set End Property
NOTA 1.a) Veras que tengo una propiedad publica (que me encapsula el SelectValue) aqui la llame ValorSeleccionado para que se visualice bien la diferencia. Y tambien tengo una propiedad privada... Porque como no sabemos como estas "rellenando con datos" ese DropDownlist. Puede ser que quieras asignar un valor y todavia no tengas datos enlazados
Esto que lo que te quiero decir:protected void Page_Init(object sender, EventArgs e) { CargarEspecies(); } private void CargarEspecies() { using (var especiesRepo = new EspecieRepository()) { ddlEspecie.DataSource = especiesRepo.Listado(); ddlEspecie.DataBind(); ddlEspecie.SelectedValue = _valorSeleccionado; } }Pero bueno si tienes problemas aqui comentamos y vemos como lo hacesNOTA 1.b): Lo que no nos muestas es como rellenas el control DropL den UC Lect.ascx
TEMA 2: Insertar el UserControl dentro de una Columna ItemTEmplate del Gridview
Aqui no tienes problemas. Pero lo dejo plasmado para el que necesita... Solo es crear la columna ItemTemplate y arrastrar el control en el ModoEdicion de TEmplates (o sino escribir en el codigo HTML lo que se necesita)
Quedaria algo asi:<%@ Register src="../Control/Lect.ascx" tagname="Lect" tagprefix="uc13" %> .... <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False"> <Columns> .... <asp:TemplateField HeaderText="Especie"> <ItemTemplate> <uc13:Lect ID="Lect1" runat="server" ValorSeleccionado="<%# ((Cliente)Container.DataItem).TipoCategoriaId %>" /> </ItemTemplate> </asp:TemplateField> ... </Columns> </asp:GridView>
Podras ver que para enlazar la propiedad de nuestro UserControl en cuestion "ValorSeleccionado" con el objeto enlazado al gridview (en esa fila particular) colocamos un enlace de binding
Entonces eso es el TEMA 3...
TEMA 3: Asignarle un valor seleccionado dependiendo de un valor de un campo del item enlazado a la fila del gridview
Podras ver que no es necesario ir al codebehind al evento de binding del gridview. Ya que podemos enlazar en modo diseño
En C#<uc13:Lect ID="Lect1" runat="server" ValorSeleccionado="<%# ((Cliente)Container.DataItem).TipoCategoriaId %>" />
En VB.NET (esto escribo directamente, me puedo equivocar en algo... hace varios años no utilizo VB.NET)
<uc13:Lect ID="Lect1" runat="server" ValorSeleccionado="<%# Container.DataItem.TipoCategoriaId %>" />
O sino probar con un Ctype rotundo ;)
<uc13:Lect ID="Lect1" runat="server" ValorSeleccionado="<%# (Ctype(Container.DataItem, Cliente)).TipoCategoriaId %>" />
Con esto entonces esta lo que necesitas?
Comentanos como te fue implementando esto o algo similar, pero recuerda colocar codigo.. para que no estemos adivinando como lo estas implementando.
Espero que te sirva de ayuda o guia.
Jose. A Fernandez | blog: http://geeks.ms/blogs/fernandezja
-
domingo, 13 de mayo de 2012 21:14
Estimado Campeon_01
Para tu ultima pregunta puntal, estos tres temas:
- Tienes un usercontrol que dentro hay un dropdownlis
- Quieres agregarlo a una columna ItemTEmplate de un GRidview y...
- Asignarle un valor seleccionado dependiendo de un valor de un campo del item enlazado a la fila del gridview
Veo que la ultima parte estas codificando en el evento RowDatabound, asi que aqui te muestro directamente en la grilla esa asignacion sin necesidad de codificar dentro del evento.
Posible solución a tus necesidades.
Veamos como seria ayudandonos con POO (Programacion Orientada a Objetos) y los artefactos que nos proporciona ASP.NET
TEMA 1: USERCONTROL: En tu UserControl deberias encapsular el valor seleccionado en una propiedad
Para asi asignarlo/obtenerlo) si necesidad de conocer el control que esta renderizando
Como seria en C#:
private string _valorSeleccionado; public string ValorSeleccionado { get { return DropL.SelectedValue; } set { _valorSeleccionado = value; DropL.SelectedValue = value; } }En VB.NET
Private _valorSeleccionado As String Public Property ValorSeleccionado() As String Get Return DropL.SelectedValue End Get Set _valorSeleccionado = value DropL.SelectedValue = value End Set End Property
NOTA 1.a) Veras que tengo una propiedad publica (que me encapsula el SelectValue) aqui la llame ValorSeleccionado para que se visualice bien la diferencia. Y tambien tengo una propiedad privada... Porque como no sabemos como estas "rellenando con datos" ese DropDownlist. Puede ser que quieras asignar un valor y todavia no tengas datos enlazados
Esto que lo que te quiero decir:protected void Page_Init(object sender, EventArgs e) { CargarEspecies(); } private void CargarEspecies() { using (var especiesRepo = new EspecieRepository()) { ddlEspecie.DataSource = especiesRepo.Listado(); ddlEspecie.DataBind(); ddlEspecie.SelectedValue = _valorSeleccionado; } }Pero bueno si tienes problemas aqui comentamos y vemos como lo hacesNOTA 1.b): Lo que no nos muestas es como rellenas el control DropL den UC Lect.ascx
TEMA 2: Insertar el UserControl dentro de una Columna ItemTEmplate del Gridview
Aqui no tienes problemas. Pero lo dejo plasmado para el que necesita... Solo es crear la columna ItemTemplate y arrastrar el control en el ModoEdicion de TEmplates (o sino escribir en el codigo HTML lo que se necesita)
Quedaria algo asi:<%@ Register src="../Control/Lect.ascx" tagname="Lect" tagprefix="uc13" %> .... <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False"> <Columns> .... <asp:TemplateField HeaderText="Especie"> <ItemTemplate> <uc13:Lect ID="Lect1" runat="server" ValorSeleccionado="<%# ((Cliente)Container.DataItem).TipoCategoriaId %>" /> </ItemTemplate> </asp:TemplateField> ... </Columns> </asp:GridView>
Podras ver que para enlazar la propiedad de nuestro UserControl en cuestion "ValorSeleccionado" con el objeto enlazado al gridview (en esa fila particular) colocamos un enlace de binding
Entonces eso es el TEMA 3...
TEMA 3: Asignarle un valor seleccionado dependiendo de un valor de un campo del item enlazado a la fila del gridview
Podras ver que no es necesario ir al codebehind al evento de binding del gridview. Ya que podemos enlazar en modo diseño
En C#<uc13:Lect ID="Lect1" runat="server" ValorSeleccionado="<%# ((Cliente)Container.DataItem).TipoCategoriaId %>" />
En VB.NET (esto escribo directamente, me puedo equivocar en algo... hace varios años no utilizo VB.NET)
<uc13:Lect ID="Lect1" runat="server" ValorSeleccionado="<%# Container.DataItem.TipoCategoriaId %>" />
O sino probar con un Ctype rotundo ;)
<uc13:Lect ID="Lect1" runat="server" ValorSeleccionado="<%# (Ctype(Container.DataItem, Cliente)).TipoCategoriaId %>" />
Con esto entonces esta lo que necesitas?
Comentanos como te fue implementando esto o algo similar, pero recuerda colocar codigo.. para que no estemos adivinando como lo estas implementando.
Espero que te sirva de ayuda o guia.
Jose. A Fernandez | blog: http://geeks.ms/blogs/fernandezja
Gracias por responder. A pesar que tu explicación es muy clara, todavía no logro comprender bien.
Este control ya lo tengo asociado a una clase y propiedades, claro tu aporte es valioso. Si este control ascx lo ubico en la página, este me funciona bien. He estado trabajando con controles, pero dentro del Gridview no.
En lo que escribes, no comprendo esto:
ValorSeleccionado="<%# ((Cliente)Container.DataItem).TipoCategoriaId %>" />
El por qué utilizo código dentro del RowDataBound: Lo hago porque, dependiendo, necesito tener un registro en blanco dentro del gridview.
Sigue mi inquietud en este punto: CType(e.Row."Pienso que debería ir el control ascx (uc13".FindControl("DropObs"), DropDownList)
-
lunes, 14 de mayo de 2012 13:06
Estimado Campeon_01
Cuando escribes:
"...Este control ya lo tengo asociado a una clase y propiedades, claro tu aporte es valioso. Si este control ascx lo ubico en la página, este me funciona bien. He estado trabajando con controles, pero dentro del Gridview no...."La idea general es que tu control ascx exponga todas las propiedades que desde "afuera" para que no tengas que "explorar"/"buscar" dentro del objeto. asi puedes asignar directamente como si fuera la propiedad .Text de cualquier control. Pero en esta propiedad que te propongo es el ValorSeleccionado de un control dentro del UserControl (esta es la idea general)
Lo que te comento es para simplificar la forma que estas realizando esta tarea y sacar provecho de propiedades (encaspular controles dentro de usercontrol) y asignar dicho valor directamente en el diseño (sin necesidad de ir al codebehind, escribiendo en el evento de la grilla)
Es decir en vez de esto:
Para asignar un valor al combo que esta dentro del usercotrol... buscas dentro del UC y haces un unboxing al convertirlo para que te de la propiedad,
CType(e.Row.FindControl("DropObs"), DropDownList).SelectedValue = unValor;Incluso esto lo tienes que hacer en el evento RowDataBound del Gridview, y para no escribir la columna a enlazar (algun ID de clave foranea) estas utilizando Datakey. A lo que voy esto esta muy bien., solo que hay una forma de hacerlo mas facil (de modificar) y de que este mejor encapsulado tu UserControl
Hoy haces esto en el evento RowDataBound:CType(e.Row.FindControl("DropObs"), DropDownList).SelectedValue = GridObsv.DataKeys(e.Row.RowIndex).Values(0).ToStringLa idea es que puedas:
- EN TU USERCONTROL: Deberias encapsular el valor seleccionado en una propiedad
Esto se entiende? mas arriba coloque el codigo. (en el post anterior)
Es simple, es una propiedad que encapsula la implementacion.
La propiedad es ValorSeleccionado (que si ves mas arriba) encapsula dentro del UserControl el valor seleccionado para asignar al un control (en este caso al dropdownlist)
Esto lo tiene que escribir en el codebebind del UserControl
- Insertar el UserControl dentro de una Columna ItemTEmplate del Gridview
Aqui es facil. Insertarlo ya lo tienes
- ASIGNAR UN VALOR
La idea es asignar un valor a la propiedad del UserControl
Tu grilla se esta enlazando a datos, a un listado de objetos no? que tipo de datos son? (dime si son objetos de negocio o es un simple datatable para ayudarte mejor)
Si por ejemplo tu gridview se enlaza un listado de objetos Cliente, y este tiene una propiedad TipoCategoriaId, podrias hacer asi
<asp:TemplateField HeaderText="Especie"> <ItemTemplate> <uc13:Lect ID="Lect1" runat="server" ValorSeleccionado="<%# Container.DataItem.TipoCategoriaId %>" /> </ItemTemplate> </asp:TemplateField>Se entiende? En que parte estas teniendo inconveinentes? pruebalo, escribe codigo y pasanos por aqui el inconveniente puntual
Avisame que tal te va... asi a la tarde /cuando termine de trabajar pueda ayudar mejor con un ejemplo que postee en mi blog. Asi queda registro y algo para ver y tocar ;)
Espero que te sirva de ayuda o guia
Jose. A Fernandez | blog: http://geeks.ms/blogs/fernandezja
- EN TU USERCONTROL: Deberias encapsular el valor seleccionado en una propiedad
-
martes, 15 de mayo de 2012 5:19
Estimado Campeon_01
Cuando escribes:
"...Este control ya lo tengo asociado a una clase y propiedades, claro tu aporte es valioso. Si este control ascx lo ubico en la página, este me funciona bien. He estado trabajando con controles, pero dentro del Gridview no...."La idea general es que tu control ascx exponga todas las propiedades que desde "afuera" para que no tengas que "explorar"/"buscar" dentro del objeto. asi puedes asignar directamente como si fuera la propiedad .Text de cualquier control. Pero en esta propiedad que te propongo es el ValorSeleccionado de un control dentro del UserControl (esta es la idea general)
Lo que te comento es para simplificar la forma que estas realizando esta tarea y sacar provecho de propiedades (encaspular controles dentro de usercontrol) y asignar dicho valor directamente en el diseño (sin necesidad de ir al codebehind, escribiendo en el evento de la grilla)
Es decir en vez de esto:
Para asignar un valor al combo que esta dentro del usercotrol... buscas dentro del UC y haces un unboxing al convertirlo para que te de la propiedad,
CType(e.Row.FindControl("DropObs"), DropDownList).SelectedValue = unValor;Incluso esto lo tienes que hacer en el evento RowDataBound del Gridview, y para no escribir la columna a enlazar (algun ID de clave foranea) estas utilizando Datakey. A lo que voy esto esta muy bien., solo que hay una forma de hacerlo mas facil (de modificar) y de que este mejor encapsulado tu UserControl
Hoy haces esto en el evento RowDataBound:CType(e.Row.FindControl("DropObs"), DropDownList).SelectedValue = GridObsv.DataKeys(e.Row.RowIndex).Values(0).ToStringLa idea es que puedas:
- EN TU USERCONTROL: Deberias encapsular el valor seleccionado en una propiedad
Esto se entiende? mas arriba coloque el codigo. (en el post anterior)
Es simple, es una propiedad que encapsula la implementacion.
La propiedad es ValorSeleccionado (que si ves mas arriba) encapsula dentro del UserControl el valor seleccionado para asignar al un control (en este caso al dropdownlist)
Esto lo tiene que escribir en el codebebind del UserControl
- Insertar el UserControl dentro de una Columna ItemTEmplate del Gridview
Aqui es facil. Insertarlo ya lo tienes
- ASIGNAR UN VALOR
La idea es asignar un valor a la propiedad del UserControl
Tu grilla se esta enlazando a datos, a un listado de objetos no? que tipo de datos son? (dime si son objetos de negocio o es un simple datatable para ayudarte mejor)
Si por ejemplo tu gridview se enlaza un listado de objetos Cliente, y este tiene una propiedad TipoCategoriaId, podrias hacer asi
<asp:TemplateField HeaderText="Especie"> <ItemTemplate> <uc13:Lect ID="Lect1" runat="server" ValorSeleccionado="<%# Container.DataItem.TipoCategoriaId %>" /> </ItemTemplate> </asp:TemplateField>Se entiende? En que parte estas teniendo inconveinentes? pruebalo, escribe codigo y pasanos por aqui el inconveniente puntual
Avisame que tal te va... asi a la tarde /cuando termine de trabajar pueda ayudar mejor con un ejemplo que postee en mi blog. Asi queda registro y algo para ver y tocar ;)
Espero que te sirva de ayuda o guia
Jose. A Fernandez | blog: http://geeks.ms/blogs/fernandezja
Saludos.
Te explico lo que hago, pero pondré en práctica tu ejemplo del post anterior:
Tengo una base de datos en Sql Server y en particular una tabla que contiene años: 2009, 2010, 2011, 2012, ….
Estos años representan para mí un periodo que va desde enero a diciembre (podría ser otro tipo de información).
En lo que vengo realizando, necesito reutilizar esta información y para no estar escribiendo lo enlazo a un control DropDownList en un control ascx
Archivo ascx para reutilizar con el nombre de: Lect.ascx
<%@ Control Language="VB" AutoEventWireup="false" CodeFile="Lect.ascx.vb" Inherits="Control_Lect" %>
<asp:DropDownList ID="DropL" runat="server" AppendDataBoundItems="True"
AutoPostBack="True" DataTextField="PerLect" DataValueField="Lec"
Font-Names="Arial" Font-Size="Small">
<asp:ListItem Value="-1">Seleccione un período</asp:ListItem>
</asp:DropDownList>
Para alimentar este control lo hago mediante una consulta utilizando un Dim rd As SqlDataReader= cmd.ExecuteReader() en una función que devuelve un array. Aplico propiedades mediante el uso de clase (código subyacente vb) asp.net
Nota: en este punto implementaré tu recomendación y luego te comento.
Hice un cambio que fue mover el código del evento load al evento Init y ya puedo ver este control dentro del gridview, sin ningún problema (existe un pero).
Inconveniente:
El gridview contiene una columna para período (control ascx), una columna para que el usuario pueda escribir un texto de 100 o más caracteres, una fecha y un botón de comando con el nombre de nuevo, que me permite crear otro registro en blanco y el usuario pueda escribir una fecha, otra observación, así sucesivamente.
Para hacer lo anterior, utilizo un datatable que lo enlazo al controlsource del gridview.
En el planteamiento no enlazo la tabla de la base de datos directamente con el control gridview y sé que se puede hacer, pero mi preferencia es hacerlo de esta manera.
Si arrastro un control dropDownList del cuadro de herramienta puedo leerlo mediante código utilizando esta instrucción sin inconveniente alguno:
CType(e.Row.FindControl("DropObs"), DropDownList).SelectedValue = unValor;
o esta otra:
CType(e.Row.FindControl("DropObs"), DropDownList).SelectedValue = GridObsv.DataKeys(e.Row.RowIndex).Values(0).ToString
Este DropObs que viene siendo un DropDownList funciona bien, si es arrastrado directamente del cuadro de herramientas, es decir, que no está asociado a ningún control ascx. Esta forma ya la he utilizado y todo perfecto.
Nota:
Cuando escribo: CType(DropObs.FindControl("DropL"), DropDownList).SelectedValue = "2012"
Significa para mí uc13: DropObs con el siguiente encabezado en la página aspx.
Página aspx
...
<%@ Register src="../Control/Lect.ascx" tagname="Lect" tagprefix="uc13" %>
uc13 me llama a un archivo físico con el nombre de Lect.ascx y DropL al control DropDownlist que se encuentro dentro de Lect.ascx.
......
Lo que escribo como nota, perfecto, sin ningún problema.
Mi dolor de cabeza, quiero leerlo dentro del GridView y no sé cómo hacerlo?
En esta instrucción: CType(DropObs.FindControl("DropL"), DropDownList).SelectedValue = "2012"que funciona bien por fuera del gridview, pero requiero poder leerlo dentro del gridview y entiendo que a esta instrucción CType(e.Row.FindControl("DropObs"), DropDownList).SelectedValue le hace falta: DropL
Su forma correcta de escribirlo cuál es, si es que se puede?
Por qué no he puesto en práctica tu recomendación: porque no comprendo esta instrucción: "<%# Container.DataItem.TipoCategoriaId %>" />
No sé qué es container y tipoCategiaId en este caso en particular.
- EN TU USERCONTROL: Deberias encapsular el valor seleccionado en una propiedad
-
jueves, 17 de mayo de 2012 1:38
Estimado Campeon_01
Cuando escribes:
"...Este control ya lo tengo asociado a una clase y propiedades, claro tu aporte es valioso. Si este control ascx lo ubico en la página, este me funciona bien. He estado trabajando con controles, pero dentro del Gridview no...."La idea general es que tu control ascx exponga todas las propiedades que desde "afuera" para que no tengas que "explorar"/"buscar" dentro del objeto. asi puedes asignar directamente como si fuera la propiedad .Text de cualquier control. Pero en esta propiedad que te propongo es el ValorSeleccionado de un control dentro del UserControl (esta es la idea general)
Lo que te comento es para simplificar la forma que estas realizando esta tarea y sacar provecho de propiedades (encaspular controles dentro de usercontrol) y asignar dicho valor directamente en el diseño (sin necesidad de ir al codebehind, escribiendo en el evento de la grilla)
Es decir en vez de esto:
Para asignar un valor al combo que esta dentro del usercotrol... buscas dentro del UC y haces un unboxing al convertirlo para que te de la propiedad,
CType(e.Row.FindControl("DropObs"), DropDownList).SelectedValue = unValor;Incluso esto lo tienes que hacer en el evento RowDataBound del Gridview, y para no escribir la columna a enlazar (algun ID de clave foranea) estas utilizando Datakey. A lo que voy esto esta muy bien., solo que hay una forma de hacerlo mas facil (de modificar) y de que este mejor encapsulado tu UserControl
Hoy haces esto en el evento RowDataBound:CType(e.Row.FindControl("DropObs"), DropDownList).SelectedValue = GridObsv.DataKeys(e.Row.RowIndex).Values(0).ToStringLa idea es que puedas:
- EN TU USERCONTROL: Deberias encapsular el valor seleccionado en una propiedad
Esto se entiende? mas arriba coloque el codigo. (en el post anterior)
Es simple, es una propiedad que encapsula la implementacion.
La propiedad es ValorSeleccionado (que si ves mas arriba) encapsula dentro del UserControl el valor seleccionado para asignar al un control (en este caso al dropdownlist)
Esto lo tiene que escribir en el codebebind del UserControl
- Insertar el UserControl dentro de una Columna ItemTEmplate del Gridview
Aqui es facil. Insertarlo ya lo tienes
- ASIGNAR UN VALOR
La idea es asignar un valor a la propiedad del UserControl
Tu grilla se esta enlazando a datos, a un listado de objetos no? que tipo de datos son? (dime si son objetos de negocio o es un simple datatable para ayudarte mejor)
Si por ejemplo tu gridview se enlaza un listado de objetos Cliente, y este tiene una propiedad TipoCategoriaId, podrias hacer asi
<asp:TemplateField HeaderText="Especie"> <ItemTemplate> <uc13:Lect ID="Lect1" runat="server" ValorSeleccionado="<%# Container.DataItem.TipoCategoriaId %>" /> </ItemTemplate> </asp:TemplateField>Se entiende? En que parte estas teniendo inconveinentes? pruebalo, escribe codigo y pasanos por aqui el inconveniente puntual
Avisame que tal te va... asi a la tarde /cuando termine de trabajar pueda ayudar mejor con un ejemplo que postee en mi blog. Asi queda registro y algo para ver y tocar ;)
Espero que te sirva de ayuda o guia
Jose. A Fernandez | blog: http://geeks.ms/blogs/fernandezja
Saludos.
Después de varios intentos, esta instrucción me da el resultado deseado:
CType(e.Row.FindControl("DropObs").FindControl("DropL"), DropDownList).SelectedItem.Text = GridObsv.DataKeys(e.Row.RowIndex).Values(0).ToString
DropObs = uc13 y en register de la página aspx es el archivo ascx.
DropL = DropDownList que se encuentra dentro de la página ascx (control de usuario).
Nota: trato de aplicar tu post anterior, pero no se como manejar o que ubicar en este punto:
ValorSeleccionado="<%# Container.DataItem.TipoCategoriaId %>" /> quiero decir: "<%# Container.DataItem.TipoCategoriaId %>" />
Tu recomendación la considero apropiada.
Muchísima gracias por tu aporte, ha si de gran ayuda, pero sigo inquieto en el punto mencionado líneas atrás.
- EN TU USERCONTROL: Deberias encapsular el valor seleccionado en una propiedad
-
martes, 22 de mayo de 2012 4:50
Estimado Campeon_01
Con respecto al punto que tienes inconvenientes
<asp:TemplateField HeaderText="Especie"> <ItemTemplate> <uc13:Lect ID="Lect1" runat="server" ValorSeleccionado="<%# Container.DataItem.TipoCategoriaId %>" /> </ItemTemplate> </asp:TemplateField>Tu mas arriba escribes que haces esto
CType(e.Row.FindControl("DropObs"), DropDownList).SelectedValue = GridObsv.DataKeys(e.Row.RowIndex).Values(0).ToStringQuisiera para responderte a tu inquitud que me digas
- COmo rellenas tu objeto gridview? con que listado? que tipo de datos es el listado
Ejemplo: List<Cliente> (listado de clientes), en VB.NET era asi no? LIst<Of Cliente>?? - Cual es la propiedad que quieres enlazar al SelectValue del dropdown list interno?
Ejemplo: Si tu gridview se enlaza a Clientes, cual es la propiedad de clientes q quieres asignar al SelectValue?
Jose. A Fernandez | blog: http://geeks.ms/blogs/fernandezja
- Marcado como respuesta Campeon_01 miércoles, 23 de mayo de 2012 3:46
- COmo rellenas tu objeto gridview? con que listado? que tipo de datos es el listado
-
miércoles, 23 de mayo de 2012 3:48
• COmo rellenas tu objeto gridview? con que listado? que tipo de datos es el listadoEstimado Campeon_01
Con respecto al punto que tienes inconvenientes
<asp:TemplateField HeaderText="Especie"> <ItemTemplate> <uc13:Lect ID="Lect1" runat="server" ValorSeleccionado="<%# Container.DataItem.TipoCategoriaId %>" /> </ItemTemplate> </asp:TemplateField>Tu mas arriba escribes que haces esto
CType(e.Row.FindControl("DropObs"), DropDownList).SelectedValue = GridObsv.DataKeys(e.Row.RowIndex).Values(0).ToStringQuisiera para responderte a tu inquitud que me digas
- COmo rellenas tu objeto gridview? con que listado? que tipo de datos es el listado
Ejemplo: List<Cliente> (listado de clientes), en VB.NET era asi no? LIst<Of Cliente>?? - Cual es la propiedad que quieres enlazar al SelectValue del dropdown list interno?
Ejemplo: Si tu gridview se enlaza a Clientes, cual es la propiedad de clientes q quieres asignar al SelectValue?
Jose. A Fernandez | blog: http://geeks.ms/blogs/fernandezja
Ejemplo: List<Cliente> (listado de clientes), en VB.NET era asi no? LIst<Of Cliente>??
Trabajo con SQL SERVER y Visual Studio .Net.
Del Visual Studio lo hago con Asp.net y Subyacente con Visual Basic. Por decir: Página ejemplo.aspx y código Subyacente ejemplo.aspx.vb.
Tengo un Web User Control con el nombre de: Lect.ascx. En este Web User Control lo lleno desde una tabla de una base de datos SQL SERVER. Este DropDownList tiene el nombre de: DropL
Control DropL que se encuentre en Archivo Web User Control Lect.ascx
Partial Class Control_Lect
Inherits System.Web.UI.UserControl
Protected Sub Page_Init(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Init
LectLoad()
End Sub
Private Sub LectLoad()
Dim Lecti As Samples_Drop. SourceDB = New Samples_Drop.SourceDB
DropLectivo.DataSource = Lecti. LecFuncion ()
DropLectivo.DataTextField = "lects"
DropLectivo.DataValueField = "periodLect"
DropLectivo.DataBind()
End Sub
End Class
Para llenar este control tengo una clase con el nombre SourceDB.vb Dentro de esta clase llamo a una función con el nombre LecFuncion que contienen el Select … From … de SQL con una propiedades Lects y periodLect
La propiedad que necesito enlazar del control DropDownList es: Lects
Nota: Así como esta, funciona bien, mientras no lo incluya dentro de un Item Template de un GridView en la página ejemplo.ascx. Si estoy fuera del control GridView en la página ejemplo.aspx, puedo arrastrar uno, o dos o más controles Lect.ascx que en tiempo de ejecución la información se rellena y puedo elegir y/o utilizar la información contenida en este control DropDownList.
En resumen, todo funciona bien, siempre y cuando no incluya el control Lect.ascx dentro de un DropDownList. Aque me refiero, cuál es la instrucción precisa para capturar el valor seleccionado?.
• Cual es la propiedad que quieres enlazar al SelectValue del dropdown list interno?
Ejemplo: Si tu gridview se enlaza a Clientes, cual es la propiedad de clientes q quieres asignar al SelectValue?
La propiedad que necesito enlazar del control DropDownList es: Lects
En esta instrucción: CType(e.Row.FindControl("DropObs"), DropDownList).SelectedValue = GridObsv.DataKeys(e.Row.RowIndex).Values(0).ToString
Por qué la utilizo:
El control GridView contiene varios campos de una tabla.
Antes de: Consulto algunos campos de una tabla que se encuentra en sql server y los asigno a un datatable. Este datatable se lo asigno al control GridView. Este control GridView en tiempo de ejecución necesita tener registros en blanco para que el usuario pueda adicionar nueva información. Según la necesidad de hacerlo es, que el usuario pueda insertar o modificar desde cero registros, hasta un máximo de 10. Pienso que en un número superior a 10, correspondería utilizar otra estrategia para evitar tener tanto registro en memoria para luego guardar directamente en las tablas.
Estando en el control GridView, al crear un registro en blanco, la elección que se hizo utilizando el control DropDownList, no se conserva y cuando viene de una consulta hecha a la tabla, lo que hago es que el control DropDownlist refresque o se actualice.
Podría decirse: que el usuario al visualizar una consulta, el usuario pueda modificar, eliminar e insertar. Claro está, hasta un máximo de 10 registros, para este caso en particular.
ValorSeleccionado="<%# Container.DataItem.TipoCategoriaId %>" />
He tratado de implementarla, pero no tengo claro algunos conceptos para su manejo-
- COmo rellenas tu objeto gridview? con que listado? que tipo de datos es el listado

