Quique Martínez

EF,Silverlight,WPF.. y algo más

// Certificaciones




 

// Post recientes

// Nube de tags

// Sigueme

// Comunidades

// Blogs que sigo

Gerard Lopez

Joaquin Sosa

Omar del valle

Toni Recio

Fran diaz

Javier Conesa

Gisela Torres

David Salgado

Marc Rubiño

José Manuel Alarcón

José Miguel Torres

Community

Email Notifications

Archives

HERRAMIENTAS AZURE I

Hace unos días, un excompañero de trabajo me pidio consejo de como solucionaba unos “problemas”, que se te pueden plantear cuando trabajas con Windows Azure. Por eso pense en este post, ya que una persona me lo pidio, por que no me lo van a pedir otras :D ? todo sea por ayudar. En concreto, los “problemas” eran los siguientes:

  • Backup Sql Azure
  • Monitorización del deploy.

Yo he solucionado estos problemas con 2 software de terceros (de pago). Se que mucha gente no comparte el tema de comprar herramientas, pero en mi caso no es así, a mi si realmente merece la pena no me importa. También es cierto que en este caso lo paga mi empresa ^^

Backup Sql Azure

La herramnienta es de Red Gate, una de las empresas que se dedica a crear herramientas en su mayor parte para sql. El nombre es “Sql Azure Backup” http://www.red-gate.com/products/dba/sql-azure-backup/.

La utilización es muy sencilla, a continuación os adjunto 2 “screenshots” que nos permite crear el backup.

Aquí tenéis los 3 pasos a seguir, veréis que es increíblemente simple :D

 

                                           

 

Monitorización Azure

Para solventar este problema implementamos Azure Diagnostics(El siguiente post será sobre esto.) , para poder consumir los datos utilizamos Azure diganostics Manager http://www.cerebrata.com/Products/AzureDiagnosticsManager/

Aquí os dejo un video, yo creo que será de utilidad.

 

http://cerebrata.blob.core.windows.net/onlinedemos/azurediagnosticsmanager/performancecounters/performancecountersdemo.html?

 

Con esto doy por finalizado el post, antes de nada, perdón por las imágenes que están editadas muy mal… cualquier comentario será bien recibido…

 

Quique

 

Seleccionar y copiar texto en Silverlight

 

Después de varios intentos y falta de tiempo, he decidido, ponerme como tarea, el escribir, por que así, plasmare todo lo que aprendo cada día Risa, espero que sirva de ayuda alguno de mis posts.

En la actualidad, las aplicaciones en Silverlight no nos permiten seleccionar y copiar texto de una manera cómoda, sin utilizar las llamadas “Hot Keys”. En este sería “Control + C”, pero como ya comentaba antes, no es cómodo para el usuario tener que conocer estos métodos, es por eso que haremos el siguiente control para poder hacer esta tarea con el típico clic del botón derecho de nuestro ratón.

Lo primero será crea un control, que hereda de “Text box” y ahí gestionar todos los eventos y propiedades del control, el código será el siguiente:

namespace Silverlight.Common.Controls
{
    public class TextBoxWithCopyControl : TextBox
    {
        ContextMenu menu = null;
        MenuItem item;

        public TextBoxWithCopyControl()
        {
            this.MouseRightButtonDown += new 
MouseButtonEventHandler(TextBoxWithCopyControlMouseRightButtonDown);
            this.MouseRightButtonUp += new 
MouseButtonEventHandler(TextBoxWithCopyControlMouseRightButtonUp);
        }

        void TextBoxWithCopyControlMouseRightButtonUp(object sender, MouseButtonEventArgs e)
        {
            menu = new ContextMenu();
            item = new MenuItem();
            item.Header = "Copiar";
            menu.Items.Add(item);
            item.Click += new RoutedEventHandler(item_Click);
            menu.IsOpen = true;
            menu.HorizontalOffset = e.GetPosition(null).X;
            menu.VerticalOffset = e.GetPosition(null).Y;
        }

        static void TextBoxWithCopyControlMouseRightButtonDown(object sender, 
MouseButtonEventArgs e)
        {
            e.Handled = true;
        }

        void item_Click(object sender, RoutedEventArgs e)
        {
            Clipboard.SetText(this.Text);
        }
    }
}

Después de crear el control, tenemos que crear un estilo, ya que al heredar de “TextBox” la presentación en pantalla puede no ser la esperada, por ello creamos el siguiente estilo.

<Style x:Key="SelectableTextBoxStyle" TargetType="TextBox">
        <Setter Property="IsReadOnly" Value="true"/>
        <Setter Property="Background" Value="Transparent"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="TextBox">
                    <Grid x:Name="RootElement">
                        <ScrollViewer x:Name="ContentElement" 
