Upload
hermilo-santiago
View
198
Download
7
Embed Size (px)
Citation preview
https://onedrive.live.com/?cid=3619ca7a3d74929a&id=3619CA7A3D74929A%21330
El GridView y sus eventos: El evento PageIndexChanging
En este post, vamos a ver el evento PageIndexChanging del GridView.
Vamos a ver cuando se ejecuta, cual es su finalidad y lo que nos aporta.
El GridView es un control que nos proporciona ASP.NET cuya
funcionalidad es “trabajar” con información tabular. Seguramente es uno
de los controles más usados y a lo lardo de las distintas versiones de
Visual Estudio, ha cambiado el nombre, pero siempre se ha mantenido.
Este control, es muy pesado y consume gran cantidad de memoria pero
aporta mucha funcionalidad que muchas veces no llegamos a
aprovechar porque generalmente lo usamos para mostrar información
(entendamos que hablo de aplicaciones Web).
Este post forma parte de una serie de post llamada El GridView y sus
Eventos. Los post que forman esta serie y que si has llegado aquí te
pueden interesar son:
El GridView y sus eventos: El evento RowDataBound .
El GridView y sus eventos: El evento PageIndexChanging .
Ordenando un GridView mediante el evento Sorting (El GridView y
sus eventos: El evento Sorting).
El evento PageIndexChanging.
El GridView, nos aporta la posibilidad de poder paginar los
resultadospudiendo así mostrar cada vez un conjunto de registros. Esto
lo conseguimos, si le seteamos a true la propiedad AllowPaging, y
también podemos indicarle el número de registros que queremos
mostrar cada vez (por defecto, si no recuerdo mal es 10) por medio de la
propiedad PageSize.
El código necesario sería el siguiente:
<asp:GridView
ID="gvCities"
runat="server"
DataKeyNames="CityCode"
CssClass="cssTableGrid"
AutoGenerateColumns="False"
AllowPaging="true"
PageSize="15"
OnPageIndexChanging="GvCities_PageIndexChanging"> </asp:GridView>
Cuando seteamos la propiedad AllowPaging a true, además de
mostrar los resultados de forma paginada, nos muestra en la
parte inferior del control un control de paginación (que no cumple
las guidelines que vimos anteriormente, pero menos da una piedra ;-) ).
El evento PageIndexChanging, se levanta cada vez que pulsamos
en uno de los links del control de paginación. La implementación
sería algo así:
protected void GvCities_PageIndexChanging(object sender,
GridViewPageEventArgs e)
{
GridView gv = (GridView)sender;
gv.PageIndex = e.NewPageIndex;
bindCitiesGrid();
}
En los argumentos del evento (del tipo GridViewPageEventArgs),
recibimos el nuevo indice de página, este, unicamente tenemos que
asignarselo a la propiedad PageIndex del GridView y ya esta todo hecho,
la proxima que hagamos el binding del control nos mostrara el conjunto
que esperamos.
Sencillo verdad, pues esto es todo. Podeis probar a poner el GridView
(como en el código de ejemplo :-D) dentro de UpdatePanel y vereis como
el resultado es bastante aparente (costando muy poco trabajo).
Post relacionados.
protected void GridView1_PageIndexChanging(object sender, GridViewPageEventArgs e) { GridView1.PageIndex = e.NewPageIndex; LLenarDatos(); }
hola tengo este codigo que me busca registros segun el codigo que ingreso
if (TEXTO1.Text.Length == 0) { Label3.Text = "NO HAY CAMPOS INGRESADOS INTENTELO OTRA VEZ"; }
else { DataTable dt = new DataTable(); using (SqlConnection conn = new SqlConnection("Data Source=LABINF201B13;Initial Catalog=REGISTRO;Integrated Security=True")) {
SqlCommand cmd = new SqlCommand("BUSCARCODIGO", conn); cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@codigo", this.TEXTO1.Text);
SqlDataAdapter da = new SqlDataAdapter(cmd); da.Fill(dt); }
GridView1.DataSource = dt; GridView1.DataBind(); Label3.Text = "BUSQUEDA REALIZADA CON EXITO"; }
agregar columna de checkbox a un datagridEstas en el tema de agregar columna de checkbox a un datagrid en el foro de ASPX (.net) en Foros del Web. Hola . Que tal espero que alguien me pueda ayudar, estoy haciendo un sistema de inventario en web y tengo una coneccion a una base ...
#1 (permalink) 04/07/2008, 13:28
Manuelon79Fecha de Ingreso: julio-2008Mensajes: 2Antigüedad: 5 años, 8 mesesPuntos: 0
agregar columna de checkbox a un datagrid
Hola .
Que tal espero que alguien me pueda ayudar, estoy haciendo un sistema de inventario en web y tengo una coneccion a una base de datos en Oracle, hago una consulta y me muestra un datagrid con la informacion que pido en la consulta.
A ese datagrid le quiero poner un campo con checkbox para elegir uno o varios registros del datagrid, pero cuando me meto a "Editar columnas..." agrego el "Campo CheckBox" y se ve la columna pero no los checkbox ni a la hoda de correrlo. Que puedo hacer para que se vean, y para poder modificar los registros que seleccione y mandarlos a un reporte en CrystalReport ??
Les agradeceria que me ayudaran estoy en Visual Studio 2005 con ASP.netgracias .
Avisos Google
#2 (permalink) 04/07/2008, 13:46
juantuxFecha de Ingreso: marzo-2005Mensajes: 59Antigüedad: 9 añosPuntos: 1
Respuesta: agregar columna de checkbox a un datagrid
Estimado,
hazlo con un Template del gridview. Edita las columnas del gridview, agregas una columna itemTemplate, luego te vas a la edicion de la plantilla, y en la seccion itemTemplate arrastras un control checkbox a la sección.
Deberia quedarte algo asi:
Código:<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" DataKeyNames="reg" DataSourceID="SqlDataSource1" Style="position: static"> <Columns> <asp:BoundField DataField="reg" HeaderText="reg" ReadOnly="True" SortExpression="reg" /> <asp:BoundField DataField="agricultor" HeaderText="agricultor" SortExpression="agricultor" />
<asp:BoundField DataField="rut" HeaderText="rut" SortExpression="rut" /> <asp:BoundField DataField="mail" HeaderText="mail" SortExpression="mail" /> <asp:TemplateField HeaderText="Seleccion"> <ItemTemplate> <asp:CheckBox ID="CheckBox1" runat="server" Style="position: static" /> </ItemTemplate> </asp:TemplateField> </Columns> </asp:GridView>
Despues solo te faltaría programar el checkbox, recorriendo la grilla y utlizando findcontrol para obtener los elementos seleccionados.
Espero haberte apoyado un poco.
Suerte,
JuantuxAvisos Google
Simple Project ManagementYes. It's easy. Nothing to install. Try it Free! www.smartsheet.com
#3 (permalink) 22/07/2008, 12:19
oscarfmtFecha de Ingreso: julio-2008Mensajes: 1Antigüedad: 5 años, 8 mesesPuntos: 0
Respuesta: agregar columna de checkbox a un datagrid
Buen dia Juantux!
Qusiera saber una cosa con respecto a la solución q propones....viendo q se define un "ID" para el checkbox...
<ItemTemplate><asp:CheckBox ID="CheckBox1" runat="server" Style="position: static" /></ItemTemplate>
Cómo puedo identificar el checkbox de una fila con el de otra dentro del GridView?, o cómo puedo asignar ID's distintos a estos?, puedo hacerlos en tiempo de ejecucion?
Lo intente hacer recorriendo la grilla y refiriendome al control asi:
GridView1.Rows(index).Cell(index1).Controls(0)
pero no consigo obtener el cotrol...
De antemano agradezco cualquier ayuda
#4 (permalink) 23/07/2008, 01:16
guillermoestebanFecha de Ingreso: mayo-2006Mensajes: 178Antigüedad: 7 años, 10 mesesPuntos: 3
Respuesta: agregar columna de checkbox a un datagrid
Depende donde necesites acceder a ese checkbox. Si es en un metodo itemdatabound, itemcommand o es desde fuera.
Para acceder desde fuera, p.e, al pulsar un botón:
For Each item As DataGridItem In Datagrid1.ItemsDim MiCheck1 As CheckBox = CType(item.FindControl("CheckBox1"), CheckBox)If Not (MiCheck1 Is Nothing) ThenIf MiCheck1.Checked = True Thenresponse.write ("<BR> Seleccionado fila con ID: " & Datagrid1.DataKeys(item.DataSetIndex))End IfEnd IfNext
#5 (permalink) 24/08/2010, 09:06
keyhidalgobFecha de Ingreso: agosto-2010Mensajes: 3Antigüedad: 3 años, 7 mesesPuntos: 0
Gracias Amigo
Muchas gracias amigo, después de mucho buscar en la web no encontré mejor respuesta que la tuya. Te
lo agradezco
Cita:
Iniciado por juantux Estimado,
hazlo con un Template del gridview. Edita las columnas del gridview, agregas una columna itemTemplate, luego te vas a la edicion de la plantilla, y en la seccion itemTemplate arrastras un control checkbox a la sección.
Deberia quedarte algo asi:
Código:<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" DataKeyNames="reg" DataSourceID="SqlDataSource1" Style="position: static"> <Columns> <asp:BoundField DataField="reg" HeaderText="reg" ReadOnly="True" SortExpression="reg" /> <asp:BoundField DataField="agricultor" HeaderText="agricultor" SortExpression="agricultor" /> <asp:BoundField DataField="rut" HeaderText="rut" SortExpression="rut" /> <asp:BoundField DataField="mail" HeaderText="mail" SortExpression="mail" />
<asp:TemplateField HeaderText="Seleccion"> <ItemTemplate> <asp:CheckBox ID="CheckBox1" runat="server" Style="position: static" /> </ItemTemplate> </asp:TemplateField> </Columns> </asp:GridView>
Despues solo te faltaría programar el checkbox, recorriendo la grilla y utlizando findcontrol para obtener los elementos seleccionados.
Espero haberte apoyado un poco.
Suerte,
Juantux
Formular una pregunta
Acceso rápido
Buscar conversaciones relacionadas
Principales respuestas
ablanco
1.270 Puntos1010
Conversaciones de ablanco Ver perfil
Conversaciones relacionadas importantes Mostrar valor booleano de un gridview en checkbox ASP.NET C# GridView y Checkbox C# asp.net Ayuda con checkbox en gridview paginado asp.net y c# en visual studio 2010 CheckBox en GridView C# aspx Ayuda con checkbox en gridview asp.net
Checkbox en Gridview ASP.Net C# Foros de Desarrollo
>
ASP.NET
Pregunta
0
Inicie sesión para votar
Actualmente estoy haciendo un Gridview en asp.net C#, mi problema es que dentro
de mi gridview necesito tener 2 checkbox, uno para "Aceptar" una requisicion y el
otro para "Rechazar" la verdad es que me he quedado hasta este punto y necesito
entregar este proyecto pronto, agradeceria su ayuda muchisimo.
Gracias.
PD Esta es la forma en la que he creado mi GridView en ASP.Net
<td>
<asp:GridView ID="GridView1" runat="server"
AutoGenerateColumns="False"
CellPadding="4" GridLines="Horizontal" BackColor="White"
BorderColor="#336666" BorderStyle="Double" BorderWidth="3px"
onpageindexchanged="GridView1_PageIndexChanged"
onpageindexchanging="GridView1_PageIndexChanging">
<Columns>
<asp:TemplateField HeaderText="ID">
<ItemTemplate>
<asp:Label ID="lblID" runat="server" Text='<%# Eval("ID")
%>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Part">
<ItemTemplate>
<asp:Label ID="lblPart" runat="server" Text='<%# Eval("Part")
%>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Scrapfactor">
<ItemTemplate>
<asp:Label ID="lblScrapfactor" runat="server" Text='<%#
Eval("Scrapfactor") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Converfactor">
<ItemTemplate>
<asp:Label ID="lblConverfactor" runat="server" Text='<%#
Eval("Converfactor") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="BOMQPA">
<ItemTemplate>
<asp:Label ID="lblBOMQPA" runat="server" Text='<%#
Eval("Bomqpa") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Routing">
<ItemTemplate>
<asp:Label ID="lblRouting" runat="server" Text='<%#
Eval("Routing") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Design">
<ItemTemplate>
<asp:Label ID="lblDesign" runat="server" Text='<%#
Eval("Design") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Plannercode">
<ItemTemplate>
<asp:Label ID="lblPlannercode" runat="server" Text='<%#
Eval("Plannercode") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="EngRecords">
<ItemTemplate>
<asp:Label ID="lblEngrecord" runat="server" Text='<%#
Eval("Engrecord") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Inslevel">
<ItemTemplate>
<asp:Label ID="lblInslevel" runat="server" Text='<%#
Eval("Inslevel") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Status">
<ItemTemplate>
<asp:Label ID="lblStatus" runat="server" Text='<%# Eval("Status")
%>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Comments">
<ItemTemplate>
<asp:Label ID="lblComments" runat="server" Text='<%#
Eval("Comments") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Fecha">
<ItemTemplate>
<asp:Label ID="lblFecha" runat="server" Text='<%# Eval("Fecha")
%>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Accept">
<ItemTemplate>
<asp:CheckBox ID="chkAccept" runat="server"
EnableViewState="true" Checked='<%#Convert.ToBoolean(Eval("Accept")) %>' />
</ItemTemplate>
</asp:TemplateField>
</Columns>
martes, 10 de septiembre de 2013 18:23
Responder
|
Citar
|
Chuy Orozco
0 Puntos
Respuestas
2
Inicie sesión para votar
Ola chuy, eso es facil, lo que tienes que hacer es recorrer tu gridview, encuentras
cuales son los chulos de aceptados y los de rechazados y realizas el codigo. seria
algo así
foreach (GridViewRow dtgItem in this.Gridview.Rows)
{
CheckBox Sel =
((CheckBox)Gridview.Rows[dtgItem.RowIndex].FindControl("chkAccept")); CheckBox SelRech =
((CheckBox)Gridview.Rows[dtgItem.RowIndex].FindControl("chkRechazar")); bool valor = Sel.Checked;
if (valor)
{
//aqui realizas tu codigo que acepta las solicitudes
}
bool valorRech = SelRech.Checked;
if(valorRech )
{
// aqui rechazas las solicitudes
}
}
Salu2
o Marcado como respuesta Chuy Orozco martes, 10 de septiembre de 2013 20:08
martes, 10 de septiembre de 2013 19:59
Responder
|
Citar
|
ablanco
1.270 Puntos
Todas las respuestas
1
Inicie sesión para votar
Hola
necesitas obtener setear ambos controles checkbox y tomar el valor?
Si se solucionó tu consulta no olvides marcar la respuesta de esta forma
mantendremos el orden en el Foro.
José Carlos Barba Gutierrez
Lima - Perú
Saludos
martes, 10 de septiembre de 2013 18:43
Responder
|
Citar
|
José Barba
Mas Soluciones S.A.C
14.295 Puntos
1
Inicie sesión para votar
hola
pero no veo el problema, asi como defines el
<asp:TemplateField HeaderText="Accept">
<ItemTemplate>
<asp:CheckBox ID="chkAccept" runat="server"
EnableViewState="true" Checked='<%#Convert.ToBoolean(Eval("Accept"))
%>' />
</ItemTemplate>
</asp:TemplateField>
puedes definir otro que sea
<asp:TemplateField HeaderText="Rechazar">
<ItemTemplate>
<asp:CheckBox ID="chkRechazar" runat="server" EnableViewState="true"
Checked='<%#Convert.ToBoolean(Eval("Rechazar")) %>' />
</ItemTemplate>
</asp:TemplateField>
con eso defines otra columna para ese tipo de dato
por supuesto vas a tener que agregar validaciones para que no se puedan marcar
ambas
saludos
Leandro Tuttini
Blog
Buenos Aires
Argentinao Marcado como respuesta Chuy Orozco martes, 17 de septiembre de 2013 17:01
o Desmarcado como respuesta Chuy Orozco martes, 17 de septiembre de 2013 17:09
martes, 10 de septiembre de 2013 18:51
Responder
|
Citar
|
Leandro Tuttini
Baufest
(Partner, MVP)
594.260 Puntos
0
Inicie sesión para votar
Juan Carlos/Leandro :
De antemano gracias por su pronta respuesta, basicamente lo que necesito es
saber como puedo validarlo, en Teoria tengo ya mi estructura del GridView en la
parte de ASP.Net,necesito saber la parte de la validacion en C#,por ejemplo,
selecciono 5 checkbox de "accept" y doy click en un boton que me cambie el
campo status a "Aceptado" lo mismo para Reject podrian ayudarme con eso, de
antemano muchas muchas gracias por la atencion.
Saludos
o Editado Chuy Orozco martes, 10 de septiembre de 2013 19:34
martes, 10 de septiembre de 2013 19:29
Responder
|
Citar
|
Chuy Orozco
0 Puntos
0
Inicie sesión para votar
pero entonces los checkbox son de solo lectura? o sea informativos
o es que el usuario marca los checkbox
porque segun veo hay un boton que realiza acciones y cambia el estado de la
entidad para pasarlo de estado, lo cual se reflejaria en los checkbox
es asi como lo planteo ?
saludos
Leandro Tuttini
Blog
Buenos Aires
Argentina
martes, 10 de septiembre de 2013 19:33
Responder
|
Citar
|
Leandro Tuttini
Baufest
(Partner, MVP)
594.260 Puntos
0
Inicie sesión para votar
Leandro:
Nuevamente gracias por la atencion, el usuario revisara las requisiciones, y
tendra la opcion de Aceptar o Rechazar los cambios segun la seleccion del
checkbox, el usuario sera quien seleccione que Checkbox marcara si "Aceptar" o
"Rechazar", una vez que el usuario marque los checkbox que necesite, dara click
en el boton que ejecutara que se guarde si se acepto o rechazo la requisicion.
Gracias
martes, 10 de septiembre de 2013 19:41
Responder
|
Citar
|
Chuy Orozco
0 Puntos
2
Inicie sesión para votar
Ola chuy, eso es facil, lo que tienes que hacer es recorrer tu gridview, encuentras
cuales son los chulos de aceptados y los de rechazados y realizas el codigo. seria
algo así
foreach (GridViewRow dtgItem in this.Gridview.Rows)
{
CheckBox Sel =
((CheckBox)Gridview.Rows[dtgItem.RowIndex].FindControl("chkAccept")); CheckBox SelRech =
((CheckBox)Gridview.Rows[dtgItem.RowIndex].FindControl("chkRechazar")); bool valor = Sel.Checked;
if (valor)
{
//aqui realizas tu codigo que acepta las solicitudes
}
bool valorRech = SelRech.Checked;
if(valorRech )
{
// aqui rechazas las solicitudes
}
}
Salu2
o Marcado como respuesta Chuy Orozco martes, 10 de septiembre de 2013 20:08
martes, 10 de septiembre de 2013 19:59
Responder
|
Citar
|
ablanco
1.270 Puntos
0
Inicie sesión para votar
aBlanco buenos dias:
Me ha surgido un nuevo problema, y es que una vez que he resuelto lo del
checkbox con tu valiosa ayuda, necesito saber como colocar que cada una de las
filas que tienen el checkbox.checked cambien su campo status a "Accepted o
Rejected segun el checkbox", disculpa por tanta pregunta pero mi novates me
gana.
Gracias de antemano.
martes, 17 de septiembre de 2013 17:09
Responder
|
Citar
|
Chuy Orozco
0 Puntos
Como obtener datos de un gridview y guardarlos en una variable Session para llevarlos a otra pàgina?? Foros de Desarrollo
>
ASP.NET
Pregunta
0
Inicie sesión para votar
Hola amigos pasa que tengo un Gridview el cual tiene mis siguientes campos (este
gridview solo està lleno con una fila nada mas):
nombre editorial autor edicion precio
lo que quiero es almacenar los datos de esa fila en variables las cuales con
variables Session que me permitan llevarlas a otra pagina y mostrarlas en una
tabla. Lo que he hecho hasta ahora es lo siguente:
protected void GridView1_DataBound(object sender, EventArgs e)
{
string nombre = GridView1.Rows[0].Cells[0].ToString();
string editorial = GridView1.Rows[1].Cells[1].ToString();
string autor = GridView1.Rows[2].Cells[2].ToString();
string edicion = GridView1.Rows[3].Cells[3].ToString();
int precio = Convert.ToInt32(GridView1.Rows[4].Cells[4].ToString());
Session["nombre"] = nombre;
Session["editorial"] = editorial;
Session["autor"] = autor;
Session["edicion"] = edicion;
Session["precio"] = precio;
Quiero decirles que he tratado incluso cambiando ToString por Text pero sin
resultado alguna pues obtengo en ambas el mismo error: "El index estaba fuera del
intervalo. Debe ser un valor no negativo e inferior al tamaño de la coleccion"
De antemano muchas gracias amigo
viernes, 23 de noviembre de 2012 22:59
Responder
|
Citar
|
Alejo_Blue
0 Puntos
Todas las respuestas
0
Inicie sesión para votar
porque usas el evento DataBound, ese no es correcto, debes usar el
SelectedIndexChanged
y en este tomar los datos
[ASP.NET] GridView – Edición Empleados
alli muestro como tomar el id para editar la entidad, veras como suar el evento
que menciono para redireccionar a la pagina de edicion
saludos
Leandro Tuttini
Adjuntar el checkBox a un GridView: Aunque esto se puede hacer por la opcion de editar template de la vista de diseño, yo lo hare en la vista de codigo por medio de html. Este fragmento de codigo va dentro de la etiqueta <colums> que se agrega automaticamente cuando arrastramos un gridview a nuestra pagina.
<asp:TemplateField HeaderText = "Agregar"> <ItemTemplate> <asp:CheckBox ID="CheckBoxPurchase"runat="server" Enabled="true"OnCheckedChanged="CheckBox... AutoPostBack="true"/> </ItemTemplate> <ControlStyle CssClass="TextoPublicacion" /> <HeaderStyle CssClass="Subtitulos" /> <ItemStyle HorizontalAlign="Center" Width="10%" /> </asp:TemplateField>
2. Guardar las casillas seleccionadas en el evento disparado al hacer click en una casilla. Este fragmento va dentro del archivo cs del respectivo formulario web. Este evento hay que hacerlo manulamente. No lo genera .net
protected void CheckBox1_CheckedChanged1(object sender, EventArgs e){ int Pos = 0; foreach (GridViewRow Fila in GvFunciones.Rows){ CheckBox Aux = (CheckBox)Fila.FindControl("CheckBoxPurc... if (Aux.Checked){ VectorDeFuncionesSeleccionadas.SetValu... Pos + (GvFunciones.PageSize*GvFunciones.PageIn... } else{ VectorDeFuncionesSeleccionadas.SetValu... Pos + GvFunciones.PageSize * GvFunciones.PageIndex); } Pos++; } }
3. Crear el evento PageIndexChanged. y pintar los checkBox en ese momento. Este evento si lo genera .net de la siguiente forma: Seleccionan el gridview; En la ventana de propiedades seleccionan los eventos (icono de rayito) y dan doble clik en en la casilla contigua que dice PageIndexChanged. En ese momento en el archivo cs se crea el metodo que se desencadenara cuando cambien de pagina en el grid view (que se debe activar poniendo en true la propiedad allowpaging del grid view).
protected void GvFunciones_PageIndexChanged(object sender, EventArgs e) { int Aux = GvFunciones.PageIndex * GvFunciones.PageSize; int i = 0; foreach (GridViewRow Fila in GvFunciones.Rows) { if (VectorDeFuncionesSeleccionadas.GetValue... + Aux).ToString() == "1") { ((CheckBox)Fila.FindControl("CheckBoxP... = true; }
else ((CheckBox)Fila.FindControl("CheckBoxPur... = false; i++; } } Y listo, espero haber sido claro. Nos vemos
RE: problema con gridview y checkbox
Es la opción por la que he optado, aunque en vez de utilziar una lista genérica he construído una cadena concatenando los ID, para luego volcar el esos valores en un campo texto oculto. Cómo podría utilzar las listas genéricas en este caso, porque he probado y claro, no me deja pasarle al hiddentext la lista genérica como value. ¿Podría enviar esa lista genérica a otra página?
Adjunto el código creado
protected void Button1_Click(object sender, EventArgs e)
{
string valores = "";
DataKey key;
foreach (GridViewRow fila in resultados.Rows)
{
bool result = ((CheckBox)fila.FindControl("CheckBox1")).Checked;
if (result)
{
key = resultados.DataKeys[fila.RowIndex];
valores = valores + key.Value.ToString() + ",";
}
}
if (valores != "")
{
valores = valores.Remove(valores.Length - 1);
}
idsH.Value = valores;
}
Un saludo!
Volver arriba#10 - 25/10/2006 14:18:35 Reporta abuso | Link Permanente
subgurimFecha de registro: 01/12/20061 post en este tema242 posts en acceso y trabajo con datos1777 posts en todos los foros
RE: problema con gridview y checkbox
Curiosamente ayer me pidieron algo similar en una empresa.
El problema es que, como tú dices, al checkbox no se le puede asignar un valor específico. Simplemente se le da true o false (checked o !checked).
Para tu caso, una solución sería que al pulsar el botón, 1.- Se recorrieran todas las filas del gridview, 2.- Se accediera al valor del checkbox, 2.1- Si está seleccionado acceder al Id de esa fila (que deberías haber definido como un DataKeyName del gridview), y guardarlo en un listado genérico3.- Al acabar de leer todas las filas, el listado genérico contendría todas las IDs que han sido checkeadas.
Seguro que hay otras soluciones, pero esta es la que se me ha
ocurrido al vuelo
Volver arriba
hola Marian.decolores este es el codigo que utilise en el evento click el boton , no se si sea la forma mas correcta de hacerlo pero ps el resultado que estoy buscando me lo da y como no encontre otra forma asi lo deje jejeje saludos espero que te sirva de ayuda
SqlConnection cn = new SqlConnection("user id=sa;password=;database=corres_envia;server=(local)");
SqlCommand cmd = new SqlCommand();
string[,] arreglo = new string[GridView1.Rows.Count, 7];
foreach (GridViewRow row in GridView1.Rows)
{
CheckBox chkbox1 = (CheckBox)row.FindControl("chkseleccion");
if (chkbox1.Checked)
{
arreglo[row.RowIndex, 0] = GridView1.Rows[row.RowIndex].Cells[1].Text;
arreglo[row.RowIndex, 1] = GridView1.Rows[row.RowIndex].Cells[2].Text;
arreglo[row.RowIndex, 2] = GridView1.Rows[row.RowIndex].Cells[3].Text;
arreglo[row.RowIndex, 3] = GridView1.Rows[row.RowIndex].Cells[4].Text;
arreglo[row.RowIndex, 4] = GridView1.Rows[row.RowIndex].Cells[5].Text;
arreglo[row.RowIndex, 5] = GridView1.Rows[row.RowIndex].Cells[6].Text;
arreglo[row.RowIndex, 6] = GridView1.Rows[row.RowIndex].Cells[7].Text;
try
{
cmd.CommandText = "delete datos_docto where nombre_usu='" + Session["usuarioelim"] + "'and noOficio_datos='" + arreglo[row.RowIndex, 1].ToString() + "' and envioA_docto='" + arreglo[row.RowIndex, 5].ToString() + "' and fecha_docto='" + arreglo[row.RowIndex, 6].ToString() + "'";
cmd.Connection = cn;
cn.Open();
cmd.ExecuteNonQuery();
cn.Close();
}
catch (Exception er)
{
Response.Write(er.Message);
}
}
C# - [DataGridView] – Uso del CheckBox - DataGridViewCheckBoxColumn
Introducción
El articulo intentara mostrar las algunas forma en que se puede utilizar el checkbox
en un control DataGridView.
Detectar el cambio en la selección
Para realizar la tarea se hará uso de dos eventos que pueden ser igual de útiles, el
CellValueChange y el CellContentClick
De forma estándar el CellValueChange, se deparará a seleccionar el check de la
celda y quitar el foco de la misma, saliendo del modo de edición.
Pero este no ejecuta la acción en el mismo instante en que se origina, sino que hay
que salir de la edición de la celda para que el evento ocurra.
01.private void dataGridView1_CellValueChanged(object sender,
DataGridViewCellEventArgs e)
02.{
03.//
04.// Solo se trabaja ante los cambios en la columan de los checkbox
05.//
06.if (dataGridView1.Columns[e.ColumnIndex].Name == "Seleccion") {
07.//
08.// Se toma la fila seleccionada
09.//
10.DataGridViewRow row = dataGridView1.Rows[e.RowIndex];
11.
12.//
13.// Se selecciona la celda del checkbox
14.//
15.DataGridViewCheckBoxCell cellSelecion =
row.Cells["Seleccion"] as DataGridViewCheckBoxCell;
16.
17.//
18.// Se valida si esta checkeada
19.//
20.if (Convert.ToBoolean(cellSelecion.Value)) {
21.
22.string mensaje = string.Format("Evento CellValueChanged.\n\nSe ha
seccionado, \nDescripcion: '{0}', \nPrecio Unitario: '{1}', \nMedida:
'{2}'",
23.row.Cells["Descripcion"].Value,
24.row.Cells["PrecioUnitario"].Value,
25.row.Cells["UnidadMedida"].Value);
26.
27.MessageBox.Show(mensaje, "", MessageBoxButtons.OK,
MessageBoxIcon.Information);
28.
29.}
30.
31.}
32.
33.}
Con respecto al CellContentClick, que si ejecuta la acción en el mismo momento en
que el usuario marca, o desmarca, el checkbox, pero me encontré que solo devolvía
null en la propiedad Value de la celda.
01.private void dataGridView1_CellContentClick(object sender,
DataGridViewCellEventArgs e)
02.{
03.//
04.// Detecta si se ha seleccionado el header de la grilla
05.//
06.if (e.RowIndex == -1)
07.return;
08.
09.if (dataGridView1.Columns[e.ColumnIndex].Name == "Seleccion")
10.{
11.
12.//
13.// Se toma la fila seleccionada
14.//
15.DataGridViewRow row = dataGridView1.Rows[e.RowIndex];
16.
17.//
18.// Se selecciona la celda del checkbox
19.//
20.DataGridViewCheckBoxCell cellSelecion =
row.Cells["Seleccion"] as DataGridViewCheckBoxCell;
21.
22.
23.if (Convert.ToBoolean(cellSelecion.Value))
24.{
25.
26.string mensaje = string.Format("Evento CellContentClick.\n\nSe ha
seccionado, \nDescripcion: '{0}', \nPrecio Unitario: '{1}', \nMedida:
'{2}'",
27.row.Cells["Descripcion"].Value,
28.row.Cells["PrecioUnitario"].Value,
29.row.Cells["UnidadMedida"].Value);
30.
31.MessageBox.Show(mensaje, "", MessageBoxButtons.OK,
MessageBoxIcon.Information);
32.
33.}
34.else
35.{
36.string mensaje = string.Format("Evento CellContentClick.\n\nSe ha
quitado la seleccion, \nDescripcion: '{0}', \nPrecio Unitario:
'{1}', \nMedida: '{2}'",
37.row.Cells["Descripcion"].Value,
38.row.Cells["PrecioUnitario"].Value,
39.row.Cells["UnidadMedida"].Value);
40.
41.MessageBox.Show(mensaje, "", MessageBoxButtons.OK,
MessageBoxIcon.Information);
42.
43.}
44.}
45.}
También se ha intentado hacer uso del evento EditingControlShowing, el cual
permitiría detectar la selección en el mismo momento que el usuario realiza la
acción, pero esto no fue posible ya que este tipo de columna no provoca el evento
necesario para tomar el control CheckBox y asignar el evento
SelectedIndexChanged.
Ante este problema con los eventos, y notar que ninguno responde como debería,
se encontró un método que resolvió todos los problemas de un solo golpe, se trata
del CommitEdit
1.private void dataGridView1_CurrentCellDirtyStateChanged(object sender,
EventArgs e)
2.{
3.if (dataGridView1.IsCurrentCellDirty)
4.{
5.dataGridView1.CommitEdit(DataGridViewDataErrorContexts.Commit);
6.}
7.}
En el evento CurrentCellDirtyStateChanged, se detecta si la grilla esta con algún
cambio pendiente, y en caso de estarlo se hace un Commit del mismo para reflejar
el valor en los eventos que lo usaran. Esto arregla los dos problemas detectados
anteriormente:
- se lanza el evento CellValueChanged, sin tener que quitar el foco de la celda
- ya no se recibe el null en el Value de la celda, en el evento CellContentClick
[C#] [VB.NET]
Aplicar formato a la selección
Teniendo en cuenta lo contado en la sección anterior, aplicar un formato a la fila
seleccionada no debería ser un misterio.
view source
print ?
01.private void dataGridView1_CellContentClick(object sender,
DataGridViewCellEventArgs e)
02.{
03.//
04.// Detecta si se ha seleccionado el header de la grilla
05.//
06.if (e.RowIndex == -1)
07.return;
08.
09.if (dataGridView1.Columns[e.ColumnIndex].Name == "Seleccion")
10.{
11.
12.//
13.// Se toma la fila seleccionada
14.//
15.DataGridViewRow row = dataGridView1.Rows[e.RowIndex];
16.
17.//
18.// Se selecciona la celda del checkbox
19.//
20.DataGridViewCheckBoxCell cellSelecion =
row.Cells["Seleccion"] as DataGridViewCheckBoxCell;
21.
22.if (Convert.ToBoolean(cellSelecion.Value))
23.row.DefaultCellStyle.BackColor = Color.Green;
24.else
25.row.DefaultCellStyle.BackColor = Color.White;
26.
27.}
28.}
29.
30.private void dataGridView1_CurrentCellDirtyStateChanged(object sender
, EventArgs e)
31.{
32.if (dataGridView1.IsCurrentCellDirty)
33.{
34.dataGridView1.CommitEdit(DataGridViewDataErrorContexts.Commit);
35.}
36.}
Simplemente ante la detección de la selección del usuario se cambia el color de la
fila usando el DefaultCellStyle.BackColor.
[C#] [VB.NET]
Publicado por Leandro Tuttini en 5:59
Etiquetas: DataGridView, WinFo
Chequear todos los checkbox de un gridview con javascript
3112007
NOTA 16/06/2009: He publicado como hacer esta misma tarea con jQueryen este artículo, recomiendo utilizar esa alternativa por los motivos que comento en dicho artículo.
Muchas veces queremos chequear o deschequear todos los checkbox de un gridview de una sola vez, puede ser cuando el usuario realiza determinada acción en otro control, por ejemplo un botón para “seleccionar todo”, o que cuando se activa un CheckBox en la cabecera de la columna, cambie el estado de todos los checks al de la cabecera.
Si bien esto se puede hacer con código de servidor, normalmente no queremos que se realice un postback solo para esto, la solución es javascript.
(Nuevamente, si solo te interesa un código js que solucione el problema que acabo de describir, te recomiendo ir directamente a copiar los dos fragmentos de javascript al final del post.)
En su momento utilicé el código que Scott Mitchell publicó en este artículo, pero esta solución, si bien funciona y no genera un postback, requiere código de servidor, ya que en la creación de la página se registra mediante el método RegisterArrayDeclaration un array con los ids que tendrá cada checkbox en el cliente, lo que nos obliga a hacerlo en cada postback o a recargar el estado, ya sea ViewState o Session.
Buscando otra alternativa encontré este otro artículo de Mohammad Azam, el autor deGridViewGuy. Este si es un ejemplo totalmente sobre javascript, pero tiene un gran defecto: opera sobre todos los checkbox de la página, sin importar si están dentro de la grilla o no, ni hablar si tenemos dos grillas.
En este punto decidí escribir mi propia solución, o sea una totalmente en el cliente y que permita operar sobre los checkbox de una grilla en particular y, por que no, sobre una columna en particular, de manera que podamos tener más de una columna con checkbox y cambiar el estado de los checks de una de ellas sin afectar la otra.
Un poco de background que pueden saltarse si les parece:
Como incluir CheckBox en una columna de un gridview
Antes que nada hay que generar una columna con los checkbox. Hay dos maneras de hacer esto como cuenta Scott Mitchell en el artículo nombrado, yo utilizo también un TemplateField (no encontré todavía utilidad para los CheckBoxField), de modo que colocando un checkbox en el ItemTemplate genero uno en cada celda del TemplateField:
<asp:TemplateField HeaderText="chk">
<ItemTemplate>
<asp:CheckBox ID="chkColumna1" runat="server" />
</ItemTemplate>
</asp:TemplateField>
Visualmente (en VisualStudio), agregamos un TemplateField al gridview y seleccionamosEditTemplate del menú contextual. Luego arrastramos un CheckBox a la zonaItemTemplate. Para finalizar: End Template Editing, en el menú contextual.
Como chequear todos CheckBox de un GridView
Esta rutina javascript cambia el estado de todos los checkbox de una grilla sin importar su ubicación:
function ChangeAllChecks(gridViewName,newState)
{
var tabla = document.getElementById(gridViewName);
celdas = tabla.cells;
for(i=0;i<celdas.length-1;i++)
{
if (celdas[i].firstChild.type=="checkbox"
&& celdas[i].firstChild.checked != newState)
{
celdas[i].firstChild.click();
}
}
}
Para llamarla utilizamos ChangeAllChecks(‘GridView1′,true); o false si es el caso
Como chequear una columna específica
Puede ocurrir que en un gridview tengamos más de un TemplateField con CheckBox, y que solo queramos chequear o deschequear una sola columna, para ello hice un nuevo método que toma como paramétro el índice de la columna (empezando por 0). (Actualizado 29/09/2008 según respuesta al comentario de Martín)
function ChangeChecksByColumn(gridViewName, newState, columnIndex){
var tabla = document.getElementById(gridViewName);
var columnas = tabla.cells.length / tabla.rows.length;
celdas = tabla.cells;
for (i = columnas + columnIndex; i < celdas.length; i += columnas){
if (celdas[i].firstChild.type == "checkbox"
&& celdas[i].firstChild.checked != newState
/* && agregar aquí otras condiciones */){
celdas[i].firstChild.click();
}
}
}
Como chequear a partir de un CheckBox en la cabecera
El código anterior no es muy útil porque nos solicita el estado (true=checked/false=unchequed) en el que queremos dejar los checkbox, la solución es agregar un checkbox en la cabecera de la TemplateColumn:
y agregamos una rutina que permita identificar el estado del mismo y la columna en que se encuentra, luego llamamos al método anterior: ChangeChecksByColumn:
function CopyCheckStateByColumn(HeaderCheckBox, gridViewName)
{
var columnIndex = HeaderCheckBox.parentElement.cellIndex;
var newState = HeaderCheckBox.checked;
ChangeChecksByColumn(gridViewName, newState, columnIndex);
}
Para terminar, completamos el evento onclick del checkbox con una llamada aCopyCheckStateByColumn pasando como parámetro el propio checkbox y el nombre del gridview:(lo que sigue cambiado el 08/11 según la respuesta al comentario de Roger)
<asp:TemplateField HeaderText="chk">
<HeaderTemplate>
<asp:CheckBox ID="chkHeader" runat="server"
onclick="javascript:CopyCheckStateByColumn(this,this.offsetParent.offsetParent.id);"/>
</HeaderTemplate>
<ItemTemplate>
<asp:CheckBox ID="chkTest" runat="server" />
</ItemTemplate>
</asp:TemplateField>
Una precaución: Tener en cuenta que el código javascript consulta si el contenido es un CheckBox mediante la propiedad firstChild para cada objeto de la colección cells del objeto table, o sea: el contenido de cada TD. Si ponemos otro objeto en el ItemTemplate junto con el CheckBox, podemos tener problemas si nos descuidamos.
Un tip: Para llamar métodos javascript en el evento click de un control Button , se debe utilizar el evento OnClientClick en vez de onclick.
Una desventaja: No funciona en Firefox.
<< Transformación del Modelo E/R al Modelo Relacional | Diseño Centrado en el Programador vs Diseño Centrado en el Usuario >>
Consultas SQL sobre multiples tablas 11. September 2010 01:21 by Oscar.SS in Desarrollo Empresarial // Tags: t-sql // Comments (6)
Continuando con el artículo anterior, veremos en este las consultas SELECT combinado columnas de distintas tablas. Este tipo de consultas nos permiten explotar nuestro almacén de negocio de forma más efectiva al relacionar datos de distintas tablas.
--------------------------------------------------------------------------------------------------------------------
--CONSULTAS DE VARIAS TABLAS (Producto cartesiano de filas)------------------------------------------------------------------------
----------------------------------------------
-- Si no se hacen coincidir los valores de las columnas relacionadas s
e obtiene gran duplicidad de filas. Tantas como-- el producto cartesiano de las filas de las tablas a las que se hace
referencia. Ejemplo:
select * from dbo.Products, dbo.Orders
----------------------------------------------------------------------
----------------------------------------------
--UTILIZAR ALIAS EN UNA TABLA------------------------------------------------------------------------
----------------------------------------------
-- Cuando se relacionan varias tablas es normal que una misma columna forme parte de varias tablas. Para evitar -- errores de nombres duplicados podemos hacer dos cosas. Una es utili
zar la sintaxis de nombre completo:-- NombreTabla.NombreColumna.
select * from dbo.Products, dbo.Categorieswhere dbo.Products.CategoryID = dbo.Categories.CategoryID
-- La otra forma es dar un alias a cada tabla. Ejemplo:
select * from dbo.Products P, dbo.Categories Cwhere P.CategoryID = C.CategoryID
----------------------------------------------------------------------------------------------------------------------INSTRUCCIÓN JOIN ON(Coincidencia INTERNAS de columnas)--
----------------------------------------------------------------------
----------------------------------------------
--NOTA: La instrucción INNER JOIN es exactamente lo mismo que JOIN, dado que es el valor predeterminado.
--TEORÍA--
-- La instrucción JOIN nos permite combinar varias tablas haciendo coi
ncidir los valores de las columas que nos -- interesen. Es decir, si tenemos dos tablas A y B que contienen una
(o varias) columnas con el mismo nombre,-- podemos relacionar ambas tablas por la columna del mismo nombre.
-- Por cada registro de la columna en la tabla A que también esté en l
a columna de la tabla B, obtendremos un-- una relación. Lo que quiere decir que se produce un producto cartes
iano de cada valor de la columna de la tabla A,
-- por todos los valores coincidentes de la columna en la tabla B.
--VOLVIENDO A LA BASE DE DATOS NORTHWIND--
-- 1. Por ejemplo, la tabla empleados nos facilita bastante información de los mismos. La más significativa es el
-- número de empleado, el nombre y la ciudad donde vive. Sin embargo, no nos dice nada de las ventas efectuadas por
-- cada empleado.
-- Si miramos la tabla de ventas veremos que además del número de vent
as, tenemos información del empleado que-- realizo estas ventas. Por lo tanto, por medio de la columna EmployeeID presente en las dos tablas podemos-- relacionar los empleados con el número de venta. Ejemplo:
select OrderID, LastName, FirstName, Cityfrom dbo.Orders O join dbo.Employees Eon O.EmployeeID = E.EmployeeIDorder by OrderID
-- De este modo podemos concluir que la columna que pertenece a una tabla A y otra B sirve de nexo para relacionar-- los datos de otras columnas de la tabla A que no estan incluidos en la tabla B y viceversa.
--2. Otro caso es la tabla de productos que nos da mucha información s
obre los mismos pero apenas nos dice nada de -- la categoría a la que pertenece cada producto. Mostremos una tabla productos personal que muestre la información
-- más interesante de los productos, más el nombre de la categoría y u
na descripción de esta.
select ProductID, ProductName, C.CategoryID, CategoryName, Description, UnitPrice, UnitsInStock
from dbo.Products P join dbo.Categories C
on P.CategoryID = C.CategoryID
--3. COMBINACIÓN DE TRES TABLAS. Si nos fijamos en las tablas de emple
ados y de clientes nos damos cuenta que no hay-- forma de relacionar que empleado atendió (o vendió) a que cliente.
Podemos hacerlo a través de la tabla de ventas-- que tiene los números de empleados y de clientes.
select E.EmployeeID, LastName, FirstName, OrderID, C.CustomerID, Compa
nyName, ContactNamefrom dbo.Orders O
join dbo.Employees E on O.EmployeeID = E.EmployeeID
join dbo.Customers C on O.CustomerID = C.CustomerIDorder by EmployeeID
--4. Puede darse el caso en que solo interese esta información para lo
s clientes de España.
select E.EmployeeID, LastName, FirstName, OrderID, C.CustomerID, Compa
nyName, ContactNamefrom dbo.Orders O
join dbo.Employees E on O.EmployeeID = E.EmployeeID
join dbo.Customers C on O.CustomerID = C.CustomerIDwhere C.Country = 'Spain'
order by EmployeeID
--5. La instrucción JOIN también podemos utilizarla para sustituir a las subconsultas. La forma de hacerlo es dando-- dos alias diferentes a una misma tabla. Ejemplo:
-- (Mostrar los empleados que son mayores que el empleado 5 (1955-03-04) ).
-- Técnica de subconsultas.select EmployeeID, LastName, FirstName, BirthDate from dbo.Employees
where BirthDate > (select BirthDate from dbo.Employees where EmployeeID = 5)
-- Instrucción JOIN.select E1.EmployeeID, E1.LastName, E1.FirstName, E1.BirthDate from dbo
.Employees E1 join dbo.Employees E2
on E1.BirthDate > E2.BirthDatewhere E2.EmployeeID = 5
----------------------------------------------------------------------
----------------------------------------------
--INSTRUCCIÓN OUTER JOIN (Coincidencias EXTERNAS de columnas)----------------------------------------------------------------------------------------------------------------------
-- Puede darse el caso que nos interese mostrar todos los valores de u
na columna (todas las filas) aunque no tengan -- correspondencia en la otra tabla. Así podemos tener 3 casos:
--1.Mostrar todos los valores de la tabla IZQ (LEFT), con NULL para la
tabla DCH cuando no hay correspondenciaselect ProductID, ProductName, C.CategoryID, CategoryName, C
.Description, UnitPrice, UnitsInStockfrom dbo.Products P left outer join dbo.Categories C
on P.CategoryID = C.CategoryID
--2.Mostrar todos los valores de la tabla DCH (RIGHT), con NULL para l
a tabla IZQ cuando no hay correspondencia.select ProductID, ProductName, C.CategoryID, CategoryName, C
.Description, UnitPrice, UnitsInStockfrom dbo.Products P right outer join dbo.Categories C
on P.CategoryID = C.CategoryID
--3.Mostrar todos los valores de ambas tablas (FULL) con NULL cuando n
o hay correspondencia.select ProductID, ProductName, C.CategoryID, CategoryName, C
.Description, UnitPrice, UnitsInStock
from dbo.Products P full outer join dbo.Categories Con P.CategoryID = C.CategoryID
--NOTA: La sentencia OUTER es opcional. Al incluir las sentencias LEFT, RIGHT Y FULL el sistema sabe que es una-- consulta de combinación externa. Ejemplo anterior:
select ProductID, ProductName, C.CategoryID, CategoryName, C.Description, UnitPrice, UnitsInStockfrom dbo.Products P full join dbo.Categories Con P.CategoryID = C.CategoryID
---------------------------------------------------------------------------------------------------------------------- INSTRUCCIÓN UNION (Unión de filas en distintas tablas)------------------------------------------------------------------------
----------------------------------------------
--1. Unir (UNION) todas (ALL) las filas de dos columnas de tablas diferentes.
select City from dbo.Employees
union all
select City from dbo.Customers -- Devuelve la suma de todas las filas en ambas columnas.
--2. Unir (UNION) las filas de dos columnas de tablas diferentes sin r
epetir ningún valor.
select City from dbo.Employeesunion
select City from dbo.Customers -- Devuelve la suma de todas las filas en ambas columnas pero con valores únicos.
--NOTA: Se debe cumplir que las columnas en ambas instruciones SELECT
coincidan en el tipo de datos.
--------------------------------------------------------------------------------------------------------------------
-- INSTRUCCIÓNES EXCEPT Y INTERSECT (Diferencia e Intersección de conj
untos)------------------------------------------------------------------------
----------------------------------------------
-- EXCEPT -- Devuelve los valores de la primera consulta que no se enc
uentran en la segunda.select City from dbo.Employees
exceptselect City from dbo.Customers
-- INTERSECT -- Devueleve una intersección de todos los valores, es decir, solo los que se encuentran ambas columnas.
select City from dbo.Employeesintersectselect City from dbo.Customers
Combinación de más de dos tablas
Podemos hacer un "join" con más de dos tablas.
Cada join combina 2 tablas. Se pueden emplear varios join para enlazar varias tablas. Cada resultado de un join es una tabla que puede combinarse con otro join.
La librería almacena los datos de sus libros en tres tablas: libros, editoriales y autores.En la tabla "libros" un campo "codigoautor" hace referencia al autor y un campo "codigoeditorial" referencia la editorial.
Para recuperar todos los datos de los libros empleamos la siguiente consulta:
select titulo,a.nombre,e.nombre from autores as a join libros as l on codigoautor=a.codigo join editoriales as e on codigoeditorial=e.codigo;
Analicemos la consulta anterior. Indicamos el nombre de la tabla luego del "from" ("autores"), combinamos esa tabla con la tabla "libros" especificando con "on" el campo por el cual se combinarán; luego debemos hacer coincidir los valores para el enlace con la tabla "editoriales" enlazándolas por los campos correspondientes. Utilizamos alias para una sentencia más sencilla y comprensible.
Note que especificamos a qué tabla pertenecen los campos cuyo nombre se repiten en las tablas, esto es necesario para evitar confusiones y ambiguedades al momento de referenciar un campo.
Note que no aparecen los libros cuyo código de autor no se encuentra en "autores" y cuya editorial no existe en "editoriales", esto es porque realizamos una combinación interna.
Podemos combinar varios tipos de join en una misma sentencia:
select titulo,a.nombre,e.nombre from autores as a right join libros as l on codigoautor=a.codigo left join editoriales as e on codigoeditorial=e.codigo;
En la consulta anterior solicitamos el título, autor y editorial de todos los libros que encuentren o no coincidencia con "autores" ("right join") y a ese resultado lo combinamos con "editoriales", encuentren o no coincidencia.
Es posible realizar varias combinaciones para obtener información de varias tablas. Las tablas deben tener claves externas relacionadas con las tablas a combinar.
En consultas en las cuales empleamos varios "join" es importante tener en cuenta el orden de las tablas y los tipos de "join"; recuerde que la tabla resultado del primer join es la que se combina con el segundo join, no la segunda tabla nombrada. En el ejemplo anterior, el "left join" no se realiza entre las tablas "libros" y "editoriales" sino entre el resultado del "right join" y la tabla "editoriales".
Consulta SQL a más de dos tablas con JOIN
Por Inyaka el 30 de Agosto de 2009 con 120,062 visitas
PHP, MySQL y Servidor Otros tutoriales por Inyaka.
Muchas veces es necesario consultar a mas de una tabla y debemos aprender a poder obtener los resultados correctos de la manera mas eficiente y sencilla, para lo cual vamos a usar las siguientes tablas, sacadas de un sistema de gestión de bodegas que estamos preparando para la logística en islas claber
Tablas que usaremos
Usaremos 3 tablas en este ejemplo donde la tabla us2bod nos servirá para relacionar las tablas bodegas y usuarios varios a varios
Creando las consultas
Conozco 2 formas de usar JOIN deben existir otras mas pero hasta ahora con estas me basta, uso INNER JOIN cuando quiero que solo lo resultados incluidos en el JOIN aparezcan en los resultados y LEFT JOIN cuando quiero que todos los resultados aparezcan independiente de si están o no incluidos en el JOIN, ahora vamos a hacernos algunas preguntas para poder poner en practica estos conceptos.
Consejo importante :
El uso de * en el SELECT es muy practico a la hora de desarrollar una consulta, pero es fatal para el rendimiento de esta cuando esta en producción, por varios factores, entre ellos que el resultado que arroja la consulta es mucho mas grande de lo que realmente se necesita y que al no saber el nombre de los campos que usara, el motor (mysql en mi caso) debe previamente consultar el nombre de todos los campos de la tabla, en tablas grandes con mas de 60 campos esto es fatal, muy fatal
Atento a la forma abreviada de poner alias a las tablas
Consulta con uso de INNER JOIN:
Primero vamos a ver quien tiene acceso a que bodega con el uso de INNER JOIN
Código :
SELECT
u.us_nombre usuario,
b.bod_nombre bodega
FROM us2bod ub
INNER JOIN usuarios u ON ub.us_id = u.us_id
INNER JOIN bodegas b ON ub.bod_id = b.bod_id
Esto dará como resultado
Consulta con uso de LEFT JOIN:
Ahora vamos a ver a los usuarios que NO tienen bodegas asociadas, para lo cual preguntaremos que usuarios no se pudo asociar a alguna bodega
Código :
SELECT
u.us_nombre usuario
FROM usuarios u
LEFT JOIN us2bod ub ON u.us_id = ub.us_id
WHERE ub.u2b_id IS NULL
Lo cual nos dará:
Espero que esto les sirva y les saque de mas un apuro (o lo metas en mas de uno si van a la bodega que tengo en casa).