Mostrando las entradas con la etiqueta Csharp. Mostrar todas las entradas
Mostrando las entradas con la etiqueta Csharp. Mostrar todas las entradas

jueves, marzo 29, 2012

Establecer un fondo en tiempo de diseño a un formulario Windows en C#

para este ejemplo debemos tener dos formularios, uno se usará como plantilla en donde manipularemos el evento Paint y el otro heredará el diseño del formulario plantilla:

Pero en este ejemplo el efecto visual solo podrá ser apreciado en tiempo de diseño, es decir que cuando ejecutemos la aplicación solo mostrara un formulario normal.

En el evento Paint del del formulario plantilla colocamos el siguiente código:

   private void Form2_Paint(object sender, PaintEventArgs e)
        {
            if (this.DesignMode)
            {
                SolidBrush drawBrush = new SolidBrush(Color.LightSteelBlue);
                Point p = new Point(this.ClientRectangle.Width - 170, this.ClientRectangle.Height - 25);
                
                Pen pen = new Pen(drawBrush,1);
                Size rec = this.Size;
                rec.Width = rec.Width - 28;
                rec.Height = rec.Height - 50;
                Rectangle r = new Rectangle(new Point(5, 5), rec);
                e.Graphics.DrawRectangle(pen, r);

                e.Graphics.DrawString("Milton Baltazar Valenzuela", new Font("Arial", 10), drawBrush, p);
            }
        }


Y en el primer formulario modificamos la parte donde hereda de un control Form por el formulario plantilla


public partial class Form1 : Form2


vemos que cuando heredamos la parte visual del formulario cambia como se muestra en la imagen.



cuando ejecutamos vemos que el diseño se ha perdido porque en el formulario plantilla hemos establecido que solo se aplique en tiempo de diseño con DesignMode.

miércoles, marzo 28, 2012

Ejecutar una función JavaScript y luego el evento al hacer click en un Boton ASP.Net

En ocasiones es necesario validar información por el lado del cliente con JavaScript y luego ejecutar el evento del boton ASP.Net.

Para lograr esto el control Button cuenta con  las propieades OnClick y OnClientClick.

En el siguiente ejemplo se usa OnClientClick para ejecutar una función Javascript que valide datos, el cual devoverá true cuando todo sea correcto y false cuando haya algo que validar. Si la funcion JavaScript devuelve false el evento OnClick no se ejecutara.

En el siguiente ejemplo he agregado un formulario web llamado WebForm1.aspx, en donde he añadido 3 cajas de texto, un boton y un control literal para el mensaje de confirmación.

el usuario solo podrá grabar cuando todas las cajas de texto tengan algun valor. si alguna d las cajas de texto esta vacia entonces mostrará un mensaje diciendo que falta datos por validar, en caso de que todas las cajas de texto contengan algun valor entonces mostrará un mensaje preguntando si se desea realizar la transaccion, en caso de que el usuario acepte mostrará un mensaje en el control literal indicando que los datos fueron grabados.

Para este ejemplo existen dos momentos al hacer click en el boton Grabar, el primer momento es cuando se realiza la validacion de los datos con javascript, en el cual se mostraran los mensajes de pregunta o alerta segun el caso. una vez que se ha pasado todas las valdiaciones la función Validar() de javascript retornará un valor booleano. cuando es true automáticamente pasa a ejecutar el evento OnClick del boton que se ha programado del lado del servidor.

Este el código JavaScript que valida la información


 
        function Validar()
        {
            var error = 0;
            
            if (document.getElementById('<%=TextBox1.ClientID %>').value == '' )
            {
                error = 1;
            }
            if ( document.getElementById('<%=TextBox2.ClientID %>').value == '' )
            {
                error = 1;
            }
            if (document.getElementById('<%=TextBox3.ClientID %>').value == '' )
            {
                error = 1;
            }
          
            if(error == 0)
            {
                if (confirm("Esta seguro que desea grabar?"))
                {
                    return true;
                }
                else
                {
                    return false;                            
                }

            }
            else
            {
                alert('Valide los datos antes de grabar');
                return false;
            }
        } 