Background="{TemplateBinding Background}" Padding="{TemplateBinding Padding}" 
BorderThickness="0"/>
                    </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

Ahora solo nos queda aplicar el control a esos textos que queremos darle esta propiedad, dejo aquí un ejemplo:

<Controls:TextBoxWithCopyControl x:Name="txtDescription" TextWrapping="Wrap" 
Style="{StaticResource SelectableTextBoxStyle}" HorizontalAlignment="Left" 
FontSize="21.333" Foreground="#FF1F1F1F" FontWeight="Bold" FontFamily="Tahoma" 
Width="365" Text="{Binding Question.Description, Mode=OneWay}" Margin="4" />

Ahora podemos seleccionar texto y al pulsar botón derecho, nos permitirá copiarlo.

Customizando los formularios de nuestro Outlook 2010

Normal 0 false 21 false false false ES X-NONE X-NONE

Bueno, después del cambio de trabajo y mil cosas, va un intento por retomar el blog, ahora lo que queda es proponérselo… he borrado 3 artículos a medias porque al releerlos no me gustaban…

Ahora empezamos con la temática del post, es sobre VSTO y Outlook, antes del mini proyecto que se me asigno nunca había tocado nada de Addins para office y la verdad que se pueden hacer cosas muy chulas para usuarios finales de office. Des de crearte tu propia Ribbon para agrupar tus menús, hasta substituir el form de “New Email”, esto último es lo que he pensado para el post, algo rápido, pero que ayudará a la gente que nunca haya hecho nada de addins y quiera tener una idea global, de lo que puede llegar a hacer.

Lo primero de todo, es crear un proyecto en VS2010, en mi caso C#, vamos a Office 2010 y dentro de este escogemos Outlook AddIn. En el momento de darle el nombre y créalo veremos que automáticamente nos crea una estructura en la que tenemos lo típico de un proyecto, references, propierties y Outlook, aquí es donde ira la base de nuestro proyecto. En el momento de crear el proyecto, dentro de la clase Outlook, vemos  el ThisAddIn.cs, aquí es donde automáticamente nos ha generado 2 cosas a tener encuentra.

Primero:

El lanzador de nuestro AddIn, que se ejecuta al iniciar Outlook.

  private void InternalStartup()

        {

            this.Startup += new System.EventHandler(ThisAddIn_Startup);

            this.Shutdown += new System.EventHandler(ThisAddIn_Shutdown);

        }

 

Y después, los métodos que se pueden ver en el InternalStartup.

  private void ThisAddIn_Startup(object sender, System.EventArgs e)

        {

        }

 

        private void ThisAddIn_Shutdown(object sender, System.EventArgs e)

        {

        }

 

Como ya seguro que habéis intuido, el ThisAddIn_Startup, se llama al iniciar la aplicación (aquí es donde tendremos que llamar, a muchas delas funciones, capturar inspectores, llamar a nuevos forms, etc...) y ThisAddIn_Shutdown, que es el que se llama al cerrar la aplicación.

Como ya he comentado en la introducción, este post va sobre, utilizar otro form de envió de emails, para ello necesitamos capturar el “inspector” que llama Outlook, en el momento que se pulsa el botón de nuevo email, la hot key o cualquier atajo que se tengan para abrir el formulario que nos permite enviar un email.

Ahora, que es un Inspector?, según MSDN :

La clase Microsoft.Office.Interop.Outlook.Inspector representa una ventana que muestra un único elemento, como por ejemplo, un mensaje de correo electrónico, tarea o cita en la interfaz de usuario de Outlook. La clase Inspector incluye métodos y propiedades, que se pueden utilizar para modificar la ventana, y eventos que se generan cuando la ventana cambia.

Después de está maravillosa definición, que creo que todos entendemos, vamos a ponernos  a escribir un poco de código, lo primero, preparar el Nuevo form, cada uno que lo haga a su gusto :P, el mio será muy simple.

Aquí está:


Ahora que ya tenemos el diseño del Form, queda programar los dos botones, lo dejo acontinuación.

   private void btnCancelar_Click(object sender, EventArgs e)

        {

            this.Close();

        }

 

  private void btnAceptar_Click(object sender, EventArgs e)

        {

            try

            {

                Outlook.MailItem _mail = new Outlook.MailItem();

               

                _mail.To = this.txtTO.Text;

                _mail.Subject = this.txtSubject.Text;

                _mail.Body = this.txtMessage.Text;

                _mail. Send();

            }

            catch (Exception _ex)

            {

                MessageBox.Show(_ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);

            }

        }

 

