viernes, 23 de septiembre de 2011

[WinForm] - Eliminar codigo html de texto

Buen Día a todos! este es un pequeño y práctico ejercicio de como eliminar por ejemplo las etiquetas <b> y </b> que vienen a ser el relleno Negrita que hace algún tiempo ayude a un usuario solicitando esto y me pareció adecuado postearlo en el blog. Como podrán observar se hace un recorrido de toda la cadena :

Codigo VB.NET :

        Dim nuevaCadena As String = ""
        Dim s as String = "<b>Programacion </b>.Net <b>Facil</b>, verdad <b>que </b>es <b>facil</b>? =)"
        Dim a As Char() = s.ToCharArray
        Dim cont As Integer = 0
 
        For i As Integer = 0 To Label1.Text.Length - 1
            If (a(i).ToString.Equals("<")) Then
                If (a(i + 1).ToString.Equals("/")) Then
                    If (a(i + 2).ToString.Equals("b")) Then
                        If (a(i + 3).ToString.Equals(">")) Then
                            cont = i + 4
                        End If
                    End If
                End If
                If (a(i + 1).ToString.Equals("b")) Then
                    If (a(i + 2).ToString.Equals(">")) Then
                        cont = i + 3
                    End If
                End If
            End If
            If (i >= cont) Then
                nuevaCadena = nuevaCadena & a(i).ToString
            End If
        Next
        MessageBox.show(nuevaCadena)

Original :
Programacion .Net Facil, verdad que es facil? =) --> <b>Programacion </b>.Net <b>Facil</b>, verdad <b>que </b>es <b>facil</b>? =)

Resultado : 
Programacion .Net Facil,verdad que es facil? =)

Espero les haya sido de utilidad. Saludos!.

[WinForm] - Ejecutar Aplicación al Iniciar Windows

Buen Día a todos! En esta oportunidad se verá cómo ejecutar una aplicación al iniciar windows mediante los registros, para comenzar debemos crear 2 botones(uno llamado btnInicio y otro btnNoInicio) y 3 variables en el formulario e indexarles los valores en el evento load del formulario, en el evento Click del boton, donde 1 es para obtener el nombre del exe que se ejecuta y el otro para obtener su ruta y luego llamar  al metodo :

Codigo c#

//Variables
string lbl = "";
string path = "";
//NombreApp será el identificador en el registro

string nombreApp = "";

//Evento load del formulario

private void Formulario_Load(object sender, EventArgs e)
{
            lbl = Path.GetFileName(System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase);
            path = Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase).Remove(0, 6) + "\\" + lbl;
            nombreApp = "MiAplicacion";
}

Ahora en el botón btnInicio realizaremos el siguiente código :

// Resgistrará en Inicio del registro la aplicación indicada
// Devuelve True si todo fue bien, False en caso contrario
// Guardar la clave en el registro
// HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
            try
            {
                RegistryKey runK = Registry.LocalMachine.OpenSubKey(@"Software\Microsoft\Windows\CurrentVersion\Run", true);
                // añadirlo al registro
                // Si el path contiene espacios se debería incluir entre comillas dobles
                if (nombreApp.StartsWith("\"") == false && nombreApp.IndexOf(" ") > -1)
                {
                    nombreApp = "\"" + nombreApp + "\"";
                }
                runK.SetValue(path, nombreApp);
                return true;
            }
            catch (Exception ex)
            {
                Console.WriteLine("ERROR al guardar en el registro.{0}Seguramente no tienes privilegios suficientes.{0}{1}{0}---xxx---{2}", '\n', ex.Message, ex.StackTrace);
                return false;
            }