Codigo del boton Asp.Net que ejecuta primero la función JavaScript y luego el evento del mismo control Button.
 


Código del lado del servidor que se ejecuta cuando se haya validado todo y el usuario confirme que desea grabar
    protected void Button1_Click(object sender, EventArgs e)
        {
            Literal1.Text = "Datos grabados";
        }







pueden descargar el código de la ejemplo en la siguiente dirección: enlace

lunes, marzo 26, 2012

Obtener el PublicKeyToken de una dll en C#

Conocer el PublicKeyToken de una dll es necesario cuando queremos registrar una dll en el .config de nuestro proyecto o cuando queremos usarlo en la directiva  <%@ Page %> o <%@ Control %>  de nuestra aplicacion web.

Este es un código que te permite obtener el PublicKeyToken de una dll, para ello debemos importar la libreria  System.Reflection;  


       private void button1_Click(object sender, EventArgs e)
        {
        
            Assembly midll = System.Reflection.Assembly.LoadFile(textBox1.Text);
            Byte[] publickeytoken = midll.GetName().GetPublicKeyToken();
            StringBuilder sb = new StringBuilder();

            for (int i = 0; i < publickeytoken.Length; i++)
            {
                sb.Append(publickeytoken[i].ToString("x"));
            }

             sb.ToString();
            richTextBox1.Text = sb.ToString();
        }

        private void button2_Click(object sender, EventArgs e)
        {
            using (OpenFileDialog open= new OpenFileDialog())
            {
                open.ShowDialog();
                textBox1.Text = open.FileName;
            }
        }         


El diseño del formulario es el siguiente:


sábado, marzo 10, 2012

Add-Ins Visual Studio .NET: Como crear un plug-in para Visual Studio .Net 2008

En este post comentaré un poco acerca de los proyectos Visual Studio .NET Add-in. Este tipo de proyectos añade funcionalidades personalizadas al IDE de Visual Studio, por ejemplo se le puede incorporar una opción que descargue archivos via FTP o cualquier funcionalidad que no venga en el IDE de visual Studio. Voy a realizar un sencillo ejemplo que incorpora un menú que abre un formulario. Debemos añadir un proyecto tipo Add-in, para ello se debe seguir la secuencia de las siguientes pantallas












por defecto se incorpora una clase llamada Connect.cs, el cual incorpora métodos que interactuan con la IDE de Visual Studio.

Al ejecutar presionando F5, veremos se abre una IDE de visual Studio y se le añad un submenu dentro del menu  Tools


Esto se debe a que la clase Connect.cs incorpora un método llamado OnConnection el cual tiene el código que permite manipular las opciones estandar de Visual Studio.

Para abrir un formulario cuando se haga click en el submenu MyAddin3 debemos programar el evento Exec, por defecto vienen asi:
 

  public void Exec(string commandName, vsCommandExecOption executeOption, ref object varIn, ref object varOut, ref bool handled)
  {
   handled = false;
   if(executeOption == vsCommandExecOption.vsCommandExecOptionDoDefault)
   {
    if(commandName == "MyAddin3.Connect.MyAddin3")
    {
     handled = true;
     return;
    }
   }
  }
Debemos añadir el código que abre el formulario, quedaria de esta manera:

 

  public void Exec(string commandName, vsCommandExecOption executeOption, ref object varIn, ref object varOut, ref bool handled)
  {
   handled = false;
   if(executeOption == vsCommandExecOption.vsCommandExecOptionDoDefault)
   {
    if(commandName == "MyAddin3.Connect.MyAddin3")
    {
                                      Form1 frm = new Form1();
                                      frm.ShowDialog();
          return;
    }
   }
  }
Por último, al ejecutar el programa y dar click en el submenu MyAddin3 vemos que se abre el formulario.