Ahora, lo queda la programación del Addin, para que cuando se pulse en el botón Nuevo Email, llame a nuestro formulario y no al de Outlook por defecto.

Voy a poner primero la lista, de cosas que se tienen que hacer y después el código, espero que está manera os guste o sino comentarlo por favor, y para el siguiente cambio de manera de hacerlo.

·         Declaramos las variables Inspector y Mail.

·         Creamos el método que nos crea un nuevo inspector.

·         Creamos el método, que nos permite capturar los eventos de Outlook.

·         Y en el método Startup, programamos el tema de los inspectors.

 

#region

using System;

using System.Windows.Forms;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Xml.Linq;

using Outlook = Microsoft.Office.Interop.Outlook;

using Microsoft.Office.Interop.Outlook;

using System.Diagnostics;

using Microsoft.Office.Core;

using Application = Microsoft.Office.Interop.Outlook.Application;

#endregion

 

namespace OutlookAddIn2010

{

    public partial class ThisAddIn

    {

        public Inspectors Inspectors { get; set; }

        public MailItem Mail { get; set; }

 

 

        private void ThisAddIn_Startup(object sender, System.EventArgs e)

        {

 

            this.Inspectors = this.Application.Inspectors;

            this.Inspectors.NewInspector += this.InspectorsNewInspector;

        }

 

        private void ThisAddIn_Shutdown(object sender, System.EventArgs e)

        {

        }

 

        #region VSTO generated code

 

        /// <summary>

        /// Required method for Designer support - do not modify

        /// the contents of this method with the code editor.

        /// </summary>

        private void InternalStartup()

        {

            this.Startup += new System.EventHandler(ThisAddIn_Startup);

            this.Shutdown += new System.EventHandler(ThisAddIn_Shutdown);

        }

 

        #endregion

 

        /// <summary>

        /// Lanzado por VSTO cuando se produce la edición de cualquier objeto

        /// </summary>

        /// <param name="inspector">Objeto a inspeccionar</param>

        public void InspectorsNewInspector(Inspector inspector)

        {

            try

            {

                this.CaptureOpenAction(inspector);

            }

            catch (System.Exception _ex)

            {

                MessageBox.Show(_ex.Message);

            }

        }

 

 

        private void Mail_OpenCancel(ref bool Cancel)

        {

            Cancel = true;

        }

 

        private void CaptureOpenAction(Inspector inspector)

        {

            try

            {

                //Al hacer el set de la variable mail, si es un NewEmail, seguirá y abrirá el form, en caso

                //contrario, se va por el catch y no hace nada.

                this.Mail = (MailItem)inspector.CurrentItem;

                //Abrimos nuestro formulario de Nuevo Email

                Forms.NewEmail _form = new Forms.NewEmail();

                _form.ShowDialog();

                //Cancelamos que se abra el formulario por defecto de Nuevo Mail

                Mail.Open += Mail_OpenCancel;

            }

            catch { }

        }

    }

}

 

 

Y hasta aquí, el post sobre VSTO, solo espero poder dedicarme a tope con el blog y que algún post os sirva de ayuda.

 

Hasta la próxima :D

 

Y gracias un compañero (Jaume), que me dio una mini formación en VSTO, en el momento que me hizo falta ;)

Posted: 15/9/2010 14:20 por Quique Martínez | con 3 comment(s) |
Archivado en: ,,
Dataset.XMLWriter </Versus> XML. XmlTextWriter

Quería que el primer artículo del blog fuera de un tema sencillo, para soltarme un poco,  pensando en que escribir, he recordado una duda que se me planteo el otro día en el trabajo y que un compañero me ayudo a resolver a “su manera”; tenía que crear una función que modificase/crease un bloque en un fichero XML.

Hay muchas maneras de crear ficheros XML, una es crearlo con StreamWriter línea a línea de una manera muy prehistórica  como por ejemplo:

Código Prehistórico

private void Prehistorico()

        {

            String Nombre, Apellido, Posicion;

            Nombre = this.txtNombre.Text;

            Apellido = this.txtApellido.Text;

            Posicion = this.cmbPosicion.SelectedText;

 

            using (StreamWriter writer = new StreamWriter("Sample2.xml"))

            {                 

                writer.WriteLine("<equipo>");

                writer.WriteLine("<ficha>");

writer.WriteLine("<ID>"+ID+"</ID>");

                writer.WriteLine("<nombre>"+Nombre+"</nombre>");

                writer.WriteLine("<apellido>" + Apellido + "</apellido>");

                writer.WriteLine("<posicion>" + Nombre + "</posicion>");

                writer.WriteLine("</ficha>");

                writer.WriteLine("</equipo>");

            }

 

 

        }

 

