Archive for the ‘ C# ’ Category

Como usar “sorting” y “paging” en un gridview

Si tratas de usar sorting y paging a la vez en un gridview el sistema de devolverá un error como este:

“The GridView ‘GridViewID’ fired event PageIndexChanging which wasn’t handled.”

Lo que se debe hacer en el gridview es agregar los llamados que manejarán los eventos:

<asp:GridView ID=”gridView” OnPageIndexChanging=”gridView_PageIndexChanging” OnSorting=”gridView_Sorting” runat=”server” />

Y en el código las funciones:

private string ConvertSortDirectionToSql(SortDirection sortDirection)
{
string newSortDirection = String.Empty;

switch (sortDirection)
{
case SortDirection.Ascending:
newSortDirection = “ASC”;
break;

case SortDirection.Descending:
newSortDirection = “DESC”;
break;
}

return newSortDirection;
}

protected void gridView_PageIndexChanging(object sender, GridViewPageEventArgs e)
{
gridView.PageIndex = e.NewPageIndex;
gridView.DataBind();
}

protected void gridView_Sorting(object sender, GridViewSortEventArgs e)
{
DataTable dataTable = gridView.DataSource as DataTable;

if (dataTable != null)
{
DataView dataView = new DataView(dataTable);
dataView.Sort = e.SortExpression + ” ” + ConvertSortDirectionToSql(e.SortDirection);

gridView.DataSource = dataView;
gridView.DataBind();
}
}

¿Cómo usar UpdatePanels? Explicado para humanos

Los UpdatePanels son extensiones de AJAX que sirven para realizar operaciones asyncronicamente, es decir que no se neceista hacer un postback de la pagina para realizar alguna funcion.

Hace poco desarrollé una aplicacion de chat en asp.net con C# y necesitaba que los mensajes conforme iban siendo enviados se mostraran en la pantalla, pero no me podia dar el lujo de estar haciendo postback para esto, entonces decidi usar UpdatePanels y me puse a investigar en internet como usarlos, pero todo lo que encontraba parecia escrito en otro idioma. Al final logré entenderlos y ahora se los voy a explicar de forma sencilla.

Los UpdatePanels se conforman de 2 partes principales: ContentTemplate Triggers. Los ContentTemplate es donde van todos los controles que no queremos que hagan postback. Y los Triggers son los controles que queremos que disparen los eventos.

Veamos el codigo .aspx:

Primero que todo necesitamos un ScriptManager:

<asp:ScriptManager ID=”script” runat=”server” EnablePartialRendering=”true”>
</asp:ScriptManager>

Es importante que pongamos el EnablePartialRengering en true.

Agregaremos un boton :

<asp:Button ID=”btn” runat=”server” Text=”Actualizar Adentro” />

Luego agregamos el UpdatePanel:

<asp:UpdatePanel ID=”up” runat=”server” UpdateMode=”Conditional”>

Aquí debemos ponel el UpdateMode en Conditional.

Ahora creamos el ContentTemplate y ponemos los controles que queremos (en este caso pondre solamente un label):

<ContentTemplate>
<fieldset>
<asp:Label ID=”lbl” runat=”server” Text=”Label”></asp:Label>
</fieldset>
</ContentTemplate>

Luego de los controles tenemos que agregar los Triggers (en este caso pondré al boton que agrgamos al principio como un trigger):

<Triggers>
<asp:AsyncPostBackTrigger ControlID=”btn” EventName=”Click” />
</Triggers>

Al ser un botón, el evento que queremos capturar es el click.

Por últimos cerramos el UpdatePanel:

</asp:UpdatePanel>

Para este ejemplo agregaremos dos controles mas, un Label y otro Botón (afuera del UpdatePanel):

<asp:Label ID=”lbl2” runat=”server” Text=”Label”></asp:Label><br />
<asp:Button ID=”btn2” runat=”server” Text=”Actualizar Ambos” />

Ahora veamos el codebehind (.cs):

Lo que queremos hacer en este ejemplo es que al cargarse la página los labels muestren la hora en que fueron cargados, para esto agregamos el siguiente codigo en el Page_Load:

protected void Page_Load(object sender, EventArgs e)
{
lbl.Text = “adentro: ” + DateTime.Now.ToLongTimeString();
lbl2.Text = “afuera: ” + DateTime.Now.ToLongTimeString();
}

Al cargar la página por primera vez los dos labels deberían mostrar la misma hora, pero al hacer click en el botón que dice Actualizar Adentro debería cambiar solamente la hora del Label que pusismos en el UpdatePanel, ya que este boton lo tenemos como un trigger del UpdatePanel. Y al hacer click en el botón que dice Actualizar Ambos los dos deberian tomar nuevamente la hora actual, ya que este boton genera un postback completo de la página.

Espero que esta información les sea útil y si no entienden algo, estoy a sus ordenes para resolver cualquier duda.

Codigo: Aqui

Para enseñarles esto les voy a mostrar un pequeño ejemplo. Digamos que tenemos un boton y queremos que al hacerle clic cambie a un texto y al volver a clikearlo vuelva a su texto anterior. Primero veremos como hacerlo con Javascript: Escribimos la funcion que hara el cambio:

<script type=”text/javascript>

var ctr = 0 //esta es una variable de control.

function cambiar() { If(var = 0){

$get(‘btn’).value = ‘Cerrar’; ctr = 1;

}

else{

$get(‘btn’).value = ‘Abrir’; ctr = 0;

}

</script>

Luego creamos el boton(esto va despues de la etiqueta body):

<input type=”button” id=”btn” value=”Abrir” onclick=”cambiar();” />

Al hacer click en el boton, este debe cambiar su texto de: Abrir a Cerrar y viceversa. Ahora veamos como hacerlo con asp.net y c#.

En el codigo .aspx agregamos un boton y le ponemos un ID (en este caso le pondre btn) :

<asp:Button ID=”btn” runat=”server” Text=”Abrir” OnClick=”btn_Click” />

Y en el codebehind (.cs):

protected void btn_Click(object sender, EventArgs e)
{
int ctr = 0;
If (ctr == 0)
{
btn.Text = “Cerrar”;
ctr = 1;
}

else
{
btn.Text = “Abrir”;
ctr = 0;
}
}

Y de esta forma podemos hacer lo mismo, solo q con eventos de parte del servidor…
Comenten si les sirvio o si tienen alguna duda.