martes, marzo 06, 2012

Redireccionar la versión de un ensamblado a otro con BindingRedirect

 En ocasiones es necesario usar una versión mas reciente o antigua de una dll, para esto debes configurar en el App.config o Web.config de tu proyecto en .NET para que realice la redireccion de tu componente automáticamente.
 


    
    
      
        
        
        
      
    
  

sábado, octubre 22, 2011

Saber el PRODUCTCODE de un instalador usando Batch

despues de algunos meses sin postear escribire algo acerca del PRODUCTOCODE de los paquetes de instalación de windows.



Cuando generamos un instalador de un proyecto hecho en .NET, se genera un paquete con la extension msi. Al generar un instalador podemos indicarle la versión, la ruta donde se intalará, el ProductCode entre otras cosas.



Cada vez que se cambia la version en la capa de instalación de un proyecto en .NET, el entorno hace la siguiente pregunta:






Si le damos click en Sí, el ProductCode cambiará automaticamente.


el productCode de una aplicación .NET es importante a la hora de querer desinstalar una versión antigua o si derrepente se quiere realizar una actualizacion a la versión actual.


Teniendo en claro esto, que pasa si solo se cuenta con el instalador .msi y no se tiene las fuentes o si por ahi se realizó una instalacion con cierta versión y las fuentes originales sufrieron mas cambios de versiones sin haber guardado un historial.


Una solución para saber el ProductCode de un instalador es la siguiente:

Crear el archivo GetMSIProductCode.vbs (la extensión debe ser .vbs) y colocar el siguiente script:





'---------------------------------------------------------------------------------------------


' GetMSIProductCode.vbs

Option Explicit

' Variables
Const msiOpenDatabaseModeReadOnly = 0

' Get command-line arguements
Dim argCount:argCount = Wscript.Arguments.Count

' Connect to the Windows Installer object.
On Error Resume Next
Dim installer : Set installer = Nothing
Set installer = Wscript.CreateObject("WindowsInstaller.Installer") : CheckError

' Open the database (read-only).
Dim databasePath:databasePath = Wscript.Arguments(0)
Dim openMode : openMode = msiOpenDatabaseModeReadOnly
Dim database : Set database = installer.OpenDatabase(databasePath, openMode) : CheckError

' Extract language info and compose report message
Wscript.Echo "Database (MSI) = " & databasePath
Wscript.Echo "ProductName = " & ProductName(database)
Wscript.Echo "ProductCode = " & ProductCode(database)

' Clean up
Set database = nothing
Wscript.Quit 0

' Get the Property.ProductName value.
Function ProductName(database)
On Error Resume Next
Dim view : Set view = database.OpenView("SELECT `Value` FROM `Property` WHERE `Property` = 'ProductName'")
view.Execute : CheckError
Dim record : Set record = view.Fetch : CheckError
If record Is Nothing Then ProductName = "Not specified!" Else ProductName = record.StringData(1)
End Function

' Get the Property.ProductCode value.
Function ProductCode(database)
On Error Resume Next
Dim view : Set view = database.OpenView("SELECT `Value` FROM `Property` WHERE `Property` = 'ProductCode'")
view.Execute : CheckError
Dim record : Set record = view.Fetch : CheckError
If record Is Nothing Then ProductCode = "Not specified!" Else ProductCode = record.StringData(1)
End Function

Sub CheckError
Dim message, errRec
If Err = 0 Then Exit Sub
message = Err.Source & " " & Hex(Err) & ": " & Err.Description
If Not installer Is Nothing Then
Set errRec = installer.LastErrorRecord
If Not errRec Is Nothing Then message = message & vbNewLine & errRec.FormatText
End If
Fail message
End Sub

Sub Fail(message)
Wscript.Echo message
Wscript.Quit 2
End Sub


'---------------------------------------------------------------------------------------------