En el caso de modificar, un fichero XML, de está forma tendríamos que ir línea a línea y buscar el tag ID, para saber si existe o no, de forma que tenemos que tenemos que abrir el fichero, recorrerlo y después cerrarlo, esto no es muy útil cuando el framework nos ofrece otras formas de trabajar con el XML.

Después tenemos dos métodos que desde mi punto de vista son los mejores que podemos usar (siempre desde mi punto de vista ;) y se aceptan sugerencias/discusiones).

Una seria XmlTextWriter (http://msdn.microsoft.com/es-es/library/system.xml.xmltextwriter.aspx) y la otra DataSet.WriteXmlSchema (http://msdn.microsoft.com/es-es/library/system.data.datatable.readxml%28v=VS.80%29.aspx).

El motivo de este artículo viene aquí, en los problemas que me da el XmlTextWriter al intentar añadir elementos nuevos a un XML ya creado y comprobar previamente, que no exista ya un elemento dentro del fichero XML. Ya que ir nodo a nodo, e hijo a hijo, puede llegar a ser pesado.

Es ahí donde entra el DataSet.WriteXmlSchema, que realmente lo hace de una forma sencilla.

A grandes rasgos lo que hace es, cargar todo el xml dentro de un dataset y después lo podemos recorrer como hacemos siempre y ahí es donde comprobamos si existo o no nuestro nuevo bloque.

A continuación escribiré el de código, en C# y asi intentare demostrar que es todo más fácil con DataSet.WriteXmlSchema . (Siempre des de mi punto de vista)

 

 

Función al pulsar el botón XmlDataset

private void btnXmlDataset_Click(object sender, EventArgs e)

        {

            DataSet ds = new DataSet();

            DataTable dt = new DataTable();

            bool flag= false;

            int i=0;

           

            ds.ReadXml("Sample3.xml");

           

            while (i< ds.Tables[0].Rows.Count)

            {

                //Sabemos que el ID, es Unique

                if (ds.Tables[0].Rows[0].ItemArray[0].ToString().Equals(this.txtID.Text))

                {

                    MessageBox.Show("El ID que intentas ingresar, ya está dentro del XML");

                    flag = true;

                }               

                    i++;

            }

            if (!flag)

            {               

                DataRow dr = ds.Tables[0].NewRow();               

                dr[0] = this.txtID.Text;

                dr[1] = this.txtNombre.Text;

                dr[2] = this.txtApellido.Text;

                dr[3] = this.cmbPosicion.SelectedItem.ToString();            

                ds.Tables[0].Rows.Add(dr);

                ds.WriteXml("Sample3.xml");

            }

        }

 

Si quisiéramos, modificar solo abría que poner el código dentro del if, que contiene el MessageBox, guardar la row y escribir el xml con el dataset.

Si usaramos la clase XmlWriter directamente, tendríamos que buscar nodo a nodo e hijo a hijo, cosa que a nivel de código puede ocupar más, pero yo creo que de está forma es más sencillo.

 

Espero que el post, haya sido de vuestro agrado ;)

Nos leemos

P.D Aún estoy jugando, con el blog para poder insertar código de una manera decente, perdonar si no se entiende algo.

Quique

 

 

 

Posted: 3/5/2010 21:13 por Quique Martínez | con 1 comment(s) |
Archivado en: ,,,
He llegado a geeks :)

Bueno antes de nada, quiero agradecer a Toni Recio, el poder estar aquí, ya que él fue quien me puso en contacto con Rodrigo Corral, para poder formar parte de esta comunidad de bloggers tan conocida, ahora me presento para que seáis un poco más de mí.

Me llamo Quique Martínez, soy analista programador en Pasiona Consulting (BCN), llevo más de 5 años en este mundo, por lo que me queda mucho que aprender, y es por eso que pienso que tener un blog en Geeks, me puede ayudar a plantearme cosas nuevas y aportar un granito de arena a la comunidad .Net, también colaboro con SecondNug, que os recomiendo que visitéis si no lo hacéis ya ;).

Voy a hacer todo lo posible por meterle caña al blog y hacer artículos de calidad,  para poder estar al nivel que ya hay en esta comunidad.

Cualquier duda, sugerencia u opinión sobre el blog, serán bien recibidas, hasta aquí el primer post y empezamos ;)

 

Nos leemos ;)

 

Quique

Posted: 2/5/2010 20:58 por Quique Martínez | con 15 comment(s) |
Archivado en: ,