Tuesday, September 14, 2010

Ciclo De vida De una página ASP.NET

Una página ASP.NET cuando está siendo cargada, por debajo está siendo pasada por distintas etapas de procesamiento. Existen los llamados "Eventos de Página" y eso lo podés localizar dentro de tu code-behind como la imágen mostrada.


Justamente las etapas por las que pasa toda página son esas... y lo siguiente es el órden. Es muy importante conocer el orden ya que así podemos escribir el código apropiado en el momento adecuado.

1.PreInit
2.Init
3.InitComplete
4.PreLoad
5.Load
6.Eventos de control
7.LoadComplete
8.PreRender
9.SaveStateComplete
10.Render
11.Unload

Pero surge una problemática cuando nuestra página ASP.NET tiene un USERCONTROL (ascx)... Hay eventos de página que primero pasa por el usercontro y luego por nuestro aspx.

Justamente ese problema tenía yo. De mi aspx necesitaba enviarle un valor a mi usercontrol y esto lo hacía desde su page_init pero primero pasaba por el page_init del usercontrol de modo que el valor nunca llegaba.

Pero los eventos de página no son los mismo que el de un usercontrol comparados al de un aspx. A continuación se muestra una imágen con los page events de un usercontrol



Como pueden notar, el usercontrol no tiene el evento PreInit asi que este podriamos usarlo para enviar un valor al usercontrol desde el formulario aspx en el caso de que necesitemos que lo reciba antes de su load.

El orden de una página ASP.NET con su usercontrol es como sigue:

.aspx - Page_PreInit()

.ascx - Page_Init()
.aspx - Page_Init()
.aspx - Page_Load()
.ascx - Page_Load()
.aspx - Page_PreRender()
.ascx - Page_PreRender()
.ascx - Page_Unload()
.aspx - Page_Unload()

Tuesday, August 17, 2010

Ajax: Accordion

Me gusta y aquí te va cómo utilizar el control de Accordion de Ajax.

Para ver cómo se ve (valga la redundancia),entra
aqui

Para empezar, si tenés el VS 2008, tenés que instalarte el ToolKit... si aún no lo has hecho, ingresa aquí para saber cómo.

Empezemos.

En el code html de Default.aspx de tu WebSite:

Primero te arrastras el ToolkitScriptManager, quedaria asi:



Luego,te arrastras el Accordion
Dentro de las etiquetras del Accordion, colocas entre etiquetas Panes y dentro de estas, metes todos los AccordionPane que desees... Dentro de estas, metes un Header y un Content. Y dentro del Content es justo el contenido.

Queria mas o menos asi, su estructura:



Ah, por cierto, en mi toolbar del blog no tengo la opción de escribir código pues no es un blog de programación... asi que si alguen tiene algun truco,bien, mientras, lo estoy metiendo dentro de un textarea... lo br se autocrean, uds. los eliminan...

De todos maneras, subí mi Default.aspx y el CSS que le dará estilo... ok?

Se puede bajar de aqui el codigo

Y de aqui la hoja de estilo

Happy Coding...

Monday, July 26, 2010

Allowsorting: gridview (ASP.NET)

Si tu grilla está enlazada desde código, el sorting u ordenamiento no funciona de la misma manera a como si estuviera enlazado desde la vista de diseño a un origen de datos (DataSourceID).

Por ejemplo, en el evento Sorting del gridview, este pedazo de código no funciona: (es decir, siempre se va al ASC y no entra al DESC) Pero para el segundo caso sí, porque... El GridView alternará de forma automática entre "ASC" o "DESC" en SortExpression en cada clic, para conmutar entre orden de clasificación ascendente o descendente.

Dim strOrderBy As String = e.SortExpression
Select Case e.SortDirection

Case SortDirection.Ascending
strOrderBy = strOrderBy + " ASC"
Me.prcCargarPersonas(strOrderBy)
Case SortDirection.Descending
strOrderBy = strOrderBy + " DESC"
Me.prcCargarPersonas(strOrderBy)
End Select

Para el primero, lo arreglé de esta manera (utilizando una variable de state)

Dim strOrderBy As String = e.SortExpression

Select Case Me.ViewState("Orden")
Case "ASC"
strOrderBy = strOrderBy + " ASC"
Me.prcCargarPersonas(strOrderBy)
ViewState("Orden") = "DESC"
Case "DESC"
strOrderBy = strOrderBy + " DESC"
Me.prcCargarPersonas(strOrderBy) 'este es mi método que carga y bindea mi
grilla
ViewState("Orden") = "ASC"
Case Else
strOrderBy = strOrderBy + " ASC"
Me.prcCargarPersonas(strOrderBy)
ViewState("Orden") = "ASC"
End Select

