domingo, 12 de junio de 2011

[ASP.NET][GridView] - Como seleccionar una fila

 

Introducción


He visto en reiteradas oportunidad que una operación simple como es el caso de operar con una fila de un GridView se puede transformarse en algo complejo, mas que nada motivado por la distintas formas que hay para realizar esta acción.

En este articulo veremos las algunas formas de lograrlo y como difieren las técnicas que se puede aplicarse.

Temas que se tratar:

1- Seleccionar una Row

a- Definiendo un CommandField

b- Usando un ImageButton y CommandName

c- Usando el evento RowCommand

2-Uso de DataKeyNames y DataKeys

   a- DataKeyNames con campos Múltiples

Para todos los casos planteados partiremos del mismo gridview, el cual se ira modificando para agregarle opciones y ver los distintos temas.

 

1- Seleccionar una Row


Existen varias formas de realizar una misma tarea, pero veremos aquí las dos mas simples y directas que se suelen encontrar cuando se necesita seleccionar un registro en el control gridview.

1a- Definiendo un CommandField

Iremos realizando los paso de forma visual así se comprende como proceder, remarcando luego como impacta esto en el html del grid

El primer paso será editar las columnas del GridView hasta visualizar el cuadro con las opciones de CommandField disponibles.

imagen1

imagen2

Para este caso en particular se agregara solo la opción de selección. Mediante las flechas laterales se puede posicionar el comando. También se dispone de distintos tipos de representación visual, como ser un Link, Button o Image.

imagen3

Para este caso usaremos un comando del tipo Image, por lo tanto se deberá definir la propiedad “SelectImageUrl”. Si se define del tipo Link y se quiere cambiar el texto, se usaría la propiedad “SelectText”.

El próximo paso será el de definir el evento de selección, para esto solo marcamos el gridview, y yendo a sus propiedades se podrá activar el evento SelectedIndexChanged

imagen4

El html resultante debería tener resaltadas las siguiente características

 imagen5

Con estos pasos ya estamos listos para capturar la acción de selección del gridview.

 

1b - Usando un ImageButton y CommandName

En esta alternativa se hará uso de un TemplateField, se procede de la misma forma del paso 1a, pero se agrega un item diferente

imagen6

Una vez que esta el témplate, se adapta modificando directamente en el html, incluyendo de esta forma el control ImageButton.

Es muy importante remarcar que el ImageButton deberá tener la propiedad CommandName=”Select” para que esta ejecute el evento SelectedIndexChanged

imagen7

A nivel de código de la pagina se encontrara la definición del evento

imagen8

Hay que aclarar que en este caso se uso un ImageButton para corresponder con la acción del punto 1a, en donde se define una imagen, pero si se requiere de un link solo será cuestión de usar un LinkButton, definiendo en este el CommandName=”Select”, es justamente el CommandName quien define que evento será lanzado al presionarse.

 

1c- Usando el evento RowCommand

Seguramente a estas alturas se preguntaran que cantidad de formas de hacer lo mismo, asi es, y para completarlo una opción extra.

Resulta que al definir un ImageButton (o LinkButton) en un TemplateItem y usar el CommandName=”Select” se habilita un evento adicionar para poder capturar esta acción, si es que el SelectedIndexChanged no nos convence.

Se trata del evento RowCommand.

Hay un pequeño detalle con este evento y se trata de la definición del CommandArgument para determinar que fila lanza la acción.

imagen9