En el disco “C:\” copiar el instalador .msi del cual se desea saber su ProductCode y además copiamos el archivo GetMSIProductCode.vbs que acabamos de crear

En la ventana de ejecutar colocamos CMD e ingresamos al DOS

Luego, en la ventana de DOS nos situamos en el disco “C:\“ (o en el directorio que elijas pero debes copiar el instalador y el GetMSIProductCode.vbs)

Escribimos el siguiente código:

cscript GetMSIProductCode.vbs "[nombre del instalador].msi"

si el instalador se encuentra en otra ruta debes colocar la dirección completa.

El resultado arrojará el ProductCode en el DOS.

sábado, marzo 05, 2011

Reutilizar eventos en Csharp

Muchas veces los eventos de cada formulario en una aplicación MDI repiten el mismo código, por ejemplo si queremos que se abra una ventana de ayuda al presionar F1 debemos repetir el mismo código en el evento KeyDown de todos los formularios y programar la llamada a la ventana de ayuda.

Para simplificar estos temas y reutilizar código podemos optar en crear solo una función que llame a la ventana de ayuda y se ejecute cada vez que el usuario presione F1.

El siguiente ejemplo tiene un formulario MDI y dos formularios hijos, donde cada vez que se presione la tecla F1 en los formularios hijos muestre un mensaje, ademas, en la parte inferior del formulario MDI debe mostrar el nombre del formulario hijo actual.

En el formulario MDI programamos la función que abre a los formularios hijos y se asigna los eventos Activated y KeyDown para los resultados que deseamos conseguir.


//Funciones Generales

//Abrir los formularios hijos
private void fOpenWindows(Form value)
{
value.MdiParent = this;
value.Show();
//Para que los eventos de teclado se apliquen a todo el formulario
value.KeyPreview = true;
//Reutilizamos el evento activate en el formulario que vamos a abrir
value.Activated += new System.EventHandler(EvtActivate_Activated);
//Reutilizamos el evento KeyDown en el formulario que vamos a abrir
value.KeyDown += new KeyEventHandler(EvtKeyDown_KeyDown);
this.tslNomFormularioActivo.Text = value.Text;
}

//Mostrar el nombre del formulario activo
private void EvtActivate_Activated(Object sender, EventArgs e)
{
//Mostrar el nombre del formulario Activo en la parte
//inferior del MDI
this.tslNomFormularioActivo.Text = ((Form)sender).Text;
}


//Tecla presionada por el usuario
private void EvtKeyDown_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)
{
//Mostrar un mensaje cuando se presione F1
if (e.KeyCode == Keys.F1)
{
MessageBox.Show("Usted presionó la tecla F1");
}
//Mostrar un mensaje cuando se presione F2
else if (e.KeyCode == Keys.F5)
{
MessageBox.Show("Usted presionó la tecla F5");
}
//Cuando se presione teclas combinadas que usen Ctrl + {tecla}
else if (e.Control == true)
{
//cuando el usuario presiona Ctrl + C mostrar un mensaje
if (e.KeyCode == Keys.C)
{
MessageBox.Show("Usted presionó la combinación de teclas Ctrl + C");
}
//cuando el usuario presiona Ctrl + V mostrar un mensaje
else if (e.KeyCode == Keys.V)
{
MessageBox.Show("Usted presionó la combinación de teclas Ctrl + V");
}

}
}


Código para abrir los dos formularios hijos.


private void form1ToolStripMenuItem_Click(object sender, EventArgs e)
{
Form1 wOpen = new Form1();
fOpenWindows(wOpen);
}

private void form2ToolStripMenuItem_Click(object sender, EventArgs e)
{
Form2 wOpen = new Form2();
fOpenWindows(wOpen);
}


La lógica nos sirve tanto en aplicaciones de escritorio y aplicaciones web. En Asp.Net tambien podemos reutilizar eventos.

Como vemos no se ha programado nada en los dos formularios hijos, logrando de esta manera reducir el código de nuestra aplicación.