Todo dentro del evento SORTING del gridview. Previamente, se le añade la propiedad a tu gridview AllowSorting="True" y por cada columna a utilizar para el sort, se le añade la propiedad SortExpression="NombreColumnaBaseDeDatos"

Wednesday, June 30, 2010

Datagrid ASP.NET jscript y querystring

Muchas veces necesitamos pasar datos de una página a otra. Una manera es usando los querystring y a veces hay casos que a de esta otra página necesitamos pasar datos a los controles de la página padre. Me explico?

Tengo un formulario padre que llama a un popup, al cerrar el popup se necesita bajar ciertos datos a ciertas cajas de texto del formulario al que lo llamó.

Solucionamos esto con JavaScript.

El código JS sería...

function popupBusqueda(idForm,control1,control2,idAlmacen,idEmpresa)
{
aleatorio = (Math.round((Math.random()*99999)+1))
popUpBus =
window.open(idForm + '?formname=' + document.forms[0].name + '&Control=' +
control1 + '&Control2=' + control2 + '&idAlm=' + idAlmacen +
'&idEmp=' + idEmpresa,
aleatorio,"scrollbars=yes,status=yes,width=600,height=500,left=150,top=100");
}

Los parámetros, para este caso, son: el id del formulario,caja de texto1, caja de texto2 (a las que se bajaran los datos) , y los ids que necesitamos mandar para realizar el filtro en el popup.

Luego, utilizamos este método js en el formulario padre de la siguiente forma.
Dim strQueryString As String
strQueryString =
":popupBusqueda('fPopup.aspx','txt1','txt2', " + Me.id1.Value + ", " +
Me.id2.Value + ")"
Me.aBusqueda.HRef = "javascript:javascript" &
strQueryString

(Me.aBusqueda es un anchor.)

Después, en el formulario hijo o popup, en el load capturamos los valores del querystring:

queForm = Request.QueryString("formname")
y así se va haciendo con cada uno. Lo podemos poner en un string, en un view

En el If Not Page.IsPostBack Then, cargamos la grilla.
luego del DataBind(). Va un procedimiento que coloca un JS al linkbutton de la grilla (que es uno de tipo Select)

Public Sub recorrerGrilla()
For i As Integer = 0 To grdBusqueda.Items.Count
- 1
For j As Integer = 2 To grdBusqueda.Items(i).Cells.Count - 1

Dim
button As LinkButton = CType(grdBusqueda.Items(i).Cells(0).Controls(0),
LinkButton)

button.Attributes.Add("onclick", "window.opener.SetBuscar('"
+ queForm + "','" + queControl1 + "','" + queControl2 + "','" +
grdBusqueda.Items(i).Cells(1).Text + "','" + grdBusqueda.Items(i).Cells(2).Text
+ "'" + ");return false;")

Next
Next
End Sub

El js del SetBuscar es como sigue:

function SetBuscar(formName, idCod, idDscr,newCod,newDesc)
{
eval('var
theform = document.' + formName + ';');
popUpBus.close();
if (idCod !=
'') theform.elements[idCod].value = newCod;
if (idDscr != '')
theform.elements[idDscr].value = newDesc;
if (idCod != '')
__doPostBack(idCod,'');
}


Y fiiiiin...
haPPy Coding.

Thursday, June 24, 2010

Cómo agregar datos A un datagrid (VB.NET - ASP.NET) sin perdidas por Un postback

CóMo AgReGaR DaTos A un DataGrid (VB.NET - ASP.NET) SiN PeRdiDaS PoR Un PosTBaCk

El título ya detalla lo que se quiere hacer, no hay mucho por explicar. Vamos directo al código...

Primero, en el If Not IsPostBack Then del Page_Load, cargamos nuestra grilla normalmente y acto seguido le agregamos la siguiente línea de código: Session("Datos") = ds.Tables(0)

En el click de nuestro botón AGREGAR, programamos asi:


Dim dt As DataTable = DirectCast(Session("Datos"), DataTable)

Dim dr As
DataRow = dt.NewRow
dr("dcconccon") = Me.txtCodCli.Text
dr("dcconnoap")
= Me.txtNomCli.Text
dr("inalmcalm") = Me.cboAlmacenes.SelectedValue
dr("inalmnomb") = Me.cboAlmacenes.SelectedItem.Text
dt.Rows.Add(dr)

Me.dgrClientesXAlm.DataSource = dt
Me.dgrClientesXAlm.DataBind()

Session("Datos") = dt


Los rows o las filas de nuestro datatable deben coincidir con las de nuestra grilla. Los datos los extraemos de cajas de texto, combos u otro control.

Con esto, podemos guardar filas y filas de datos en nuestra grilla temporalmente hasta que decidamos mandarlas a la base de datos