Libre Configuración Curricular. 1/7 Programación Orientada a Objetos con Herramientas Visuales DiaryWeb Interfaz gráfico.....................................................................................................................................................1 El control Calendar ..............................................................................................................................................2 El control Datagrid ...............................................................................................................................................2 Lógica de negocio ...............................................................................................................................................5 Interfaz gráfico Esta aplicación web consta de dos páginas aspx, una para hacer el login y otra para gestionar las citas del usuario conectado. El aspecto de estas páginas es el siguiente: Pantalla de login Libre Configuración Curricular. 2/7 Programación Orientada a Objetos con Herramientas Visuales Pantalla de gestión de citas El control Calendar Este control web permite gestionar fechas a través de un interfaz gráfico amigable y configurable. Para obtener la fecha seleccionada dispone de la propiedad SelectedDate, para saber cuándo se cambia la fecha haciendo clic en el calendario se tiene el evento _SelectionChanged. El control Datagrid Este control implementa una rejilla de datos web. Su comportamiento es parecido al de las rejillas de datos de las aplicaciones Windows pero con las limitaciones propias de las aplicaciones web. Por ejemplo, este control sólo actualiza los contenido bajo demanda (operación DataBind()), al contrario que el mismo control para aplicaciones Windows que actualiza su contenido de forma automática. Este control se enlaza a una base de datos a través de sus propiedades DataSource y DataMember. El primero es el conjunto de datos (DataSet) con el que se enlaza, y el segundo, es la tabla (vista o comando) del conjunto de datos que se visualiza. A estas propiedades se les suele dar valor en tiempo de diseño, pero el compilador no las chequea, por lo que un error sintáctico en el nombre del conjunto de datos, de la tabla o de las columnas provoca una excepción en tiempo de ejecución. Libre Configuración Curricular. 3/7 Programación Orientada a Objetos con Herramientas Visuales Su aspecto y sus columnas son configurable a través de una página de propiedades. En cuanto a las columnas existen distintos tipos: • Las columnas enlazadas con datos • Las columnas con hiperenlaces • Las columnas con comandos (editar, actualizar, …) Para saber cuándo se pulsa sobre una columna de comando se tiene el evento _ItemCommand, por ejemplo para programa el comando de borrado de una cita se tiene: private void notesDtg_ItemCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e) { notesDtg_CancelCommand(null,null); if (e.CommandName == "Delete") { string date = e.Item.Cells[1].Text; notes.RemoveNote(loginName, createDateTime(date)); notesDtg.DataBind(); } } Para los comandos de “Editar”, “Cancelar” y “Actualizar” se tienen los eventos específicos de _EditCommand, _CancelCommand y _UpdateCommand: Private void notesDtg_EditCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e) { notesDtg.EditItemIndex = e.Item.ItemIndex; notesDtg.DataBind(); } private void notesDtg_CancelCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e) { notesDtg.EditItemIndex = -1; notesDtg.DataBind(); } private void notesDtg_UpdateCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e) { TextBox tb; string hour, text; localhost.notesDts.NotesRow r; hour = e.Item.Cells[1].Text; tb = (TextBox) e.Item.FindControl("textoTxt"); text = tb.Text; DateTime t = createDateTime(hour); r = notes.FindByLoginDate(loginName,t); r.Text = text; notesDtg.EditItemIndex = -1; notesDtg.DataBind(); } Libre Configuración Curricular. 4/7 Programación Orientada a Objetos con Herramientas Visuales La forma de añadir una nueva fila en este control es añadiendo la fila en su conjunto de datos y refrescando el contenido del mismo. Esta nueva fila tendrá unos valores por defecto que podrán ser modificados a través de un comando de “Edición”: private void añadirBtn_Click(object sender, System.EventArgs e) { if (this.IsValid && notesDtg.EditItemIndex == -1) { //Si la validación de la página es correcta y el datagrid no se está editando Try { notes.AddNewNote( createDateTime(horasDdl.SelectedItem.Text), loginName, loginName + ", escriba aqui la cita"); warningLbl.Visible = false; } catch(ConstraintException oops) { //Page.RegisterStartupScript("alert","<script language='javascript'>alert(\"Ya exista una cita a esa hora\")</script>"); warningLbl.Visible=true; } finally { notesDtg.DataBind(); } } } Libre Configuración Curricular. 5/7 Programación Orientada a Objetos con Herramientas Visuales Lógica de negocio El diagrama de clases de esta aplicación web es el siguiente: System.Web.UI.Page #Session Notes #dataSet #webService #count +update() +addNew() +remove() DiaryPage #ws #notes #name #loginName <<aspx>> Default <<aspx>> LogIn Capa de interfaz Capa de negocio (acceso a datos) La clase DiaryPage especializa a una página aspx.net por lo que podrá tener acceso a todas las variables de sesión. Por ejemplo, para guardar el nombre del usuario que se conecta a la agenda se tiene: protected string loginName { set { Session["loginName"] = value; } get { return (string)Session["loginName"]; } } La clase Notes es un envoltorio del servicio web que accede a la base de datos de la agenda. Para ello dispone de dos propiedades, dataSet y webService: public localhost.notesDts DataSet { set { Libre Configuración Curricular. 6/7 Programación Orientada a Objetos con Herramientas Visuales _dts = value; } get { return _dts; } } public localhost.DiaryService WebService { set { _ws = value; } get { return _ws; } } En esta clase se implementarán las operaciones para añadir, actualizar y elinar una cita de la agenda. El código de estas operaciones es el siguiente: public void update() { if (_dts.HasChanges()) _ws.changeNotes(_dts); } public void addNew( DateTime date, string login, string text) { localhost.notesDts.NotesRow row; row = _dts.Notes.NewNotesRow(); row.BeginEdit(); row.Date = date; row.Text = text; row.Login = login; row.EndEdit(); _dts.Notes.AddNotesRow(row); } public void remove (string login, DateTime date) { localhost.notesDts.NotesRow r; r = _dts.Notes.FindByLoginDate(login,date); if ( r != null) r.Delete(); } Libre Configuración Curricular. 7/7 Programación Orientada a Objetos con Herramientas Visuales De esta forma, las páginas LogIn.aspx y Default.aspx sólo contendrán código para gestionar los eventos de sus formularos. Por ejemplo, para que cuando se pulse en el botón de LogIn se autentifique al usuario y se le redireccione a la página de citas se tiene: private void loginBtn_Click(object sender, System.EventArgs e) { if (ws.authenticate(usuarioTxt.Text, passwordTxt.Value)) { loginName = usuarioTxt.Text; name = ws.getUsers().Users.FindBylogin(loginName).name; redirect("./Default.aspx"); } } Donde redirect es una operación que podemos implementar en la clase (página) padre de la siguiente forma: protected void redirect(string page, string frame) { Response.Write("<script>window.open(\"" + page + "\", \"" + frame + "\");</script>"); } protected void redirect(string page) { Response.Redirect(page); }