Y finalmente en el boton btnNoInicio el siguiente codigo :

 // Quitará de Inicio la aplicación indicada
 // Devuelve True si todo fue bien, False en caso contrario
 // Si la aplicación no estaba en Inicio, devuelve True salvo que se produzca un error
            try
            {
                RegistryKey runK = Registry.LocalMachine.OpenSubKey(@"Software\Microsoft\Windows\CurrentVersion\Run", true);
                // quitar la clave indicada del registo
                runK.DeleteValue(path, false);
                return true;
            }
            catch (Exception ex)
            {
                Console.WriteLine("ERROR al eliminar la clave del registro.{0}Seguramente no tienes privilegios suficientes.{0}{1}{0}---xxx---{2}", '\n', ex.Message, ex.StackTrace);
                return false;
            }

Espero les haya sido útil. Saludos!.

[Infragistics] - Pintar Filas de un UltraGridView

Buen Día a Todos! en esta ocasión les enseñaremos como pintar aquellas filas según el contenido para un UltraGridView, para tal efecto pintaremos aquellas filas que tengan como contenido "Anulado". Esto se realizará en el evento InitializeRow que es el momento en que las filas se inicializan y es aquí donde daremos el pintado de nuestro objetivo :

Codigo VB.NET :

Private Sub MiUltraGrid_InitializeRow(sender As Object, e As Infragistics.Win.UltraWinGrid.InitializeRowEventArgs)
 'Si el contenido de la columna estado es igual a ANULADO
 If e.Row.Cells("ESTADO").Value.ToString().Trim() = "ANULADO" Then
  'Escojo 2 colores
  e.Row.Appearance.BackColor = Color.White
  e.Row.Appearance.BackColor2 = Color.Pink
  'Y doy el efecto degradado vertical
  e.Row.Appearance.BackGradientStyle = Infragistics.Win.GradientStyle.VerticalBump
 End If
End Sub

Codigo C# :

private void MiUltraGrid_InitializeRow(object sender, Infragistics.Win.UltraWinGrid.InitializeRowEventArgs e)
        {
            //Si el contenido de la columna estado es igual a ANULADO
            if (e.Row.Cells["ESTADO"].Value.ToString().Trim() == "ANULADO")
            {
                //Escojo 2 colores
                e.Row.Appearance.BackColor = Color.White;
                e.Row.Appearance.BackColor2 = Color.Pink;
                //Y doy el efecto degradado vertical
                e.Row.Appearance.BackGradientStyle = Infragistics.Win.GradientStyle.VerticalBump;
            }
        }

Y como resultado final se obtendría lo siguiente :


Espero les haya sido útil. Saludos!.

[Crystal Reports] - Reporte con DataSet Tipado

Para este ejemplo haremos un Reporte de Libreta de Notas de un Colegio "X", en el cual el Dataset Tipado actuará como contenedor de los datos que se mostrarán en el reporte, tambien pueden aplicar este ejemplo como exportación de datos de un gridview para los detalles como las notas.

1. Definir la estructura

Crearemos un Dataset llamado libreta.xds y aquí definiremos los datos que se mostrarán en los reportes con los Datatables creados manualmente, en el cual iran algunos campos que queremos mostrar de su tabla real de vuestra BD.

2. Creación del Reporte

Una vez terminado el esquema de los datos se procede con el reporte, para ello se agrega uno nuevo en el proyecto, en este caso con el nombre de Libreta.rpt, y se configuran los datos mediante la opciones del “Field Explorer”, agregando el origen de datos, como muestra la imagen:

Del cuadro de dialogo siguiente se selecciona el DataSet creado en el paso previo llamado libreta.xds  y pasan las 3 tablas creadas:
Por ultimo, el asistente de Crystal permitirá redefinir como se vinculan las tablas, en este caso por representar información a distinto nivel no existe una relación, pero si se desarrollara algún reporte del estilo maestro-detalles, podría existir un vinculo entre las tablas.

Una vez concluidos los pasos para configurar el esquema de datos del reporte, arrastrando los campos al reporte, podría armar un reporte similar a este:


3. Carga de los datos en el DataSet

Ahora se creara un Formulario nuevo para que allí se muestre el reporte en una nueva ventana como se muestra en la imagen y se inseta un reportviewer:





Imports CrystalDecisions.CrystalReports.Engine
Imports CrystalDecisions.Shared

Public Class Reporte

    Dim libre As New Libreta

    Public Sub New()
        InitializeComponent()
    End Sub

    Public Sub New(ByVal datos As Libreta)
        Me.New()
        libre = datos
    End Sub



    Private Sub Reporte_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim path As String = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase.ToString()).Remove(0, 6) & "\Libreta.rpt"
        Dim cryRPT As New ReportDocument
        cryRPT.Load(path)
        cryRPT.SetDataSource(libre)
        CrystalReportViewer1.ReportSource = cryRPT
        CrystalReportViewer1.Refresh()
    End Sub
End Class

En esta última parte es la codificación del llenado de datos hacia el dataset Libreta.xds que para tal efecto lo pueden hacer deste la clase del formulario nuevo que vamos a crear en 1 boton como se va a hacer ahora para no perder un poco el orden :



Imports System.Data.SqlClient
Imports System.Data

Public Class frmLibreta

    Private Sub btnMostrar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnMostrar.Click

        Dim dsLibreta As Libreta = Nothing
        Dim datos As New DataTable
        Dim datos2 As New DataTable
        Dim datos3 As New DataTable
        Dim conexion As New SqlConnection("Data Source=xxx;Initial Catalog=base;User ID=xxx;Password=xx")

        Try
            'Creamos la query
            Dim query As String = "select id_alumno,nombre,apellido from alumnos where id_alumno = 'a003'"
            'Creamos el adaptador
            Dim adaptador As New SqlDataAdapter(query, conexion)
            'Abrimos la conexion
            conexion.Open()
            'Llenamos el Datatable
            adaptador.Fill(datos)

            'Recorremos el datatable y pasamos los datos al Dataset.Se realiza
            'de esta forma para que en este paso puedan extraer datos si en caso
            'fuera desde un datagridview para que recorran y pasen los datos deseados
            dsLibreta = New Libreta
            For x As Integer = 0 To datos.Rows.Count - 1
                dsLibreta.Alumno.AddAlumnoRow(datos.Rows(x).Item(0).ToString, datos.Rows(x).Item(1).ToString, datos.Rows(x).Item(2).ToString)
            Next

            'Creamos la nueva consulta
            query = "select nroMatricula,anoCursado from matriculas where id_alumno = 'a003'"
            'Nuevo adaptador para la nueva consulta
            Dim adaptador2 As New SqlDataAdapter(query, conexion)
            'Llenamos
            adaptador2.Fill(datos2)
            'Recorremos y pasamos datos al dataset
            For x As Integer = 0 To datos2.Rows.Count - 1
                dsLibreta.Matricula.AddMatriculaRow(datos2.Rows(x).Item(0).ToString, datos2.Rows(x).Item(1).ToString)
            Next

            'Creamos la nueva consulta
            query = "select b.descripcion,a.nota1T1,a.nota2T1,a.nota3T1,a.nota1T2,a.nota2T2,a.nota3T2,a.nota1T3,a.nota2T3,a.nota3T3,a.promedioGral from calificaciones a inner join Materias b on a.id_materia = b.id_materia where a.id_alumnos = 'a003'"
            'Nuevo adaptador para la nueva consulta
            Dim adaptador3 As New SqlDataAdapter(query, conexion)
            'Llenamos
            adaptador3.Fill(datos3)
            'Recorremos y pasamos datos al dataset
            For x As Integer = 0 To datos3.Rows.Count - 1
                dsLibreta.Calificacion_Materia.AddCalificacion_MateriaRow(datos3.Rows(x).Item(0).ToString, datos3.Rows(x).Item(1).ToString, datos3.Rows(x).Item(2).ToString, datos3.Rows(x).Item(3).ToString, datos3.Rows(x).Item(4).ToString, datos3.Rows(x).Item(5).ToString, datos3.Rows(x).Item(6).ToString, datos3.Rows(x).Item(7).ToString, datos3.Rows(x).Item(8).ToString, datos3.Rows(x).Item(9).ToString, datos3.Rows(x).Item(10).ToString)
            Next

            'Cerramos conexion
            conexion.Close()

            Dim formulario As New Reporte(dsLibreta)
            formulario.Show()


        Catch ex As Exception
            MessageBox.Show(ex.Message, "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
        End Try


    End Sub
End Class

RESULTADO FINAL :


 Espero les haya sido util. Saludos!.



Recorrer TreeView con Checkbox e imprimir marcados.

Buen Día a todos! Eh visto la necesidad de publicar esto debido a la gran duda de varios usuarios de ¿Cómo recorrer un TreeView? como mínimo. Colocaré los codigos tanto en c# como en vb para facilitarles un poco la vida,para que la analizen y sigamos todos progresando por lo mas mínimo que sea =).
Bien, para comenzar debemos saber que un TreeView es una colección de nodos ordenados de manera jerárquica(Padre-Hijo), es con esta definición que nos abrirá un poco la lógica hacia codificación, veamos :

Código en VB.NET :
'Se Declara una colección de nodos apartir de tu Treeview
'del que se va a recorrer
Dim nodes As TreeNodeCollection = TuTreeView.Nodes
'Se recorren los nodos principales
For Each n As TreeNode In nodes
    'Se Declara un metodo para que recorra los hijos de los principales
    'Y los hijos de los hijos....Recorrido Total en pocas palabras
    'Para ello se envía el nodo actual para evaluar si tiene hijos
    RecorrerNodos(n)
Next

* Se Declara el método “RecorrerNodos” :
Private Sub RecorrerNodos(treeNode As TreeNode)
    Try
        'Si el nodo que recibimos tiene hijos se recorrerá
        'para luego verificar si esta o no checado
        For Each tn As TreeNode In treeNode.Nodes
            'Se Verifica si esta marcado...
            If tn.Checked = True Then
                'Si esta marcado mostramos el texto del nodo
                MessageBox.Show(tb.Text)
            End If
            'Ahora hago verificacion a los hijos del nodo actual            
            'Esta iteración no acabara hasta llegar al ultimo nodo principal
            RecorrerNodos(tn)
        Next
    Catch ex As Exception
        MessageBox.Show(ex.ToString())
    End Try
End Sub

Ahora el código en C#.NET :
*Este código se puede colocar por ejemplo en el evento Click de un boton :
//Se Declara una colección de nodos apartir de tu Treeview
//del que se va a recorrer

{
 TreeNodeCollection nodes = TuTreeView.Nodes;
 //Se recorren los nodos principales
 foreach (TreeNode n in nodes) {
  //Se Declara un metodo para que recorra los hijos de los principales
  //Y los hijos de los hijos....Recorrido Total en pocas palabras
  //Para ello se envía el nodo actual para evaluar si tiene hijos
  RecorrerNodos(n);
 }
}
* Se Declara el método “RecorrerNodos” :
private void RecorrerNodos(TreeNode treeNode)
{
 try {
  //Si el nodo que recibimos tiene hijos se recorrerá
  //para luego verificar si esta o no checado
  foreach (TreeNode tn in treeNode.Nodes) {
   //Se Verifica si esta marcado...
   if (tn.Checked == true) {
    //Si esta marcado mostramos el texto del nodo
    MessageBox.Show(tb.Text);
   }
   //Ahora hago verificacion a los hijos del nodo actual
   //Esta iteración no acabara hasta llegar al ultimo nodo principal
   RecorrerNodos(tn);
  }
 } catch (Exception ex) {
  MessageBox.Show(ex.ToString());
 }
}
Espero les haya sido de mucha utilidad, pues con este ejemplo pueden explotar un poco más su imaginación. Saludos!.