[C#]

protected void gvPerson_RowCommand(object sender, GridViewCommandEventArgs e)
{
    if (e.CommandName == "Select")
    {
        //
        // Se obtiene indice de la row seleccionada
        //
        int index = Convert.ToInt32(e.CommandArgument);
        
        //
        // Obtengo el id de la entidad que se esta editando
        // en este caso de la entidad Person
        //
        int id = Convert.ToInt32(gvPerson.DataKeys[index].Value); 

    }

}

[VB.NET]

Protected Sub gvPerson_RowCommand(sender As Object, e As GridViewCommandEventArgs)
	
        If e.CommandName = "Select" Then
		'
		' Se obtiene indice de la row seleccionada
		'
		Dim index As Integer = Convert.ToInt32(e.CommandArgument)

		'
		' Obtengo el id de la entidad que se esta editando
		' en este caso de la entidad Person
		'

		Dim id As Integer = Convert.ToInt32(gvPerson.DataKeys(index).Value)
	End If

End Sub

En el ejemplo de la pagina WebForm4.aspx, se podrá probar como ambos eventos, tanto el RowCommand y el SelectedIndexChanged, pueden definirse, aunque lo normal es utilizar solo uno de estos.

 

2 - Uso de DataKeyNames y DataKeys


Una de las mejores técnicas usada para detectar que entidad se esta editando o seleccionado es por medio de id o código que esta tenga asignada, pero como logar hacerlo sin mostrar el identificador al usuario en una columna ?, es justamente el trabajo de estas dos propiedades que se consigue resolver el problema.

Si se presta atención al html este contaba con al definición de esta propiedad de nombre DataKeyNames

imagen10

Solo debe definirse que campo del origen de datos identifica a la entidad que se esta trabajando.

Cuando se lance el evento solo será cuestión de tomar la row que ejecuta la acción, y de esta, por el índice recuperar el valor del id de la entidad, en este caso el PersonID.

[C#]

protected void gvPerson_SelectedIndexChanged(object sender, EventArgs e)
{
    //
    // Se obtiene la fila seleccionada del gridview
    //
    GridViewRow row = gvPerson.SelectedRow;

    //
    // Obtengo el id de la entidad que se esta editando
    // en este caso de la entidad Person
    //
    int id = Convert.ToInt32(gvPerson.DataKeys[row.RowIndex].Value);


}

[VB.NET]

Protected Sub gvPerson_SelectedIndexChanged(sender As Object, e As EventArgs)
	'
	' Se obtiene la fila seleccionada del gridview
	'
	Dim row As GridViewRow = gvPerson.SelectedRow

	'
	' Obtengo el id de la entidad que se esta editando
	' en este caso de la entidad Person
	'
	Dim id As Integer = Convert.ToInt32(gvPerson.DataKeys(row.RowIndex).Value)


End Sub

2a- DataKeyNames con campos Múltiples

En este ejemplo solo se utilizo un valor simple para identificar a la entidad, pero el CommandName puede definir mas de un campo de información.

Por ejemplo que sucede si se quiere enviar el PersonId y el Nombre, esto es tan solo un ejemplo para demostrar las funcionalidad, no tiene una aplicación práctica en este caso, ya que con solo el PersonID seria mas que suficiente.

Para definir el DataKeyNames en el grid es tan simple como separar los campos por una coma.

imagen11

y en el código solo se toma el valor de la propiedad Values

[C#]

protected void gvPerson_SelectedIndexChanged(object sender, EventArgs e)
{
    //
    // Se obtiene la fila seleccionada del gridview
    //
    GridViewRow row = gvPerson.SelectedRow;

    //
    // Obtengo el id y el nombre  de la entidad que se esta editando
    // en este caso de la entidad Person
    //
    int id = Convert.ToInt32(gvPerson.DataKeys[row.RowIndex].Values["PersonID"]);

    string nombre = Convert.ToString(gvPerson.DataKeys[row.RowIndex].Values["FirstName"]);


}

[VB.NET]

Protected Sub gvPerson_SelectedIndexChanged(sender As Object, e As EventArgs)
	'
	' Se obtiene la fila seleccionada del gridview
	'
	Dim row As GridViewRow = gvPerson.SelectedRow

	'
	' Obtengo el id y el nombre  de la entidad que se esta editando
	' en este caso de la entidad Person
	'
	Dim id As Integer = Convert.ToInt32(gvPerson.DataKeys(row.RowIndex).Values("PersonID"))

	Dim nombre As String = Convert.ToString(gvPerson.DataKeys(row.RowIndex).Values("FirstName"))


End Sub

Ejemplo Código


Para el ejemplo se hizo uso de Visual Studio 2008 con SP1, el service pack es útil para poder hacer uso de Entity Framework y poder crear el ADO.NET Entity Data Model haciendo simple el acceso a la db.

La base de datos es Sql Server 2008 Express R2, y se encuentra el mdf dentro de la carpeta App_Data, pero se podría adjuntar al servicio de Sql Server o hacer uso del script que se encuentra en el proyecto de DataAccess.

 

 

129 comentarios:

Augusto dijo...

Leandro no he podido ejecutar tu ejemplo cuales son los requisitos tengo visual studio 2008 y sql 2005

Leandro Tuttini dijo...

hola Augusto

Justo arriba del link menciono lo que use para desarrollarlo:
VS2008 SP1 y SQL Server Express R2
sino puedes tomar el script y ejecutarlo para crear la db en sql2005

saludos

jor ge dijo...

leandro como estas, te cuento que estoy desarrollando una aplicacion pero mi duda es en el momento de ejecutar una insercion en una tabla como se valida el campo clave para que no me repitan el mismo valor de la llave primaria para que no me rebiente el programa el error de la base de datos te agradeceria cualquier ayuda gracias

Leandro Tuttini dijo...

hola jorge

Te comento que la solucion a este problema puede evitar si validas previamente si existe o no la entidad con ese id (o codigo) en particular.

Revisa el artículo

[ADO.NET] – Parte 5 - Ejemplos Simples – Operaciones CRUD

Alli veras un metodo de nombre Exist() analiza el codigo que uso en este y veras como validar si ese id existe y poder actuar en consecuencia, o sea en el ejemplo si existe actualiza, sino existe inserta

saludos

Alexandra dijo...

Hola Leandro, tengo el siguiente problema cuando intento probar el ejemplo :"El tipo o el nombre del espacio de nombres 'Objects' no existe en el espacio de nombres 'System.Data' (¿falta una referencia de ensamblado?)" y todos los errores de este tipo apuntan a este archivo :
"School.Designer.cs" y también he notado que no se reconoce la referencia a System.Data.Entity . Alguna idea de como podría solucionarlo.
Gracias

Leandro Tuttini dijo...

hola Alexandra

Has verificado si tienes instalado el SP1 del VS2008 ?

lo pregunto porque sino recuerdo mal para poder usar Entity Framework requieres de service pack

lo que me extraña es lo del Object, pero puede deberse a un problema causado por otro errores, primero validaria si no es el SP, como para descartar este punto

si ingresas al edmx, puedes ver el diseño del Entity Framework

saludos

Alexandra dijo...

Ok,tenias razón necesitaba SP1, una vez instalado se soluciono todo, ahora solo me quedan dos dudas:
1. Cuando haces uso del CommandArgument le pasas el indice de la fila asi: "<%# ((GridViewRow)Container).RowIndex %>", pero si hago eso obtengo este error : : "'GridViewRow' es un tipo y no se puede usar como expresión." y por eso he tenido que usar esto para pasar el indice de la fila: "<%# Container.DataItemIndex %>". Lo curioso es que en el archivo que descargue de tu blog funciona correctamente, tiene algo que ver que el tuyo este es C# y el mio en VB??

2. He notado que siempre que vas a usar un evento de un control,en este caso onselectedindexchanged y onrowcommand, lo indicas en el markup de la pagina,sin embargo también he notado que si los quito no se ve afectado el funcionamiento del evento y me gustaría saber si tiene alguna utilidad colocarlos también en el html??

Saludos

Leandro Tuttini dijo...

hola Alexandra

1-
Claro, el tema es que en este articulo no he puesto el ejemplo en vb.net
y justamente alli cambia, en vb.net deberias ser:

DirectCast(Container, GridViewRow).RowIndex


2 -
si estas programando en vb.net puede que esto tenga algo que ver

valida si justo a la definicion del metodo en el codigo vb.net no defines un Handles, algo como ser:

Protected Sub gvPerson_SelectedIndexChanged(sender As Object, e As EventArgs) Handles gvPerson.SelectedIndexChanged

si logras ver que esta asi declarado, es porque vb.net ya adjunta el evento de esta forma

saludos

Andrea dijo...

Gracias!! alfin me funciono! era justo lo que necesitaba ^^

Fabi dijo...

Gracias!!!...no sabes como me sirvio

AlberCD dijo...

Leandro muy buena tu publicación, tengo una duda mas o menos relacionada. si deseas que al momento de seleccionar una fila del gridview se ejecute un codigo html, como le harias? o mejor dicho, se puede?

Leandro Tuttini dijo...

hola AlberCD

bueno en realidad habria que ver a que llamas ejecutar, imagino que sera visualizar esa pagina

en ese caso en el evento tal cual se explica en el articulo podrias usar el:
Response.Redirect("pagina.html")

con eso mostraria en la pantalla la pagina html

saludos

Marcelo dijo...

Hola Leandro, excelente tu artículo, pero tengo una duda...en un gridview con checkboxs, cómo hago para conocer el rowIndex del checkbox presionado?
Esa es mi duda, muchos saludos,
Marcelo.

Blog Personal dijo...

Excelente post, felicitaciones.. así deberían ser de claros todos los posts que hay en la red...

Javs dijo...

Muchas gracias, me fue muy útil!

Leandro Tuttini dijo...

hola Marcelo

el rowindex es algo concerniente al gridview no al check, este no tiene ningun rowindex por eso lo que tu recorres son las rows del grid

para luego buscar el check que contiene cada row que recorres y validas si esta marcada

pero el rowindex es de la instancia del row que en ese momento se este iterando

saludos

Cefer dijo...

Saludos.

Estimado por solicitar ayuda ya que tengo un proyecto en el cual tomo la información de una base sql y la muestro en un Gridview mi objetivo es: el campo idproducto quiero que sea link hacia otra pagina donde se muestra todas las caracteristicas del producto, en sintesis todos los registros idproductos muestren como links, en espera de su ayuda gracias.

Leandro Tuttini dijo...

hola Cefer

podrias tener en el ItemTemplate un LinkButton al cual le asignas el Eval() con el campo del id del producto y el CommandName="Select" para asi al presionarlo se lanza el SelectedIndexChanged del gridview donde realizarias la accion

saludos

Susana dijo...

Me sirvió muchimo tu ejemplo, solo que no puede visualizar como se hace al seleccionar la fila con el mouse (o esa no era una de las formas?)

Gracias !!1

Leandro Tuttini dijo...

hola Susana

te comento que como evento que lance una accion en el servidor un al seleccionar cualquier parte de uan fila no esta contemplado

porque la fila en si mismo se renderiza como un <tr> de html, por lo tanto no tiene un evento asociado en el servidor

se usan evento de botones link o image button que si se piensan para este tipo de acciones

saludos

Javier dijo...

Muy buen artículo Leandro pero tengo un problema si en lugar de un imagebutton el control que tengo es un check (Template) dentro de la columna de la grid y quiero usar el check de la grid para saber que fila se ha seleccionado no puedo, el Template check no tiene command.

Leandro Tuttini dijo...

hola Javier

es que ene ste caso no puedes lanzar una accion de uan fila con un check, proquee sta pensado para que trabajes con multiples

o sea tendrias el check donde marcarias uno, 2, n filas del grid y luego con un boton por fuera del grid lo usarias para confirmar y procesar esas filas marcadas

pro es una accion que lanzas desde otro boton por fuera, no desde la fila concreta del gridview, porque no trabjarias con una sola, trabjarias con la seleccion de varias

usarias el FindControl() dentro de un foreach para recorrer las row del grid y ver cuales estan marcadas

saludos

Alex Orellana dijo...

Leandro,

Soy novato en esto...

Estuve viendo algunos Temas tuyos que has desarrollo para el tema de la Edición de las Grillas en ASP.NET y me han servido bastante.
Pero me ha surgido el siguiente problema:

Tengo un gridview con lineas de ordenes de Ventas y modifico su precio y el descuento nada mas y realizo los calculos del importe de la linea y lo dejo en otra columna que es un textbox de solo lectura. El tema es que cuando me posiciono en otra fila y realizo los calculos al ejecutar los tab correspondientes las lineas anteriores los montos totales quedan vacios y me muestra LABELS en vez de un textbox.

La condicion es que los datos se modifiquen en el cliente y cuando éste se encuentre validado y aprobado recien ahi se manden al servidor con los datos de las lineas actualizadas.

NO se si me expresado bien, estoy programando en VB.NET 2010 con FrameWork 2. ESpero que me puedas ayudar a ver si es que me falta algun control o procedimiento ya que lo intentado todo.

Muchas Gracias.

Atte.

Alex Orellana

Leandro Tuttini dijo...

hola Alex

cuando presionas el tab de casualidad suas algun evento como ser el TextChanged del textbox que cause el postback? porque si es asi recuerda que el evento Page_Load tambien se eejcuta y si cargas alli el grid debes ponerlo dentro del

if(!IspostBack){
}

podrias sino hacer algo como esto

[ASP.NET] - GridView sumar columnas con jquery

saludos

Julio Coreas dijo...

Hola Leandro muchas gracias por responder a nuestras inquietudes, mi duda es la siguiente: yo tengo un gridview y en el tengo dos botones a los cuales les acabo de asignar CommandName="Select", y perfecto, me selecciona la fila, ahora el problema es que ese boton ya ejecutaba una accion al presionarlo pero ahora lo q quiero es que se seleccione la fila antes de ejecutar dicha accion. Gracias

Leandro Tuttini dijo...

hola Julio

no creo haber entendido la pregunta, o sea la accin causa un postback al server para poder programar el evento, esto hace que al retorno la fila quede resaltada

tienes los eventos SelectedIndexChanging y SelectedIndexChanged, o sea uno anted y despues de la accion de seleccion, pero ambos se presentan ante el posctack que causa el evento

saludos

Julio Coreas dijo...

Gracias por tu respuesta, Dejame explicarme un poco mejor, la cosa esta así:
Tengo un gridview el cual posee 3 botones de los cuales 2 he convertido en Templates, ahora estos botones 2 tienen programado ya el evento buttonClick el tercero solo es para seleccionar la fila,ahora,el evento de los 2 botones template hace uso de un campo dentro del GridView, el cual se obtiene al seleccionar antes la fila, para que pueda hacer uso del metodo Me.gridview1.SelectedRow.Cells(2) (por ejemplo), la manera en la que hago lo q necesito en estos momentos es que tengo un boton de seleccionar para marcar primero la fila y luego presionar uno de los dos botones templates para ejecutar dicha accion, lo que yo quiero evitarme es el boton seleccionar y que el mismo boton template me seleccione y luego ejecute su accion.
Espero haberme explicado mejor. Muchas Gracias

Leandro Tuttini dijo...

hola Julio

pero si estos 3 botones estan dentro del gridview nunca deberias usar el click de los botones
deberias definir el CommandName y usar el RowCommand del propio GridView

los controles que pones dentro del grid no deberian usar sus eventos sino que aprovechan los del gridview, por eso el commandname y en ese evento haces el switch para saber que accion se lanzo

saludos

Julio Coreas dijo...

Hola Leandro muchas gracias por contestar mi pregunta, en efecto utilice los metodos que mencionaste y funciono perfectamente.

Gracias por tu tiempo.

Eduardo Reusche dijo...

Hola Leandro una pregunta: sabes como hacer que me mande una alerta o un aviso cualkiera si dentro de una grilla modifico el dato de la column 3 tiene que ser igual o menor que la columna 2 osea he utlizado el.
TemplateField y ItemTemplate para agregar un text1 donde modifico los datos manualmente pero tengo ese detalle deseo que me avise en tiempo real por tambien lo podria hacer un boton que diga verificar o algo pero si se puede en tiempo real seria excelente!!

Leandro Tuttini dijo...

hola Eduardo

pero estas pasando a edicion gridview para que el usaurio ingrese esta info en los textbox?

podrias usar el
CompareValidator

es un control de validacion de asp.net, lo pondrias dentro del template de la row

saludos

Eduardo Reusche dijo...

Un Validator dentro de un gridview asu tendras algun ejemplo de eso? please te agradeceria bastante!!

Leandro Tuttini dijo...

hola Eduardo

la verdad no dispongo de un ejemplo implementado

pero basicamente es definir el itemtemplate de la columan poniendo el textbox y el control de validacion

lo que si recomendaria es que el mensaje del error no lo pongas en linea sino que configures para que se muestre un asterisco y si uses un validating summary para que se muestre alli el mensaje completo

pero despues la validacion se lanza sola

saludos

MIGUELL.. dijo...

tengo una duda cada que seleccionesmo una fila de GridView se hace un postback o se hace del lado del cliente?

Leandro Tuttini dijo...

hola MIGUELL

si defines un boton con un CommandName en un boton del gridview este lanzara un evento que genera un postback al servidor

en el cliente no se lanzara ninguna accion, salvo que en el template definas un boton de html y asignes alguna accion de javascript

o sea si usas controles de asp.net seguro lanzaran eventos al servidor

saludos

Anonymous dijo...

Buen dia Leandro, oye necesito ayuda, mira lo que pasa que estoy programando una base de datos con archivos, de los cuales subo y descargo estos archivos, lo estoy desarrollando en c# .net, utilizo un gridview para mostrarme los archivos pero no logro obtener resultado con un id que me apunte hacia el archivo para poderlo descargar, si lo descarga, pero tengo que dar el valor directo desde la programacion. Los archivos los estoy almacenando en la base de datos , uso sql server 2008.

Leandro Tuttini dijo...

hola Anonymous

la verdad no se si entendi el planteo
dices que son archivos, pero de que estilo son txt, archivos de base de datos como ser access, o sql compact

si tienes un id quiere decir que los archivos se relacionan con este en uan base de datos, sino como espweras que un id haga referencia a un archivo, quizas no debas usar una id sino que la key es el nombre del archivo para localizarlo

saludos

ignacio dijo...

Que pasa cuando la entidad tiene como atributo a otra entidad y quero usar un dato de esa otra entidad como key...se puede hacer esto?

Leandro Tuttini dijo...

hola ignacio

la verdad no entendi

en un gridview no representas objetos complejos, por lo que si pasas registros son con la key del objeto que has cargado no con sus asociados

saludos

Rafael dijo...

Hola Leandro soy nuevo en ASP.net y en C#, quisiera saber si me puedes ayudar en esto...
Tengo una columna en gridview que es un link para presentar un popup. ¿ como le hago para presentar los div?tengo esa columna en un template.

Rafael dijo...

Hola Leandro soy nuevo en C# y Asp.net, me puedes orientar como presentar un div. tengo el link en un gridview que esta en un template

Leandro Tuttini dijo...

hola Rafael

apuntas a algo como esto

[ASP.NET] PopUp Edición - Usando Jquery UI Dialog

o sea editar la row del grid en un popup
en este caso no use link ,pero si esta la imagen en un template del gridview

saludos

andersonhwsw dijo...

Hola, tengo una duda, utilice el codigo

Label2.Text = gvPerson.SelectedValue.ToString();

el cual me captura el valor de la columna, pero quiero capturar en el label1 la fila,

en fila tengo lunes, martes, miercoles, jueves y viernes

y en columna esta lugar 1, lugar 2, lugar 3, lugar 4 y lugar 5,

en si lo que quiero es que cuando el usuario seleccione alguno con un select que esta hay, me capture la fila y la columna, si alguien sabe, agradesco la colaboracion

Leandro Tuttini dijo...

hola

pero el gridview no tiene ningun SelectedValue, que control es gvPerson ?

tienes que usar el SelectedRow y de alli acceder a las celdas usando

GridViewRow row = gvPerson.SelectedRow;

string cellval = row.Cells[0].Text;

o sino usando el FindControl() si es un template

saludos

andersonhwsw dijo...

en mi codigo de C# esta asi:

conexion Connection = new conexion();
protected void Page_Load(object sender, EventArgs e)
{
DataBindGridView();
}

private void DataBindGridView()
{
SqlConnection conexion = new SqlConnection(Connection.getNETConnectionString());
conexion.Open();
SqlDataAdapter adapter = new SqlDataAdapter("seleclugarSP", conexion);//procedimiento almacenado del lugar
//SqlDataAdapter adapter = new SqlDataAdapter("SELECT Lugar.Lugar FROM entrega1 INNER JOIN Lugar ON entrega1.IdLugar = Lugar.Id_Lugar", conexion);
DataSet dsReserva = new DataSet();
adapter.Fill(dsReserva, "entrega");

GridView1.DataSource = dsReserva;
GridView1.DataBind();

}

protected void GridView1_SelectedIndexChanged(object sender, EventArgs e)
{
Label1.Text = GridView1.SelectedValue.ToString();
//capturo columna

Label2.Text = GridView1.Rows[0].Cells[1].Text;
}

como vez, primeramente es una clase a mi conexion, en esos dos labels, los coloque para saber que dato me estan traendo, y pues otra preguntica, si no es mucha molestia, todo lo estoy llamando en mi gridview, los headertext, los tengo ya definidos, pero no sabes, si puedo imprimir en estos unas variables que tengo almacenadas en otros label ¿?????, o como me aconsejarias realizar todo eso, o si tienes el codg por hay te lo agradeceria de antemano

andersonhwsw dijo...

en si ya me captura como vez el lugar, lo que quiero capturar es la cabecera o el headertext, como te digo en la pregunta anterior

Mahatma Montes dijo...

Saludos Leandro, mi duda es la siguiente:

Tengo un GridView con varias columnas, y tengo otras columnas ocultas con la propiedad AutoGenerateColumn="false". Una de las columnas es la "Descripcion" de un Articulo, entonces cuando se selecciona un renglon se debe mostrar la descripcion en un TextBox que se encuentra fuera del GridView. El problema esta que la columna "Descripcion" esta oculta y lei en otro articulo que publicaste que no se puede tomar el valor de una columna oculta (renderizar).

Pero mi problema esta en que yo estoy trabajando todo del lado del cliente por medio de javaScript, tengo una proceso como el siguiente:



var gv_ord = '<%=gv_GridView1.UniqueID %>';
var descrip = '<%=edt_descripcion.ClientID %>';

$('#<%=gv_GridView1.ClientID%> tbody tr').live('click', function (e){
Descripcion(gv_ord, edt_cap, '21');
});



Dentro del evento click de mi GridView tengo una funcion 'Descripcion' la cual le estoy mandado el ID del Grid y el ID del TextBox donde se mostrara la descripcion, y tambien le mando el numero de la columna oculta, en este caso la 21.

¿El DataKeyNames me serviria para ente ejemplo, como podria aplicarlo? en vez de mandar el numero de la columna, debo mandar el ID de la columna??

Leandro Tuttini dijo...

hola Mahatma

que tema es el que planteas, personalmente no dejaria informacion oculta en el html para seleccionar mediante jquery

sino que iria al servidor basado en el id para recuperar el resto de los datos que se necesiten, podrias usar $.ajax para invocar sin postback y trabjar los datos desde jquery

[ASP.NET] PopUp Edición - Usando Jquery UI Dialog

en tu caso quizas no usas un popup, pero la tecnica es similar, usas una invocacion al server a un webmethod para recuperar la info que te falta para mostrar en controles


saludos

Coco Lavayen dijo...

muchas gracias leandro! el CommanArgument me estaba volviendo loco

Adán Cruz López dijo...

hola soy nuevo en esto de asp.net c# y el manejo de gridview tengo un gridview que obtengo de una consulta con sql server lo que quiero hacer es que en esclusiva uno de esas columnas se pueda editar pero solo una si tengo 4 columnas solo quiero que se edite la tercera columna alguien me puede ayudar

Leandro Tuttini dijo...

hola Adán

las columnas en el gridview las defines en tiempo de diseño ?

porque si es asi podrias poner esas columnas en ReadOnly

con eso si pones la row en edicion estas que estan en readonly=false no se editan

saludos

Maribel Flores de Anda dijo...

Hola leando estoy desarrollando un sistema en el cual debo registrar las asistencias estoy usando un gridview enlazado a un dataset pero solo puedo editar las filas me gustaria editar una columna (fecha) para asignarle asistencia o falta espero puedas ayudarme

Leandro Tuttini dijo...

hola

podrias poner las columnas que no quieres editar en ReadOnly, con eso al editar la fila solo la columan que decidas sean editables cambiaran
el resto queda fijo para no poder alterarlo

el BoundField tiene esta propiedad readonly

saludos

Maribel Flores de Anda dijo...

Hola Leando
Agradesco infinitamente que te tomes la molestia de responder mis comentarios, entiendo lo que me sugieres pero ¿tendria que ser de uno por uno? es decir... ¿presionar el botón editar modifico la celda y finalmente actualizar por cada uno de los registros?

Leandro Tuttini dijo...

hola Maribel

el tema es que estas poniendo el grid en readonly, sino quieres poner ningun boton o algo adicional entonces debesrias dfejar editable el grid
asi el usuario puede ingresar y mofificar como necesite y derepsues impactas todos los cambios

si el grid lo unes a un datatable podrias luego de editar todo conover que rows fueron modificadas

DataTable.GetChanges Method (DataRowState)

el grid impacta los cambiso directo al datatable si es que este lo asignaste al datasource, por eso despues puede obtener los cambios

saludos

Jenny Monica Tapia dijo...

Hola Leandro vi varias de tus tutoriales y son excelentes...tengo un problema espero q puedas ayudarme, mi codigo es el sgte:






















----------------------------------
for (int i = 0; i < GridPreguntas.Rows.Count; i++)
{
InformeInicialInfAdicional Preguntas = new InformeInicialInfAdicional();

string ddl;
ddl = ((DropDownList)GridPreguntas.Rows[i].FindControl("ddlPregunta")).SelectedItem.Value;

string obs;
obs = ((TextBox)GridPreguntas.Rows[i].FindControl("txtObsPregunta")).ToString();

if (!string.IsNullOrEmpty(ddlPregunta.SelectedValue.ToString()))
{
Preguntas.IdInformeInicial = IdinformeI;
Preguntas.Observacion = txtObsPregunta.Text;
if (Convert.ToInt32(ddlPregunta.SelectedItem) == 1)
{
Preguntas.Si = "Si";
Preguntas.No = "No";
}
else
{
Preguntas.Si = "No";
Preguntas.No = "Si";
}

if (Preguntas.IdInformeInicial == IdFuente)
{
if (!string.IsNullOrEmpty(Convert.ToString(GridView1.DataKeys[i]["IdInformAdicional"])))
{
Preguntas.IdInforAdicional = Convert.ToInt32(GridView1.DataKeys[i]["IdInformAdicional"]);

InformeInicialInfAdicional Preg = new LNInformeInicialInfAdicional().Obtener(Preguntas.IdInforAdicional);
if (Preg.IdInformeInicial == IdinformeI)
{
Preguntas.EstadoBD = InterfazBD.EstadoEntidad.Modificado;
}
}
new LNInformeInicialInfAdicional().ActualizarBD(Preguntas);
}
}
else
{

}
}

El problema es q no puedo leer los datos que ingreso en el Textbox ni el que selecciono en le dropdownlist...ayudame por favor nose q estoy haciendo mal. MUCHAS GRACIAS.

Leandro Tuttini dijo...

hola

aqui noto un problema
obs = ((TextBox)GridPreguntas.Rows[i].FindControl("txtObsPregunta")).ToString();

te falta la propiedad .Text,, asi no usas el ToString()

----

ademas para recorrer deberias usar un foreach, no uses esto
for (int i = 0; i < GridPreguntas.Rows.Count; i++)

usa
foreach(GridViewRow row in GridPreguntas.Rows)

de esta forma quedara mas simple el codigo
saludos

Riki Johnson dijo...

Muchas gracias por el trabajo, muy bien explicado

alex chavez dijo...

Leandro, gracias por compartir tus conocimientos, tengo un problema con un gridview, haber si me explico bien, tengo un gridview dentro de un panel, entonces cuando hago click en algun nodo me los traslada a una caja de texto(origen, destino), entonces tengo un boton que dicer cambiar posicion de nodos, y me lo hace perfecto, pero despues vuelvo a cargar el gridview y pierdo el foco de donde estaba ubicado en el ultimo nodo seleccionado, es decir me traslada a la primera posicion del treeview, como puedo hacer para ubicarme en una posicion expecifica dentro del treeview?, gracias por tu ayuda.

Leandro Tuttini dijo...

hola alex

de casualidad usa el control UpdatePanel ? porque si es asi quizas podrias poner estos controels uno fuera y otro dentro del updatepanel

asi los eventos que recargan el gridview no afectan recargando tambien el tree, por supuesto si haces esto algunas acciones de interaccion no sean tan directas y debas usar javascript, pero no veo otra forma de lograrlo

se pdoria analizar de ir consevando en alguna session la seleccion del tree asi cuando detectas que se pierde volver asignarla, pero la verdad no estoy seguro de como se podria lograr esto

saludos

Azo dijo...

Buenas Leandro, no se si aca sera la parte correcta para mi duda, que es la siguiente, necesito cargar barias imagenes en una sola celda de un Grid, el grid ya lo tengo listo y ya le hice una image field, me podrias ayudar o explicarme como lo puedo lograr?. Gracias

Leandro Tuttini dijo...

hola Azo

no estoy seguro que signifique el proceso de cargar varias imagenes en el grid
digo si es que se tienen que fusionar todas esas imagenes en una unica y mostrarse en la celda, o si hay algun otro proceso

en principio imagino que usando GDI se podria procesar la imagen, se que con la tecncia de marca de agua se pueden superponer imagenes

http://social.msdn.microsoft.com/Forums/en-US/vbes/thread/8faeea8d-a066-4138-a96d-74c3c882cf6f


Trabajo con imágenes con C#. Mezclar dos imágenes


saludos

Blog DanG dijo...

Holaa leandr gracias por tus aportes te cuento un problema que tengo , si me puedes ayudar, estoy empezando asp y tengo un problema al actualizar una gridviewlo que quiero es que al actualizar un dato si me pasa de 20 por ejemplo otro campo de gridview automaticamente me asigne por ejemplo 5 espero tu ayuda no he encontrado respuestas a ellos gracias .. por tu atencion

Leandro Tuttini dijo...

hola Blog DanG

como es que realizas esta actualizacion ? estas poniendo la row del gridview en edicion, porque podrias en el evento RowUpdating validar y cambiar el valor

sino podrias validarlo con el control de validacion RangeValidator para que no se ingrese un valor mayor al que definas

saludos

alex vargas dijo...

se puede poner el checkbox no de lado izquierdo sino en la parte de abajo?? y como gracias

alex vargas dijo...

en un gridview

Leandro Tuttini dijo...

hola alex

en la parte de abajo de quien? porque no veo ningun parte de abajo en el gridview

saludos

Elessar Celebrindal dijo...

Hola leandro
me sale error

protected void GridView1_SelectedIndexChanged(object sender, EventArgs e)
{
GridViewRow row = GridView1.SelectedRow;

int id = Convert.ToInt32(GridView1.DataKeys[row.RowIndex].Value);

TextBox1.Text = Convert.ToString(id);

}

me sale error en la parte de [row.RowIndex] y dice que el codigo de usuario no controlo ArgumentOutOfRangeException

me podrias ayudar
gracias

Leandro Tuttini dijo...

hola Elessar

si pones un breakpoint en el codigo he inspeccionas el row que recuperas este devuelve algun valor

recueda que debes definir el DataKeyNames en el html del gridview para especificar el campo que defines como id o codigo


saludos

Ronnald Baque dijo...

Hola Leandro una consulta, tengo un gridview en el cual tengo dos columnas con textbox y una tercera columna que es la suma de las otras dos; el inconveniente es cómo podría hacer para que al modificar una celda el valor de la suma en la columna final el cambio se vea reflejado... Algo parecido al evento TextChanged...

Espero puedas ayudarme ya que llevo varios días tratando de solucionar ésto y no doy con una solución...

De antemano te quedo muy agradecido....

Leandro Tuttini dijo...

hola Ronnald

podrias implementar algo como esto

[ASP.NET] - GridView sumar columnas con jquery

saludos

El Ferna dijo...

Que tal, segui tus pasos al pie de a letra y me funciona, pero pasa algo particular cuando selecciono la primera file del Grid el evento onselectedIndexChanged deja de funcionar, es decir mientras este seleccionando cualquier fila diferente a la primera todo funciona bien, en el momento en que selecciono la primera fila del grid todo me deja de funcionar y permanece seleccionada esa primera fila, que puede ser lo que esta pasando?? Agradezco cualquier ayuda

Leandro Tuttini dijo...

hola El Ferna

has validado si esa primer fila no causa algun error que inhabilita los eventos

estas usando updatepanel? porque si hay algun error podria verse afectado

valida que el browser no mencione ningun error de javascript

prueba los otros browser ya se firefox o chrome para ver si aporta algun detalle

saludos

Alvaro Martinez dijo...

Hola Leandro, te pido ayuda por favor, sucede que ya llene un gridview con un dataset ya que va a variar la información, pero ahora me piden que este gridview pueda editar la informacion. entonces desde la parte de diseño le agregue los botones editar y eliminar, sin embargo cuando lo ejecuto me sale error, pues supongo que no he hecho el comando. La pregunta es que debo hacer.

Leandro Tuttini dijo...

hola Alvaro

sino mencionas que mensaje de error se genera la verdad no veo como poder ayudar

podrias evaluar este otro articulo

[ASP.NET][GridView] Edición usando DropDownList

saludos

Hector Florez dijo...

Hola Leandro, Tengo un verdadero lio y quisiera saber si me puedes ayudar, bueno, realmente son dos lios:

Tengo un gridview con un template que es un checkbox asociado a un campo bit en una tabla.

1. como puedo verificar al cargar el griview que el valor del campo en la tabla es 1 y desactive el check o si el valor es 0 lo active.

2. Como puedo actualizar el mismo campo dinamicamente cuando el usuario lo chekee, es decir, si el usuario lo chequea que automaticamente en la tabla el campo bit tome el valor de 1.

Te agradezco mucho la ayuda... pues estoy que me vuelvo loco.

Estoy trabajando Asp.net VB

Leandro Tuttini dijo...

hola Hector

aqui
http://social.msdn.microsoft.com/Forums/es-ES/14775fc1-cc72-40a8-b422-1d0e5e3d889b/mostratr-checkbox-en-un-gridview-en-vez-de-true-o-false

respondo sobre el primero de los temas

el segundo punto requiere que habilites en el CheckBox el AutoPostBack = true con esl tendras el evento del checkbox en el servidor cuando se cambie el valor

puede usar el NamingContainer para conocer el row del grid donde esta contenido el checkbox y poder actualizar

[GridView] Eventos de controles contenidos en el GridView

saludos

Carlos Javier Sola Herrera dijo...

Hola Leandro...
Tengo un problemita con un buttonfield, el caso es el siguiente:

El ButtonField cuando cargo el gridview tiene una imagen asignada, hasta ay esta bien, al dar click sobre el ButtonField entro al evento Rowcommand y hace lo que tiene que hacer, el detalle es que necesito que ese ButtonField cambie de imagen y no se como puedo manipular el buttonField desde codigo

Leandro Tuttini dijo...

hola Carlos

en el evento RowCommand puedes determinar cual es el row que lanza la accion, con el e.Row

podrias usar
e.Row.Cells[0].Controls

para acceder al control que define la imagen de esa celda y cambisr la imagen

saludos

Nikolittta dijo...

Hola ! mira tengo un problema al implementar una GridView con radio buttons y que al seleccionar un radiobutton obtener el hiddenfield de la row seleccionada....No estoy obteniendo el hiddenfield correspondiente...
Tengo este codigo en vb.net





y este es el CODE BEHING que trata de obtener el id de la grid segun el check del radio:
For Each row As GridViewRow In gvResultadoBusquedaIndividual.Rows
Dim rb As RadioButton = DirectCast(row.FindControl("RadioButtonInd"), RadioButton)
If rb.Checked Then
tmpCmoId = System.Convert.ToInt32(gvResultadoBusquedaIndividual.Rows(row.RowIndex).Cells(1).Text)
End If
Next


se agradeceria mucho una ayuda saludos!

Leandro Tuttini dijo...

hola Nikolittta

pero ese hidden que comentas no deberias localizarlo usando tambien el FindControl() ?

o sea si es un hidden de asp.net lo debes ubicar por el nombre del control y no como un valor de la celda

ademas no deberias usar el DataKeyNames para poner un valor oculto? digo y usar el DataKeys para tomar el valor usando el RowIndex

saludos

Christian Romero Lopez dijo...

Ola mira tengo este problema yo quiero acer un buscador en el cual cuento con un GRIDVIEW en el cual no se como se selecciona el GRIDVIEW y tampoco se como hacer que mande informacion que muestra en el GRIDVIEW retorne a las caja de texto FEchas , Dropdownlist,etc ..
Es un proyecto muy importante soy estudiante Espero me puedas ayudar ..
A se me olvidaba El formulario en el que quiero llenar los campos en este caso es carnet desde el buscador se encuentra en diferente asp.net eso no se como enviar desde un formulario a otro AYUDAME porfa soy seguidor tuyo siempre encuentro solucion en tus block espero me puedas ayudar es de mucha urgencia ... CUALQUIER COSA AKI ESTA MI CORREO Crizna_3_17@hotmail.com

Christian Romero Lopez dijo...

hay estoy tambien trabajando con biblioteca de CLases Espero me puedas ayudar

Leandro Tuttini dijo...

hola Christian

los eventos de seleccion del gridview los explico en este mismo articulo, por lo general lo que se recomienda es hacer uso del DataKeyNames para definir el id de la entidad, por lo tanto teniendo esta podrias ir contra la db y recuperar el registro para cargar los demas controles

quizas podrias aplciar algo como lo que planteo aqui

[ASP.NET] GridView – Edición Empleados

como veras se selecciona del grid y se edita en otra aspx, pasando los datos en el querystring o sea en la url

saludos

Christian Romero Lopez dijo...

Muchas Gracias me ayudo bastante...

R1947 dijo...

Hola Leandro,
Estoy realizando una consulta de un registro de clientes, si no seleccionan cliente se muestran todos, entonces necesito que puedan ver los detalles de esa fila (cliente), cree un campo en el gridview como lo dices acá con el datakeyname y me funciona correctamente pues me devuelve el nit del cliente que es lo que necesito.
En SelectedIndexChanged llamo el método llenarDatos que es el que me llena el Gridview, y le paso el nit que recupere como parámetro,el ejecuta correctamente el metodo pero cuando termina vuelve a ingresar al SelectedIndexChanged y en ese momento el parametro Nit esta vació, por tanto no hace nada.
Si al terminar de cargar el gridview no volviera a ingresar al SelectedIndexChanged creo que funcionaria correctamente, pero no se como hacerlo.
Alguna solución a esto.
Muchas gracias

R1947 dijo...

Complementando un poco lo anterior, el error anterio es si doy clic en el primer registro, pero si es en otro despues cargar el gridview que vuelve a ingresar al SelectedIndexChanged me da al siguiente error El índice estaba fuera del intervalo. Debe ser un valor no negativo e inferior al tamaño de la colección.
Nombre del parámetro: index

Leandro Tuttini dijo...

hola R1947

define un breakpoint en el evento SelectedindexChanged y cuando el codigo se detenga utiliza la ventana de Call Stack

How to: Use the Call Stack Window

valida para ambos casos desde donde se realizo la llamada, o sea quien invoco el evento, de esta forma podrias conocer cuando se detenga la segunda vez desde donde se invoco

saludos

R1947 dijo...

Hola Leandro,
El SelectedIndexChanged se invoca cuando llamo el metodo llenar datos y se lo asigno al datasource los datos.
Function LlenarDatos(ByVal Nit As String) As DataTable

gvSalida.DataSource = oDatos
gvSalida.DataBind()
oPYGCliente = Nothing
Return oDatos
End Function

Ya se donde se produce el llamado, pero aún no se como corregir el error.
Espero me puedas ayudar.
Muchas gracias

Leandro Tuttini dijo...

hola R1947

de casualidad ese LlenarDatos() lo tienes en el Page_Load ?
si es asi esta dentro del bloque

If Not IsPostBack Then
LlenarDatos()
end If

saludos

R1947 dijo...

Leandro,
Que pena, quizás no me he hecho entender.
Estoy realizando una consulta de un registro de clientes, si no seleccionan cliente se muestran todos, entonces necesito que puedan ver los detalles de esa fila (cliente), cree un campo en el gridview como lo dices acá con el datakeyname y me funciona correctamente pues me devuelve el nit del cliente que es lo que necesito.
Con ese nit llamo el metodo llenar datos,el hace el proceso correctamente, pero cuando le asigno esos datos al Datasource del Gridview el vuelve a ingresar al SelectedIndexChanged y entonces me da error.
PD. El metodo no esta en el load.
Muchas gracias

Leandro Tuttini dijo...

hola R1947

si pones un breakpoint en el evento SlectedIndexChanged y revisas el la ventana de "Call Stack" del VS, puedes evaluar desde donde es invocado el evento en cada caso

porque la verdad es muy raro que se invoque dos veces

tambien veo raro que cargues el grid con registros, selecciones uno y esto lo uses como filtro para cargar el mismo grid, deberias asignar el resultado otro diferentes

saludos

p dijo...

Buenas noches, en el grid tengo un campo de seleccionar y otro de eliminar pero para eliminar debo seleccionar primero la fila que deseo, si no me marca error, ¿cómo se puede validar que esté seleccionada la fila antes de eliminar?

Leandro Tuttini dijo...

hola p

para eliminar no se requiere seleccion, el delete lanza la accion directo sobre la row donde pulsas el boton o link
o sea el delete ya estaria selecciondo

no se si usas el evento RowCommand o Deleting asignado al gridview, pero si lo haces y defines un boton con el CommandName="Delete" veras que al pulsalo este solo lanza el evento y puedes tomar el DataKey para saber que id eliminar

saludos

p dijo...

Gracias Leandro, lo que pasa que ese evento que trae el grid no me deja eliminar los datos si en esa tabla hay relaciones con otra, por eso en el grid agregue un itemTemplate

CommandName="delete" OnClientClick="return confirm('¿Seguro que desea eliminar?');" OnClick="Img_eliminar_Click1"

y ya en el metodo Img_eliminar_Click es donde uso el codigo de eliminar, pero primero como te comento debe estar seleccionada la fila. Gracias

Leandro Tuttini dijo...

hola p

pero no tienes que definir el OnClick ese evento esta de mas

aunque uses un boton en un template si este tiene el commandName lanza el evento Deleting del gridview
y es alli donde deber programar el eliminar

si usas los eventos del grid no se necesita seleccionar nada, el OnClick del boton quitalo y define el RowCommand o Deleting del propio gridview

saludos

p dijo...

Ya quedo esa parte muchas gracias Leandro, pero por ejemplo si en ese grid tuviera varias opciones que ocupe seleccionar y realizar varias acciones de acuerdo a la que seleccione, ¿se podría validar de esta misma manera?

por ejemplo en ese mismo grid poder:
selecionar para agregar personas
seleccionar para agregar cultivos
seleccionar para agregar tierras
Gracias

Leandro Tuttini dijo...

hola

recuerda que puedes definir el CommandName del boton o link con lo cual con este podrias diferenciar la accion que se selecciona

por defecto hay comando como ser Delete, Select, Edit, etc
pero puedes poner cualquier texto que necesies y luego lo usas en el RowCommand

saludos

p dijo...

Ya por fin quedó, Gracias Leandro

Miguel Angel dijo...

Bue Dia oye una preguntota como hago para editar varios registros de un gridview y despues guardarlos con un click de un boton, en este caso es una lista de participante/Alumnos dejo una imagen


https://lh3.googleusercontent.com/-cqsKCDO2yng/UtdXdzQi8-I/AAAAAAAABAI/zht9Jlf8_Dk/w958-h599-no/Sin+t%C3%ADtulo.png

Miguel Angel dijo...

ya resolvi lo anterior pero ahota como asigno los valores a la ora de la consilta.
asp:TemplateField HeaderText="asistio"
ItemTemplate























Miguel Angel dijo...

asp:TemplateField HeaderText="asistio"
ItemTemplate
asp:CheckBox ID="asistioCheckBox" runat="server" Text='<%# Eval("asistio") %>' /
/ItemTemplate
HeaderStyle HorizontalAlign="Center" Width="60px" /
ItemStyle HorizontalAlign="Center" Width="60px" /
/asp:TemplateField

Miguel Angel dijo...

igual el check y el dropdwnlist, y el text si me lo asigna.

Leandro Tuttini dijo...

hola

para asignar el combo deberias usar el evento RowDataBound en ese evento usas el FindControl() para localizar el dropdownlist y asignarle el value

para el checkbox podrias aplciar la misma tecnica

o sea no asignas usando html sino el evento del grid

saludos

Miguel Angel dijo...

hola, ya mas o menos entendi pero no logro comprender bien como seria.


if(e.Row.RowType == DataControlRowType.DataRow)
{

evulcomBO = (DropDownList)e.Row.FindControl("evaluacionDropDownList");
evulcomBO.SelectedValue = e.Row.Cells[3].Text;

}

Leandro Tuttini dijo...

hola Miguel

si va bien encaminado, esa es la idea solo que deberias asignar el SelectedValue el id del item
para eso usarias el

GridViewRow.DataItem (Propiedad)

analiza como lo usa en el link
se supone que aunque en el grid muestres la descripcion para el combo tomas el id

quizas tambien debas cargar los items del combo, por eso primero recuperar los datos y asignar el DataSource

saludos

Miguel Angel dijo...

Buen dia Leandro, oye sigo atorado con eso de la asignacion de los valores en los campos, de la tabla,

para cargar el GridView ocupo un id que viene de otro y ya lo cargo con el dataBinid asi :

try
{
GridViewRow fila = consultaSesionesGridView.SelectedRow;
idGrupoSesion = Convert.ToInt32(Server.HtmlDecode(fila.Cells[0].Text));
idGrupoSesonLabel1.Text =Server.HtmlDecode(fila.Cells[0].Text);
grupoSesionParticipanteGridView.DataSource = metodo.cargarDatosGrupoSesionParticipanrte(idGrupoSesion);
grupoSesionParticipanteGridView.DataBind();

-------------------------------

y pues en el evento rowDataBound todavia no le veo la forma de hacerlo

if (e.Row.RowType == DataControlRowType.DataRow)
{


evulcomBO = (DropDownList)e.Row.FindControl("evaluacionDropDownList");

---------------------------------------

y otra consulta aparte no has realizado o creado un File Manager para visualizar documentos desde una pagina aspx que son del servidor.

Miguel Angel dijo...

que hay Leandro otra ves por aca molestando oye ya resolvi lo de la asignacion al grid asi:

DataRowView drview = e.Row.DataItem as DataRowView;
if (e.Row.RowType == DataControlRowType.DataRow)
{

CheckBox chkb = (CheckBox)e.Row.FindControl("asistioCheckBox");
if (drview[2].ToString() == "True")
{
chkb.Checked = true;
}
else
{
chkb.Checked = false;
}

evulcomBO = (DropDownList)e.Row.FindControl("evaluacionDropDownList");
if(drview[3].ToString()=="MB")
{
evulcomBO.SelectedValue = "MB";
}
else if(drview[3].ToString()=="BI")
{
evulcomBO.SelectedValue = "BI";
}
else if (drview[3].ToString() == "RE")
{
evulcomBO.SelectedValue = "RE";
}
else
{
evulcomBO.SelectedValue = "NULL";
}



-------------------------


pero como te comentaba no has realizado o creado un File Manager para visualizar documentos desde una pagina aspx que son del servidor.

si pudieras ayudarme con eso te lo agradeceria !!

Leandro Tuttini dijo...

hola

porque no usaste:
chkb.Checked = Convert.ToBoolean(drview[2]);

digo asignas directo

la verdad FileManager no hice, pero quzias esto se aproxime
[ASP.NET] Grabar Archivo en base de datos

aunque quizas si investigas algo como esto
http://cksource.com/ckfinder
podria ser de ayuda para crear un file manager usando ajax

saludos

Efren Angeles Rojas dijo...

Buenas Tardes Leandro, espero me Pueda Ayudar:
Tengo un GridView el cual lleno desde db y tengo 2 columnas del GridView como LinkButton, después necesito los valores del las celdas pero los del linkButton no me las puedo llevar, los de BoundField los tomo sin problema.
esto lo tengo asi.




Efren Angeles Rojas dijo...

Dim index As Integer = Convert.ToInt32(e.CommandArgument)
Dim row1 As GridViewRow = GridView1.Rows(index)

Dim Valor As String = Nothing
Dim Vcesion As String = Nothing

If e.CommandName = "T" Then

If Server.HtmlDecode(row1.Cells(6).Text) = 0 Then
-- No hay datos a mostrar
Else
Vcesion = Server.HtmlDecode(row1.Cells(1).Text)
--pasas Vcesion a otra pagina
End If

End If

Leandro Tuttini dijo...

hola Efren

no entiendo que valores necesitas? porque se supone que uses el DataKeyNames para definir el valor que luego recuperas al seleccionar la row

si quieres obtener el link deberias usar el FindControl()

LinkButton link = row1.FindControl("LinkButton1") as LinkButton;

saludos

Efren Angeles Rojas dijo...

Gracias Por tu tiempo Leandro.
A ver si a hora si me explico.
En el grid que tengo existen X columnas y 2 de ellas son asi:
--asp:TemplateField HeaderText="P/en tiempo"--

--asp:LinkButton ID="linktutton" runat="server" Text='<%# Eval("PendEnTiempo") %>' CommandName="T" CommandArgument="<%# DirectCast(Container, GridViewRow).RowIndex %>"-- --asp:LinkButton--
--/ItemTemplate--
--/asp:TemplateField--
Las demas son:
--asp:BoundField HeaderText="Entregados" ReadOnly="true" DataField="Entregados" --
Entonces cuando quiero poner en una variable lo que trae las columnas --asp:BoundField-- No tengo problema lo caho en GridView1_RowCommand
If Server.HtmlDecode(row1.Cells(6).Text) = 0 Then
--error
Else
--ok
End If
Pero si quiero el valor del --asp:LinkButton-- esto biene en blanco. Y este es el que necesito.

Saludos.

Leandro Tuttini dijo...

hola Efren

pero el valor del LinkButton es el CommandArgument ?
por lo que veo no hay valor del linkbutton solo deberias usar e.CommandArgument

sino podrias ver de usar el FindControll() sobre la row que lanza el evento para localizar por el id del linkbutton

saludos

Gleiston Guerrero dijo...

Hola Leandro, Soy Gleiston

Disculpa, estoy haciendo un insert con el GridView, sin embargo al tomar las cajas de texto qu le puse en el no me retorna el valor. Pero si son las cajas de texto.
No recuerdo como solucionar ese inconveniente.

Leandro Tuttini dijo...

hola Gleiston

no se si entendi la explicacion, pero si son cajas de texto que estan dentro de un gridview usas el FindControl() sobre la row que lanza la accion para localizar el valor de ese control textbox

o como es que accedes al contenido del textbox, porque directo por el nombre directo no puedes

[ASP.NET][GridView] Edición usando DropDownList

alli use Cells[index].Controls[0] porque se que hay solo un control que es el textbox en esa celda pero puedes usar el FindControl() ambas formas son validas

saludos

EDWIN REQUENA dijo...

buen día leandrro estoy trabajando con asp.net 2012 y una bd en access tengo un formulario donde registro empleados actualizo y elimino segun sea el caso y estos datos se actualizan en un gridview el problema que tengo esque no se reflejan los cambios o nuevos registros que hgo en el gridview si no hasta que recargo la pagina o edito otro dato se ve la primera actualizacion. te menciono que tengo en una masterPage un scriptManager y en la webform un updatepanel pero no refresca los datos...

Leandro Tuttini dijo...

hola EDWIN

pero luego de realizar la operacion de actualizacion sobre la entidad actualizas los datos del grid
o sea vuelves a lanzar el SELECT y asignar el resultado al DataSource del grid, por supuesto sin olvidar realizar el DataBind()

la db imagino la estas ubicando en la carpeta App_Data, no ?

saludos

EDWIN REQUENA dijo...

buen día así es estimado leandro tal como comentas despues de realizar la operacion requerida(insert, update,o delete) sobre la tabla de mi bd vuelvo a enlazar el grid con este codigo:

Private Sub cargaGrid()
cons = New consultasSQL
ds = New DataSet
ds = cons.DataSet("empleados", "select * from empleados")
dgEmpleados.DataSource = ds.Tables("empleados")
dgEmpleados.DataBind()
End Sub

pero no me refleja los cambios hechos en el grid la bd esta en un archivo de access que no esta en el app_data, lo que tengo en el app_data es un Dataset con las tablas de la bd mapeadas.

Leandro Tuttini dijo...

hola EDWIN

pero la actualizacion se impacto en la db ?

digo porque quizas no refleja nada porque no se produjo ningun cambio en la db

valida que la actualizacion se este realizando a la db a la cual te conectas

saludos

pedro salazar dijo...

hola leandro, me ayudo mucho tu articulo, muchas gracias

pedro salazar dijo...

Leandro me sirvio mucho tu articulo, muchas gracias

pedro salazar dijo...

hola leandro, me ayudo mucho tu articulo, muchas gracias

Mario Martinez dijo...

Leandro que tal , tengo un problema pues tengo gridview donde ingreso mediante dos cajas de texto la cantidad y precio respectivamente y al dar en el botón click me agrega dicha fila al gridview hasta ahí todo bien , pero tengo el problema que al refrescar la pagina osea al actualizarla en chrome me ejecuta de nuevo la ultima acción que fue la del botón agregar y por ende me duplica la fila esto solo pasa en chrome pero en internet explorer anda bien... agradecería tu ayuda. saludos

Humberto de Navas dijo...

Qué tal, Leandro

Tengo el problema de seleccionar el titulo asignado en la columna homónima sql, y guardarla en una variable sesion:

protected void GridView_RowCommand(object sender, GridViewCommandEventArgs e)
{
if (e.CommandName == "Select")
{

//con esta linea intento obtener el valor de la celda donde se hizo click
String titulo = this.GridView1.SelectedRow.Cells.ToString();
Session.Add("tit", "");
Session["tit"] = titulo;


this.SqlDataSource1.DataBind();

this.GridView1.DataBind();




}
}

protected void GridView1_SelectedIndexChanged(object sender, EventArgs e)
{

if ((Session["tit"]) != null)
Response.Redirect("~/WebForm1.aspx");
}

Gracias por estar

Leandro Tuttini dijo...

hola Humberto

pero una tabla tiene dos coordenas la row y la column

veo que usas SelectedRow para determinar la row, pero y la columna?

deberias especificarla

string titulo = this.GridView1.SelectedRow.Cells[0].Text;

si es un BoundField usas el text para tomar el valor
pero debes indicar el index de la columna que quieres tomar

saludos

kya-kya Ter dijo...

Hola Leandro, estoy empezando a trabajar con datagrids.
Creo que el código fuente de tu ejemplo me podría facilitar mucho las cosas, pero el link está roto y las imágenes no se ven.
Me lo podrías facilitar?
Mil gracias!

nyvlem25 dijo...

Hola Leandro muy bueno el tema un favor las imagenes y el link de descarga caduco, actualizalo porfavor, saludos

Leandro Tuttini dijo...

hola nyvlem25 y kya-kya

ya estan actualizado los link del articulo

saludos