Archivo

Archivo para la Categoría "C#"

[C#] Access to the path {0} is denied. Solución

Buenas,

De regreso al blog, en esta ocasión es más enserio. Aquí hablando de un error común cuando hablamos de acceder a Carpetas o Archivos desde nuestra aplicación.

Seguramente hay muchas opciones para darle solución a esto, y la más común es simplemente ir dicha carpeta, o archivo hacer clic derecho ir a Propiedades y deshabilitar el checkbox de “Read-only”.

Pero que ocurre cuando es una aplicación de escritorio y no tenemos acceso a dicho archivo, bueno para este escenario aquí propongo una solución:

Imaginen que queremos abrir un archivo de texto, con esta instrucción

FileStream fileStream = new FileStream(rutaArchivo, FileMode.Open);

Si nuestro archivo tiene activa la propiedad de “Read-only”, entonces nos mostrará el siguiente error:

image

Para solucionar esto es necesario desactivar la propiedad de solo lectura, y eso lo hacemos con la siguiente instrucción, antes de intentar abrir el archivo en cuestión:

File.SetAttributes(rutaArchivo, 
    File.GetAttributes(rutaArchivo) & ~FileAttributes.ReadOnly);

Con esto ya podemos leer archivos, imágenes, etc. El detalle aquí que puede ocurrir es si nuestra aplicación no se ejecuta como administrador.

Espero que les sea de utilidad.

Saludos.

Categorías:C#, Errores, Tips Etiquetas: , ,

[C#] Pirámide iterativa

septiembre 7, 2009 2 comentarios

buenas,

Pues yo aquí de ocioso, y perdiendo el tiempo un rato, me encontre con un post de una piramide iterative en C++, la verdad es que hace mucho que no programo en C++, así que le di una miradita rápida al código y pense…”creo que el desarrollador de este código se complico un poco colocando unas validaciones de más”, y luego…”porque no hacer lo en C#”, (C# es mi lenguaje favorito :D ), aquí el enlace con el código en C++

http://jmonroy.wordpress.com/2009/09/03/piramide-iterativa-c/

Y aquí mi código:

namespace PiramideIterativa
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.Write("Valor Inicial: ");
            int valorInicial = int.Parse(Console.ReadLine());
            Console.Write("Tamaño: ");
            int tamaño = int.Parse(Console.ReadLine());

            for (int i = 1; i <= tamaño; i++)
            {
                Console.SetCursorPosition(25 - i, i + 1); 
                for (int j = 1; j <= (i * 2) - 1; j++)
                {                                  
                    Console.Write(valorInicial);                    

                    if (j <= (i - 1))
                    {
                        valorInicial = valorInicial * 2;
                    }
                    else if(j != (i * 2 -1))
                    {
                        valorInicial = valorInicial / 2;
                    }
                }
            }
            Console.ReadLine();
        }
    }
}

Bueno este es otro post rápido, ya me voy a comer.

Saludos

Etiquetas de Technorati: ,,
Categorías:C#, Ejemplos, Tips

[C#] El operador ++, prefijo ó sufijo?

julio 2, 2009 4 comentarios

Un post rápido, muchas veces no tomamos en cuenta las especificaciones de los compiladores que usamos, y como mucho aprendimos C# después de usar C o C++, cometemos algunos errores que podemos evitar si leemos un poco. Aquí un ejemplo común, mi compañero Ivan me dice que esto es lo mismo:

int x = 0;
int t = 0;
int y = x++;
int z = ++t;

La pregunta seria ¿los valores de “y” y “z” serán los mismos?.

La respuesta es NO, ¿Por qué?.

R: El incremento prefijo hace que el resultado sea el valor del operando después de haber sido incrementado y el postfijo hace que el resultado sea valor del operando antes de haber sido incrementado.

Entonces si mostramos los valores de “y” y “z”, tenemos que:

y = 0” y “z = 1

Ahora lo que les decía de los compiladores, que pasa si hago esto:

int x = 0;
int y = x++;

¿Cual es el valor de “x” y cual es el valor de “y”?

En base a la respuesta que mencione arriba el valor de “x = 1” y el valor de “y = 0 ”.

Por lo tanto si hago esto:

int x = 0;
x = x++;

El valor de “x = 0”;

Si no me creen pregúntenle al compilador de C#. Por tal motivo puedo concluir que debemos de leer un poco antes de hacer uso de este tipo de operadores, porque muchas veces la solución a nuestro problema puede estar justo al frente de nosotros!.

Etiquetas de Technorati: ,,
Categorías:C#, C# 4.0, Ejemplos, Tips

[Windows Form] Definir un Access Key con un Label Control

junio 2, 2009 1 Comentario

Esto nos puede ser de utilidad en partes de nuestro proyecto en el que tengamos por ejemplo: varios controles Textbox con etiquetas  que indican que valores debemos ingresar en cada Textbox (Imagínense su formulario de registro). Si definimos un Access Key en nuestras etiquetas podemos cambiar el foco al control que le indiquemos, pero veamos como hacer esto:

En un formulario Agreguemos tres controles TextBox y tres controles Label, que simulen un Formulario de registro, que tenga más o menos la siguiente apariencia:

image

Ahora la propiedad TabIndex de cada control Label deber ser un indice menor que el del control al que se va a enlazar con el Access key en este caso su correspondiente control TextBox, es decir; algo como el siguiente código:

label1.TabIndex = 0;
textBox1.TabIndex = 1;

Aunque esto lo podemos hacer desde la ventana de propiedades. Otra cosa que debemos hacer es verificar que la propiedad UseMnemonic que si es true, el primer carácter precedido por un símbolo ‘&’ se utilizará como la tecla de acceso de la etiqueta.

label1.UseMnemonic = true;

Ahora solo debemos asignarle un valor a la propiedad Text de cada etiqueta y aquí es donde le indicamos que letra se utilizará como tecla de acceso para esto solo tenemos que preceder el símbolo ‘&’ de dicha letra, por ejemplo:

label1.Text = "N&ombre";

En este caso la tecla de acceso es la letra ‘o’, lo que indica que cuando presionemos ALT + o  el el Textbox1 obtendrá el foco.

Todas estas modificaciones las podemos hacer desde la ventana de propiedades, no es necesario escribir el código para esto. Ahora si ejecutan su proyecto cada que presionen ALT + o se colocara el foco en el Textbox1  y seria lo mismo con las otras etiquetas según la letra a la que le asignemos el  key, recuerden que para que funcione las propiedades TabIndex de cada Label deben ser menor al de los Textbox’s

Para que chequen como funciona esto o por si no entendieron la explicación coloquen este código en el evento Load del Form después de agregar los controles:

label1.Text = "N&ombre";

label1.TabIndex = 0;
textBox1.TabIndex = 1;


label2.Text = "A&pellidos";
label2.TabIndex = 2;
textBox2.TabIndex = 3;


label3.Text = "M&ail";
label3.TabIndex = 4;
textBox3.TabIndex = 5;

Y ejecutamos y hagan las respectivas pruebas presionando “ALT + O”  ó “ALT + A” ó “ALT + P” y vean que es lo que pasa. Espero que les sea de utilidad.

Saludos!!

Etiquetas de Technorati: ,,
Categorías:C#, Ejemplos, Tips, Windows Form

[Windows Form] Identificando los clic’s en un Control Button

Por lo regular todo mundo cuando trabaja con Windows Form y hacemos uso de un control Button por lo regular solo usamos el Evento Click, pero en realidad podemos identificar si hacemos clic con el botón derecho del mouse, con el izquierdo o simplemente clic que es el que todos conocemos, pues bien aquí como identificar los clic’s en un control Button.

Para esto lo vamos a realizar en el evento MouseDown del Botón el cual tiene lugar cuando el puntero del mouse se encuentra sobre el componente y pulsa un botón del mouse y escribimos el siguiente Código:

private void button1_MouseDown(object sender, MouseEventArgs e)
{
    switch (e.Button)
    {
        case MouseButtons.Left:
            MessageBox.Show("Se presionó el botón isquierdo del mouse");
            break;
        case MouseButtons.Right:
            MessageBox.Show("Se presionó el botón derecho del mouse");
            break;
        case MouseButtons.Middle:
            MessageBox.Show("Se presionó el botón central del mouse");
            break;
    }
}

De esta manera podemos identificar que botón del mouse se presiono sobre nuestro control Button. Espero que les sea de ayuda.

Saludos!

Etiquetas de Technorati: ,,,,
Categorías:.NET, 70-526, C#, Ejemplos, Windows Form

[C#] Haciendo la tarea xD, string, palíndromo, invertir una cadena, etc.

junio 1, 2009 10 comentarios

Este post en respuesta aun comentario en el post de palindrome en C# – explicación. Tengo que mencionar que cualquier otro día (es decir; un fin de semana o un día que no sea lunes xD) no hubiera contestado este comentario con un post, solo hubiera dicho, amigo piénsale un poco y seguro encuentras la respuestas, pero esta vez he llegado al trabajo y como no tengo mucho que hacer aquí rápido la solución a su tarea, solo espero que su profesor no vea este post xD.

El comentario lo pueden revisar aquí:

http://mspnor.wordpress.com/2008/08/10/palindrome-en-c-explicacin/#comment-330

Y aquí la mi pequeño programa que espero que funcione y les sirva (lo pongo por partes para que se entienda):

Main:

static void Main(string[] args)
{
    //variables
    StringBuilder frase = new StringBuilder();

    //Menú
Menu:
    Menu();
    int opcion = int.Parse(Console.ReadLine());
    switch (opcion)
    {
        case 1:
            Console.Clear();
            goto Leer;                   
        case 2:
            Console.Clear();
            MostrarFrase(frase);
            Console.ReadLine();
            goto Menu;
          
        case 3:
            Console.Clear();
            MostrarTotalLetras(frase);
            Console.ReadLine();
            goto Menu;
         
        case 4:
            Console.Clear();
            FraseInvertida(frase);
            Console.ReadLine();
            goto Menu;
           
        case 5:
            Console.Clear();
            EsPalindrome(frase);
            Console.ReadLine();
            goto Menu;
          
        default:
            break;
    }



Leer:
    try
    {
        Console.WriteLine("Cantidad de Palabras que tendrá la frase?");
        int totalPalabras = int.Parse(Console.ReadLine());


    Repetir:
        Console.Clear();
        Console.WriteLine("Introduce Frase: ");


        string[] frase1 = Console.ReadLine().Split(' ');


        for (int i = 0; i < frase1.Length; i++)
        {
            if (totalPalabras == frase1.Length)
            {
                if (i == (frase1.Length - 1))
                    frase.Append(frase1[i]);
                else
                    frase.Append(frase1[i] + " ");
            }
            else if (totalPalabras < frase1.Length)
            {
                Console.Clear();
                Console.WriteLine("Te excediste en el total de palabras!");
                Console.WriteLine("Solo se aceptan {0} palabras para esta frase y escribiste {1}", totalPalabras, frase1.Length);
                Console.WriteLine("Inténtalo de nuevo..");
                Console.ReadLine();
                goto Repetir;
            }
            else
            {
                break;
            }
        }
        Console.ReadLine();
        goto Menu;
    }
    catch (Exception ex)
    {
        Console.Clear();
        Console.WriteLine("Debes seleccionar una opción, escribe un número");
        Console.ReadLine();
        goto Leer;
    }
      
}

Menú:

private static void Menu()
{
    Console.Clear();
    Console.WriteLine("");
    Console.WriteLine("1 – Ingresar una nueva frase.");
    Console.WriteLine("2 – Mostrar la frase actual.");
    Console.WriteLine("3 – Contar la cantidad de letras de la frase actual.");
    Console.WriteLine("4 – Invertir frase actual.");
    Console.WriteLine("5 – ¿Es la frase actual un palíndromo?");
    Console.WriteLine("6 – Terminar el programa.");
    Console.WriteLine("");
    Console.Write("Elige una Opción: ");
}

Mostrar Totales Letras:

private static void MostrarTotalLetras(StringBuilder frase)
        {
            Console.WriteLine("El total de letras en la frase es: {0}",frase.ToString().Length);           
        }

Frase Invertida:

private static void FraseInvertida(StringBuilder frase)
{
    Console.WriteLine("Frase Invertida: {0} ",invertir(frase.ToString()));
}

Función Invertir:

private static string invertir(string frase)  
{  
    string invertido = "";
    for (int i = frase.Length - 1; i >= 0; i--)
        invertido = invertido + frase.Substring(i, 1);  
    return invertido;  
}

Determinar si es Palíndromo la frase:

 

private static void EsPalindrome(StringBuilder frase)
{
    
    string[] palabras = frase.ToString().Split(' ');
    if(verificar(0,palabras, palabras.Length) == 1)
        Console.WriteLine("la frase es palindrome...");
    else if(verificar(0,palabras, palabras.Length) == 3)
        Console.WriteLine("Inténtalo de nuevo...");
    else
        Console.WriteLine("La frase no es palindrome...");

}

Función Verificar:

public static int verificar(int pos, string[] palabra, int largo)
{
    try
    {
        //primera condición, si la palabra en su posición 0 es igual a la ultima,
        //por ejemplo "ojo", verifica si la pos 0 ('o') es igual a la ultima (3-0-1= 2) que también es una 'o'
        if (palabra[pos] == palabra[largo - pos - 1])
        {
            //aquí solo nos indica que si las pos es menor que largo - pos entra e incrementa pos
            //cuando llega al centro de la palabra, nos indica que es un palindrome
            if (pos < largo - pos)
                return (verificar(++pos, palabra, largo));
            else
                return (1);
        }
        //si no entra al if en donde se comaparan los caracteres
        return (0);
    }
    catch (Exception ex)
    {
        Console.WriteLine("Aun no existe una frase para verificar. Primero debes ingresar una frase");
        return 3;
    }
    
}

Creo que la explicación esta de más, ademas se pueden dar una idea de que hace cada función o método si revisan el comentario del otro post.

Aquí pueden descargar el código fuente:

image

Saludos!

Nota: no hago tareas de los lectores del blog, esta ves es porque no tengo otra cosa que hacer y el asunto es relativamente sencillo.

[RSS] Generando RSS desde una Base de Datos con ASP.NET (C#)

Este es un tema ya un poco trillado, pero vamos a hacer un ejemplo de como leer datos de una tabla, y mostrarlos en una página de .aspx. Bien aquí el como hacerlo.

Primero creamos una tabla (si es que no la tenemos) sencilla que tiene el siguiente diseño:

image

Muy sencilla como pueden observar. Ya con nuestra tabla ingresamos unos cuantos datos. Luego creamos un Sitio Web desde Visual Studio con C#. Lo primero que hacemos es crear nuestra cadena de conexión en nuestro archivo Web.config con las siguiente instrucción:

<connectionStrings>
        <add name="cnx" connectionString="Data source=SQLNOR;
                    initial catalog=BD_DEMOS;
                    User id=******;
                    password=******" 
             providerName="System.Data.SqlClient"/>
    </connectionStrings>

Luego desde el código manejado creamos una función que nos regrese nuestra conexión, ya saben por estética xD, la función es el siguiente:

private SqlConnection miConexion()
   {
       return new SqlConnection(WebConfigurationManager.ConnectionStrings["cnx"].ConnectionString);
   }

Después creamos otra Función para llenar nuestro DataSet, el cual vamos a ocupar para crear el archivo XML que mostrara las RSS, la función de para llenar el DataSet tiene la siguiente estructura:

private DataSet LlenarDataSet()
   {
       SqlConnection cn = miConexion();
       SqlCommand com = new 
           SqlCommand("SELECT Titulo, Descripcion, Link, FechaAdd FROM Entradas", cn);
       cn.Open();
       SqlDataAdapter da = new SqlDataAdapter(com);
       DataSet ds = new DataSet();
       da.Fill(ds);
       com.Dispose();
       cn.Close();
       return ds;
   }

En esta parte y por la sencillez del ejemplo, me pase por alto el colocar TRY-CATCH, el utilizar Using para declarar la conexión,  y coloque directamente una instrucción T-SQL cosa que en una aplicación no se debe de hacer, pero vale que es solo un ejemplo, para que sepan como hacerlo.

Por ultimo tenemos que hacer un método que para crear la estructura del XML de nuestros RSS.

private void getCanalRSS(DataSet ds)
   {
       XmlTextWriter writer = new XmlTextWriter(Response.OutputStream, System.Text.Encoding.UTF8);
       writer.WriteStartDocument();
       writer.WriteStartElement("rss");
       writer.WriteAttributeString("version", "2.0");
       writer.WriteStartElement("channel");
       writer.WriteElementString("title", "My Content Pipeline");
       writer.WriteElementString("link", "http://mspnor.wordpress.com");
       writer.WriteElementString("description", "Ejemplo del canal de RSS de mi blog");
       writer.WriteElementString("copyright", "(c) 2008, Blog del nor xD.");

       for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
       {
           writer.WriteStartElement("item");
           writer.WriteElementString("title", ds.Tables[0].Rows[i]["Titulo"].ToString());
           writer.WriteElementString("description", ds.Tables[0].Rows[i]["Descripcion"].ToString());
           writer.WriteElementString("link", ds.Tables[0].Rows[i]["Link"].ToString());
           writer.WriteElementString("pubDate", ds.Tables[0].Rows[i]["FechaAdd"].ToString());
           writer.WriteEndElement();
       }
       writer.WriteEndElement();
       writer.WriteEndElement();
       writer.WriteEndDocument();
       writer.Flush();
       writer.Close();
   }

Bueno pues hasta aquí creo que es todo, solo resta colocar esto en el evento Load de nuestra página:

DataSet ds = LlenarDataSet();
        Response.Clear();
        Response.ContentType = "text/xml";
        getCanalRSS(ds);
        Response.End();

Después generar y por ultimo presionar F5 en nuestro teclado xD.

Antes de terminar quiero comentarles que hice la prueba con IE8, Mozilla y Chrome y el resultado fue que Chrome no reconoce los RSS, por los otros 2 todo muy bien. Creo que es todo y espero que les sea de utilidad.

Saludos!

Iralo!…ese!!..@nor

[Tip] Error de Visual Studio “Unable to write to output file”

El día de hoy me ocurrió algo extraño, actualmente estoy trabajando en un sistema para la empresa en la que trabajo y tenemos que liberar el producto en los idiomas de Ingles y Español. Bien pues la versión de Español ya esta lista y comenzando a trabajar en la de Ingles (Que si se hace un buen trabajo y organización, solo es cuestión de cambiar textos y alguna que otra parte de código en lo que a manejo de fechas se refiere), pues bien para que todo funcione bien tengo que trabajar en un ambiente en el idioma Ingles.

Lo que hice es cargar el proyecto y comencé a realizar las modificaciones necesarias y cuando genere la solución para ver que todo iba bien, pues nada que Visual Studio me dice: “Unable to write to output file” que en español seria algo así: “No se puede escribir en el fichero de salida” y en mi caso pues se trataba de la carpeta Obj dentro de la solución.

Al parecer es cuestión de Windows :S, porque copie el proyecto de Windows Vista a Windows XP

Cómo arreglamos el error:

Ir desde el Explorador de Windows hasta la carpeta en cuestión, hacemos clic derecho vemos las propiedades y verificamos que no este activo el checkbox de “Solo lectura” y listo!

La verdad es que no se que pase, porque este error en Windows Vista no aparece, pero bueno aquí este tip para que lo arreglen y puedan seguir trabajando.

Saludos!!

 

[VS – C#] Como agregar un SWF en una aplicación de C# en VS 2005 y no morir en el intento

marzo 26, 2009 2 comentarios

El día de hoy, me encontré con un problema un poco peculiar, les platico lo que hago, el error que me manda Visual Studio y como lo solucione.

Mi intención es agregar un archivo SWF en una aplicación, lo primero al crear mi proyecto es agregar el componente COM de Flash Player, que en mi caso en el visual estudio son dos. Entonces ya saben clic derecho en la Barra de herramientas->Elegir elementos y agrego los siguientes componentes:

  • Shockwave Flash Object
  • Shockwave ActiveX Control

Hasta aquí todo normal, bueno ya me aparecen en mi Barra de herramientas, hago doble clic en los dos y cual es mi sorpresa… . Visual Studio me manda el siguiente error:

image

Cosa que me pareció un tanto extraña, pero vaya mi curiosidad es grande y realice lo mismo. Barra de herramientas->Elegir elementos… y me fije en la ruta que se supone que se encontraba el Componente que es:

C:\Windows\System32\Macromed\Flash

Me dirijo a esa ubicación y me doy cuenta que es problema de que no existe la versión 9, a la que hace referencia Visual Studio, sino que se encuentra la versión 10

image

Entonces desde agregar Componentes, hago clic en Examinar.. me voy a esta ruta y agrego dicho componente

image

Y listo ya puedo trabajar con el control ActiveX para agregar un archivo SWF.

En el siguiente post, les comento trabajar con las propiedades de este control.

Etiquetas de Technorati: ,,,

Modificar los Registros de Office con C#

enero 13, 2009 13 comentarios

Hace algún tiempo  escribí como abrir un documento de Office dentro de un formulario pero para que esto funcionara tenemos que modificar los registros de Office, acabo de recibir un comentario de como hacer esto desde código C# y aquí el como hacerlo

Creamos una aplicación de Consola, y agregamos las referencia “Microsoft.Win32” y escribimos el siguiente código:

static void Main(string[] args) { try { RegistryKey miRegistro = Registry.LocalMachine.OpenSubKey(

@"SOFTWARE\\Classes\\Word.Document.8", true); //de esta manera escribimos el valor que queremos miRegistro.SetValue("BrowserFlags", 10); //con el metodo GetValue obtenemos nuestro valor que asignamos y lo mostramos en pantalla Console.WriteLine("Decimal " + "{0,10:G}: " +

"Hexadecimal{0,10:X}", miRegistro.GetValue("BrowserFlags")); } catch (Exception ex) { Console.WriteLine(ex.Message); } finally { Console.WriteLine("Esto lo leíste en http://mspnor.wordpress.com :P "); Console.ReadLine(); } }

Algunos de los métodos que trae un objeto RegistryKey son:

OpenSubKey: para abrir una clave.

GetValue: Para obtener el valor de una entrada de la clave abierta

SetValue: Para crear una entrada nueva, o modificar el valor de una entrada.

DeleteValue: Para borrar una entrada.

CreateSubKey: Para crear una clave de registro.

Además observamos que cuando mandamos a imprimir en pantalla hacemos una conversión de los valores, recuerden que podemos ingresar los valores decimales o hexadecimales.

Espero que les ayude. aunque esto de mostrar los Documentos de  Office dentro del formulario solo funciona con Word, PowerPoint y Excel. El modificar los registros trae como consecuencia que cada ves que quieran abrir un documento desde internet este se va a abrir en Internet Explorer porque lo que modificamos es el ambiente en el que se abren los objetos.

Etiquetas de Technorati: ,,,

El Futuro de C# – Conferencia

octubre 28, 2008 Deja un comentario

Si por extrañas razones ajenas a tu voluntad no pudiste asistir al PDC 2008 igual que yo :P , y quieres saber que es lo que te perdiste, gracias a channel 9 podemos ver las conferencias de lo que se va presentado día con día, y esta ves se trata de “The Future of C#” en la que Anders Hejlsberg Él es el jefe de diseño de  C # y participante clave en el desarrollo de la de Microsoft. NET Framework. Desde su lanzamiento inicial en 2000 nos habla de las nuevas características de la versión 4.0 de C#.

image

Aquí la URL para acceder a este vídeo.

http://channel9.msdn.com/pdc2008/TL16/

Etiquetas de Technorati: ,,
Categorías:C#, C# 4.0, PDC 2008

[C#]Obtener los nombres de una Enumeración (enum)

octubre 28, 2008 2 comentarios

Muchas veces, por extrañas ideas, o requerimientos de algún cliente, o que se yo, tenemos la necesidad de obtener los nombres de una enumeración, o en algunos casos cuando trabajamos con los objetos de Office, necesitamos recorrer algunas de sus enumeraciones por ejemplo la de los Dialogos, tal vez para verificar que la que un usuario selecciono se  la de ayuda, no sé, se me vienen muchas ideas a la cabeza.

Pero hagamos caso del nombre del post, vamos a ver como recorrer u obtener los nombres de una enumeración, para esto hacemos uso de un método que pertenece a la Clase Enum, que se llama GetNames(). Enum.GetNames(Método) recupera una matriz con los nombres de las constantes de una enumeración especificada.

Pues bien basta de rollos y veamos un ejemplo:

1. primero creamos una enumeración de ejemplo, más o menos así:

public enum example
        {
            uno,
            dos,
            tres,
            cuatro,
            cinco
        }

(muy ilustrativo el ejemplo, verdad? jajaja.

2. luego pues nada solo hacemos uso de Foreach y lo recorremos de la siguiente manera:

foreach(string nombres in Enum.GetNames(typeof(example)))
           {
               Console.WriteLine(nombres);
           }
           

Listo!, así de fácil. esto nos arroja como salida en una aplicación de consola lo siguiente

image

Si alguien trabaja con objetos de Word, puede hacer lo siguiente:

static void Main(string[] args)
        {   
            foreach(string nombres in Enum.GetNames(typeof(Word.WdWordDialog)))
            {
                Console.WriteLine(nombres);
            }
        }

Etiquetas de Technorati: ,,,

Solo recuerden agregar la dll, y colocar lo siguiente:

using Word = Microsoft.Office.Interop.Word;

Bueno espero que les ayude este ejemplo. Saludos!!

Categorías:C#, Ejemplos, Tips

C# 4.0 más cerca de lo que parece

octubre 28, 2008 Deja un comentario

Como muchos ya saben, en esta semana en el PDC 2008, se están mostrando las nuevas tecnologías Microsoft que están por venir, y claro que C# no se puede quedar a tras, así que uno de los padres y arquitecto Anders Hejlsber ha dado el día de ayer un platica sobre la nueva versión de C#, que por lo que puedo leer en algunos blogs, de los presentes en Los Ángeles, se muestran las características de C# 4.0.

Así que, como seguramente cuando con compañeros de trabajo, escuela o conocidos del mundo de desarrollo con .NET, platicaremos, discutiremos o rechazaremos las características de este lenguaje aquí una breve reseña de lo que esta por venir.

Programación Dinámica

C# tendrá un aseria de características dinámicas que permita esta programación dinámica, que son:

  • Objetos tipados de manera dinámica. La clave estará en una nueva palabra clave que aparece en escena: dynamic.
  • Mejorada la interoperabilidad COM.
  • Optinal and named parameters.
  • Co-and Contra-Variance

Tendremos un nuevo runtime para C# 4.0 que nos habilitará esta programación dinámica sobre la base de innovaciones ya existentes como los árboles de expresión y las expresiones lambda de C# 3.0, pero añadiendo nuevas innovaciones:

  • Dynamic trees.
  • Dynamic Dispatch invocer.
  • Call Site Caching.

Todas las características dinámicas de C# 4.0 vendrán en un nuevo ensamblado: System.Dynamic.

Para obtener más detalle, les recomiendo visiten los siguientes link’s.

C# 4.0…el futuro ya está aquí!

sección C# future de MSDN Code Gallery.

Etiquetas de Technorati: ,,
Categorías:Betas, C#, C# 4.0

Cargar archivos de Office 2007 en un Formulario de Windows en C#

septiembre 26, 2008 69 comentarios

Algunas veces, tenemos la necesidad de mostrar cierta información contenida en algunos documentos de Office y lo que por lo regular hacemos en crear un objeto de aplicación Windows y que nos abra el office, cierto?. Pero como lo dice el nombre de este post, hoy vamos a ver como mostrar dichos documentos dentro del mismo formulario, sin abrir el ambiente de office 2007.

  1. Primero creamos un aplicación de Windows con C# a la que llamaremos OfficeWindows.
  2. Agregamos un control WebBowser y colocamos su propiedad Dock en Fill.
  3. Agregamos un control OpenFileDialog y un MenuStrip en donde colocamos la instucción de Abrir Archivo de Office para explorar el archivo que vamos a abrir.

El formulario debe quedar como se muestra en la siguiente figura:

image

Ahora vamos a agregar un poco de código para que esto función, el código es el siguiente:

namespace OfficeWindows
{
    public partial class Form1 : Form
    {
        public Object oDoc;
        public string FileName;
        public Form1()
        {
            InitializeComponent();
            this.webBrowser1.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(webBrowser1_DocumentCompleted);
        }
       

        private void Form1_Load(object sender, EventArgs e)
        {
            openFileDialog1.Filter = "Documentos de Office (*.docx, *.xlsx, *.pptx)|*.docx;*.xlsx;*.pptx" ;
            openFileDialog1.FilterIndex = 1;
            
        }

        private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
        {
            oDoc = e.GetType().InvokeMember("Document", BindingFlags.GetProperty, null, e, null);
            Object oApplication = e.GetType().InvokeMember("Application", BindingFlags.GetProperty, null, oDoc, null);

        }

        private void abrirDocumentoDeOfficeToolStripMenuItem_Click(object sender, EventArgs e)
        {
            openFileDialog1.FileName = "";
            openFileDialog1.ShowDialog();
            FileName = openFileDialog1.FileName;

            if (FileName.Length != 0)
            {
                Object refmissing = System.Reflection.Missing.Value;
                oDoc = null;
                webBrowser1.Navigate(FileName);

            }

        }

       
    }
}

Este es el código que va dentro del formulario, tomando en cuenta que dejaron los nombres por default a los controles. Y el resultado es el siguiente:

image

Ahora solo si quieren manipular los eventos que se hagan dentro del office, tendrán que crear un objeto de Word, Excel, etc. para manejarlos, espero que les sea de utilidad y nos escribimos en otro post.

Etiquetas de Technorati: ,

Categorías:C#, office, Office 2007

palindrome en C# – explicación

agosto 10, 2008 19 comentarios

hace ya casi más de un año que en mi spaces, escribí un ejemplo de como identificar un palíndromo, y hace un rato me preguntaron sobre su funcionamiento, y creo que no lo explique bien, así que en este post explicare línea por línea para que se entienda mejor, así que aquí vamos…

 

using System;
using System.Collections.Generic;
using System.Text;

namespace palindrome
{
    class Program
    {
        //variables para derterminar si la palabra es palindrome o no
        //son constantes, porque la funcion verificar es de tipo entero
        // y retornara un 0 o 1 respectivamente.
        const int palindrome = 1;
        const int nopalindrome = 0;

        static void Main(string[] args)
        {
            //este es un arreglo de tipo char, que contendra la letra a introducir
            char[] carateres;

            //pedimos al usuario que introduzca una palabra
            Console.WriteLine("Ingrese una palabra: ");
            //asignamos lo que teclea el usuario a la variable "s"
            string s = Console.ReadLine();
            //instanceamos la var "caracteres" indicando el tamaño de el arreglo
            //que en este caso es el tamaño de la palabra introducida.
            carateres = new char[s.Length];
            //saber cuantos caracteres tienes nuestra cadena
            //esto lo hacemos copiando los caracteres de una subcadena especificada
            //esto lo hace el metodo ToCharArray
            carateres = s.ToCharArray(0, s.Length);
            //Console.WriteLine(s.Length);
            //comparamos si lo que nos regresa la función es un 1
            //si es así la palabra es palindrome, sino pues no lo es
            if (verificar(0, carateres, s.Length) == palindrome)
                Console.WriteLine("la palabra es palindrome...");
            else
                Console.WriteLine("La palabra no es palindrome...");

        }

        //aquí es donde comparamos las letras de inicio a fin
        static int verificar(int pos, char[] palabra, int largo)
        {
            //primera condición, si la palabra en su posición 0 es igual a la ultima, 
            //por ejemplo "ojo", verifica si la pos 0 ('o') es igual a la ultima (3-0-1= 2) que también es una 'o'
            if (palabra[pos] == palabra[largo - pos - 1])
            {
                //aquí solo nos indica que si las pos es menor que largo - pos entra e incrementa pos
                //cuando llega al centro de la palabra, nos indica que es un palindrome
                if (pos < largo - pos)
                    return (verificar(++pos, palabra, largo));
                else
                    return (palindrome);
            }
            //si no entra al if en donde se comaparan los caracteres
            return (nopalindrome);
        }
    }
} 

espero q se entienda y les sea de utilidad, la verdad es que ya no me acordaba :P , pero ya que lo vi de nuevo y compilé, es así como funciona.

Saludos!

Categorías:C#

[WPF] Imágenes en 3D con Visual Studio 2008 y Expression Blend 2

junio 20, 2008 8 comentarios

En este pequeño tutorial aprenderemos como manipular las imágenes en 3D, para esto vamos a utilizar tanto Visual Studio 2008 y Expression Blend 2, así que vamos a iniciar. Lo primero que hacemos es crear un nuevo proyecto en VS 2008, de tipo WPF Aplication  con el nombre de Imagen3D, como se ve en la figura:

El segundo paso es crear una carpeta llamada Imágenes en donde colocaremos las imágenes a mostrar, para esto en el Explorador de soluciones, seleccionamos nuestro proyecto y damos clic-derecho->Add->New Folder, esto como se ve en la imágenes:

Dentro de esta carpeta colocaremos nuestras imágenes, es recomendable que renombremos  las mismas con nombres desde el 1has el numero de imágenes que queramos, para agregar los archivos a la carpeta, tenemos que dar clic-derecho en la carpeta->Add->Existing Item… y buscamos los archivos.

Para poder poder observar los archivos a agregar es necesario seleccionar que el tipo de archivos que queremos ver son imágenes, como se ve en la imagen:

Como les comente, es recomendable que el nombre de nuestras imágenes sea sencillo como un número, esto por comodidad, ya que utilizaremos este nombre dentro del código y de esta manera será más fácil, aunque sino lo cambian no hay problema, solo recuerden el nombre de sus imágenes, ok

ya que tenemos agregados nuestros archivos dentro de la carpeta Imagenes, ahora toca agregar una clase a nuestro proyecto, para esto al igual que la carpeta damos clic derecho en el nombre de nuestro proyecto->Add->Class y VS2008 automáticamente nos arranca con la clase, a esta clase la llamaremos CrearImagen y el primer paso en esta clase es agregar los namespaces necesario que son:

using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

El primer paso en esta clase, es crear una instancia de la clase Image que se llama _miDatoActual y especificando que la clase es pública.

class CrearImagen { private static Image _miDatoActual = new Image(); }

Después creamos una variable pública de tipo Image y crear un getter que devuelva el valor de _miDatoActual

public static Image misImagenes { get { return _miDatoActual; } }

Luego Creamos una clase llamada Imagenes dentro de la casle CrearImagen

public class Imagenes : ObservableCollection<ImageData> { }

En este momento Visual Studio no sabe lo que un ObservableCollection, así que para que VS lo se entere, lo seleccionamos y damos clic-derecho->Resolve->System.Collections.ObjectModel

Creamos el constructor de la clase Images y declaramos la ruta de acceso de nuestras imágenes.

public class Images : ObservableCollection<ImageData>
{
public Images()
{
this.Add(new ImageData(@”Imagenes\1.jpg”));
this.Add(new ImageData(@”Imagenes\2.jpg”));
this.Add(new ImageData(@”Imagenes\3.jpg”));
this.Add(new ImageData(@”Imagenes\4.jpg”));
this.Add(new ImageData(@”Imagenes\5.jpg”)); } }

Creamos la clase de ImageData después de la clase de Imagenes y hacerla del tipo INotifyPropertyChanged. Esta clase se activará para cada imagen agregamos. También tendrá que tener esta clase de utilizar tal el System.ComponentModel como lo hicimos con la clase Imagenes y creamos una cadena privada que se llama _sNombreImagen.

public class ImageData : INotifyPropertyChanged { private string _sNombreImagen = “”; }

Crear el constructor de ImageData y pasar en sImagenName, que es la ruta de acceso
pasado de la clase Images. Creamos una variable llamada NombreImagen y le asignamos sImagenName la cual será pública y de tipo String. Por último creamos los getters y serters necesarios para establecer y definir el nombre de la imagen y la ruta en la que se encuentra con ayuda de un evento llamado NotifyPropertyChanged que definiremos más adelante, entonces el código de esta clase queda así:

public class ImageData : INotifyPropertyChanged
{
private string _sNombreImagen = “”;
public ImageData(string sNombreImagen)
{
NombreImagen = sNombreImagen;
}
public string NombreImagen
{
get { return _sNombreImagen; }
set { _sNombreImagen = value;
NotifyPropertyChanged(NombreImagen); } } }

Agregar el método PropertyChangedEventHandler y NotifyPropertyChanged dentro de la misma clase de ImageData

public event PropertyChangedEventHandler PropertyChanged;
protected void NotifyPropertyChanged(String sProp)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(sProp)); } }

Hasta este punto dejamos nuestra aplicación por el lado del código, regresaremos casi al final, ahora construimos nuestra solución presionando F6 y abrimos nuestro proyecto con Expression Blend 2. Todo esto sin cerrar VS 2008.

Lo primero es modificar el alto y ancho de nuestra ventana, que queda con 600 en Height y 800 en Width. Ahora con el objeto del Grid seleccionado en Objects and TimeLine en el panel de propiedades vamos a cambiar el Backgroung a GradientBrush. Así mismo cambiamos el color del Grid para tener una mejor apariencia como se ve en las figura.


Para obtener este color tenemos tres colores, azul, blanco y azul

Después creamos nuestro DataSource, para esto nos vamos al tag de Project y damos clic en +CTR Object. y en Add CLR Object Data Source seleccionamos CrearImagen

11

Automáticamente Expression Blend 2 nos crea dicho DataSource y lo podemos observar dentro del código XAML, dando clic en Split para ver el diseño y el código

<Window.Resources>
<ObjectDataProvider x:Key=”CrearImagenDS” ObjectType=”{x:Type Imagen3D:CrearImagen}” d:IsDataSource=”True”/>
</Window.Resources>

A continuación tenemos que agregar los controles que nos van a permitir seleccionar una imagen y visualizarla, con el Grid seleccionado buscamos un ComoBox que llamaremos miCB y un rectangulo que llamaremos ImagenPlana y los colocamos de las siguiente manera.


Si presionamos en este momento F5 nos podemos dar cuenta que nuestra aplicación aun es muy sencilla, pero veamos cómo ponerla un poco más interesante.

Guardamos nuestro proyecto en Expression Blend 2 y ahora trabajamos de nuevo con VS2008 en donde abrimos el archivo de Window1.xaml y en los Recursos creamos un DataTemplate que llamaremos ImagenDT que indicara al ComoBox que contenido mostrar, que en nuestro caso es la Imagen y el Textblock, la definición de DataTemplate es así:

<Window.Resources>
<DataTemplate x:Key=”ImagenDT”>
<StackPanel Orientation=”Horizontal”>
<Image Source=”{Binding Path=NombreImagen}” Height=”50″ Width=”50″/>
<TextBlock Text=”{Binding Path=NombreImagen}”/>
</StackPanel>
</DataTemplate> <ObjectDataProvider x:Key=”CrearImagenDS” ObjectType=”{x:Type Imagen3D:CrearImagen}” d:IsDataSource=”True”/>
</Window.Resources>

Dentro del código XAML localizamos el ComboBox y en la propiedad de ItemSource le indicamos que use misImagenes que se encuentra den CrearImagenDS, al igual le indicamos que use el DataTemplate que acabamos de crear, entones el código del miCB queda así:

<ComboBox HorizontalAlignment=”Left” Margin=”21.167,22,0,0″ VerticalAlignment=”Top” Width=”261.111″ Height=”51.389″ IsSynchronizedWithCurrentItem=”True” x:Name=”miCB” ItemsSource=”{Binding Path=misImagenes, Source={StaticResource CrearImagenDS}}” ItemTemplate=”{StaticResource ImagenDT}”>
<ComboBox.Background>
<LinearGradientBrush EndPoint=”0,1″ StartPoint=”0,0″>
<GradientStop Color=”#FF9DB6DA” Offset=”0″/>
<GradientStop Color=”#FF1F66CB” Offset=”0.996″/>
</LinearGradientBrush>
</ComboBox.Background>
</ComboBox>

Ahora si todo va bien, y ejecutamos nuestro proyecto nos aparece en el ComoboBox las fotos que tenemos en nuestra carpeta, y la aplicación se ve más o menos así:


Después de esto, tenemos que indicar que la imagen que seleccionemos se muestre dentro de nuestro rectángulo, y lo que tenemos que hacer es localizar nuestro rectángulo ImagenPlanta dentro del XAML y lo modificamos de manera que eliminamos el Fill y le indicamos que lo rellene con lo que seleccionamos.

<Rectangle Stroke=”#FF000000″ Margin=”229.055,108.499,110.611,84.667″ x:Name=”ImagenPlana”> <Rectangle.Fill>
<ImageBrush ImageSource=”{Binding Path=SelectedItem.NombreImagen, ElementName=miCB}”/>
</Rectangle.Fill>

</Rectangle>Ahora sí, si ejecutamos nuestro proyecto, podemos observar que la imagen que seleccionemos en él Como es la imagen que se muestra en el rectángulo, y se ve más o menos así:

Muy bien, ahora hagamos esto un poco más interesante, y pongamos varias opciones para que nos muestren las imágenes, entonces agregamos 3 radio butons del lado izq del rectángulo, con estas características:

<RadioButton HorizontalAlignment=”Left” Margin=”21.167,178,0,0″ VerticalAlignment=”Top” Width=”163.833″ Height=”33″ Content=”Imagen Plana (2D)” x:Name=”Imagen2DRB” IsChecked=”True”/>

<RadioButton HorizontalAlignment=”Left” Margin=”21.167,240,0,0″ VerticalAlignment=”Top” Width=”163.833″ Height=”29″ Content=”Imagen 3D” x:Name=”Imagen3DRB” IsChecked=”False”/>

<RadioButton HorizontalAlignment=”Left” Margin=”21.167,0,0,233″ VerticalAlignment=”Bottom” Width=”163.833″ Height=”38″ Content=”Animación 3D” x:Name=”Animacion3DRB” IsChecked=”False”/>

Ahora para trabajar con la segunda opción de la imagen en 3D, seleccionamos el rectángulo ImagenPlana y en el panel de Apariencia en la propiedad Visibility seleccionamos Collapsed para poder trabajar con otra imagen.

En Expreesion Blend 2 vamos al tag de Proyecto y en la carpeta de Imágenes, seleccionamos una y la arrastramos al Grid, con la imagen seleccionada damos clic en Tools -> Make Image 3D, por último deshabilitamos la opción de ClipToBounds en el panel de Apariencia.

Ya teniendo esto, seleccionamos el Viewport3D y damos doble clic sobre la imagen, para poder manipularla y la colocan en la posición que quieran, pueden rotarla en cualquiera de los 3 ejes (x,y,z), por ejemplo así:

Recuerden colocarle nombre a este Viewport3D, en mi caso lo llame Imagen3D. Dentro del código XAML buscamos el Viewport3D y modificamos su propiedad de diffusematerial como el siguiente código:

<DiffuseMaterial>
<DiffuseMaterial.Brush>
<ImageBrush ImageSource=”{Binding Path=SelectedItem.NombreImagen, ElementName=miCB}” Stretch=”Fill”/> </DiffuseMaterial.Brush>
</DiffuseMaterial>

También seleccionamos el Viewport3D llamado Imagen3D y en su propiedad visibility indicamos Collapsed, para trabajar con la última parte que será un Viewport3D con el nombre de cubo, y como es una explicación larga por el momento solo agregaremos el código, que se encuentra en un txt que podrán descargar desde aquí, este lo pegaran debajo del Viewport3D llamado Imagen3D, podemos observar cómo nos muestra un cubo, que es con el que trabajaremos una sencilla animación. Así que el código lo pegan aquí:

</Grid> en el proyeccto
<!–pegar aquí–>
</Grid>
</Window>

y podemos observar que si nos muestra una especie de cubo.


Ahora seleccionamos el Viewport3D llamado Animacion3D y cambiamos su propiedad de Visibility a Collapsed, por otro lado seleccionamos el Rectángulo llamado ImagenPlana al cual indicaremos su propiedad de Visibility en Visible. Ejecutamos nuestro proyecto presionando F5.

Pues bien hasta aquí, parece que todo va bien, ahora tenemos que darle funcionalidad a los Radio Buttons, para esto vamos a VS2008 y abrimos el archivo Window1.xaml.cs en donde agregaremos funcionalidad a cada uno de los eventos click de los botones, en donde solo indicaremos que se va a mostrar y que en cada uno de ellos, el código es el siguiente:

public partial class Window1 : Window
{
public Window1()
{
InitializeComponent(); Imagen2DRB.Click += new RoutedEventHandler(Imagen2DRB_Click);
Imagen3DRB.Click += new RoutedEventHandler(Imagen3DRB_Click); Animacion3DRB.Click += new RoutedEventHandler(Animacion3DRB_Click);
}

void Animacion3DRB_Click(object sender, RoutedEventArgs e)
{
Animacion3D.Visibility = Visibility.Visible;
ImagenPlana.Visibility = Visibility.Collapsed;
Imagen3D.Visibility = Visibility.Collapsed;
}

void Imagen3DRB_Click(object sender, RoutedEventArgs e)
{
Animacion3D.Visibility = Visibility.Collapsed;
ImagenPlana.Visibility = Visibility.Collapsed; Imagen3D.Visibility = Visibility.Visible;
}

void Imagen2DRB_Click(objectsender, RoutedEventArgs e)
{
Animacion3D.Visibility = Visibility.Collapsed;
ImagenPlana.Visibility = Visibility.Visible;
Imagen3D.Visibility = Visibility.Collapsed;
}
}

Si ejecutamos nuestro proyecto de nuevo presionando F5, podemos observar que ya funcionan nuestros radio Buttons, ahora solo resta hacer la animación de nuestro cubo, lo primero es poner como Visible nuestro cubo, luego damos clic en +Event y en +StoryBoard, a este último lo llamaremos AnimacionCubo, como se ve en las siguientes figuras:

Ahora pongan atención, seleccionamos la línea en el segundo 0, vamos a manipular sus propiedades de transformación cada 2 segundos, tanto de la posición en X, Y y del ángulo

Los valores completos son los siguientes:

Segundo 0 X=90, Y=0, Angle=-40
Segundo 2 X=-90, Y=0, Angle= 40
Segundo 4 X=0, Y=45, Angle=-180
Segundo 6 X=0, Y=0, Angle=0

Ya para terminar, solo falta indicarle que esto lo haga todo el tiempo, para esto solo seleccionamos el AnimacionCubo y en la propiedad RepeatBehavior asignamos Forever, cerramos el StoryBoard llamado AnimacionCubo y listo, tenemos nuestro proyecto listo, ahora podemos observar cómo es que funciona. (Recuerden poner el último viewport3D en Collapsed y el Rectángulo en Visible). Espero que les sea de utilidad este pequeño tutoría. Como producto final tenemos algo como esto:

Puedes descargar el código aquí

[XNA] Listo para la descarga CTP de XNA Game Studio 3.0

junio 19, 2008 Deja un comentario

Hace unos días se lanzo esta CTP de XNA Game Studio que la principal característica es dar el soporte al desarrollo de video juegos para la familia de dispositivos Zune. Esta característica nos da el acceso a la mayoría de de las funciones del API de XNA.

  cco_xna_ctp3_0_banner

Algo interesante de esta versión, es que requiere de la instalación de Visual Studio 2008 en cualquiera de sus versiones, obviamente con el soporte para Visual C# qué es el lenguaje con el que se desarrolla. Pueden practicar con Visual C# 2008 Express Edition.

Existen cosas importantes que debemos considerar para trabajar con esta CTP, que son las siguientes:

  • Visual Studio 2008 Standar Edition o superior (con soporte para el lenguaje C#) o C# Visual 2008 Express son necesarios para instalar y ejecutar la CTP de XNA Game Studio 3.0.
  • No es necesario desinstalar Visual Studio 2005 o XNA Game Studio 2.0, ya que estos productos pueden funcionar a la par con Visual Studio 2008 y XNA Game Studio 3.0.
  • Esta versión CTP de XNA Game Studio no permite el desarrollo de juegos para Xbox 360, solo es compatible para Windows y Zune. Si quieren desarrollar e implementar Juegos para su Xbox 360, se debe continuar usando la versión 2.0 de XNA Game Studio por el momento.
  • Esta CTP no funciona aún en sistemas de 64 bits, este soporte se le dará en la versión RTM.

Pues bien si quieren hacer pruebas y revisar que trae de nuevo esta versión, está disponible  a través del sitio de XNA Creators Club (http://creators.xna.com), en donde encontrarán toda la información.

Descarga: http://www.microsoft.com/downloads/details.aspx?FamilyId=DF4AF56A-58A7-474C-BFD0-7CF8ED3036A3&displaylang=en

Aprende XNA Games Studio 2.0

febrero 13, 2008 Deja un comentario

si crees que sabes lo necesario sobre este producto en su primera versión que solo funciona con la versión Express del Visual Studio y querías saber algo más, te invito a que revises  estos capítulos de un nuevo libro sobre esta nueva versión.

                                   Cover

Aquí el link de la descarga de estos capítulos: Descarga algunos capitulos

Categorías:C#, XNA

Acceso conectado a una BD en C#

febrero 12, 2008 30 comentarios

Hace ya varios días que me preguntaron de esto, de hecho ayer un amigo de la escuela y como en los cursos de ADO.NET que tome en mis vacaciones lo recordé, pues ak un pequeño resumen de cómo hacerlo.

La parte más importante o más pesada cuando realizamos un acceso a una base de datos nos la encontramos cuando hacemos la conexión a nuestra base de datos, sin embargo creo que esta tarea es simple siempre y cuando la hagamos de manera correcta, quizá diga que es pesada ya que es la que más recursos del sistema del sistema consume, pero para hacerlo bien debemos tomar en cuenta ciertas cosas:

  • La conexión debe realizarse, siempre que esté dentro de lo posible con los proveedores de acceso nativos, esto porque son más rápidos.
  • La conexión debe de abrirse lo más tarde posible, y de ser posible definir todas las variables que podamos antes de realizar la conexión.
  • La conexión debe cerrarse lo antes posible, siempre y cuando no tengamos la necesidad de usarla posteriormente.

Estas recomendaciones no son exactamente normas de acceso a datos, pero digamos que si las importantes en cuanto al acceso se refiere ya que depende de lo que queramos hacer para tomar una decisión y aplicar una u otra de estas recomendaciones.

En aquellas ocasiones en que sea necesario estar trabajando con la aplicación en estado conectado a la base de datos, lo que vamos a usar en un DataReader.

¿Qué hace un DataReader?

El objeto DataReader recupera un conjunto de valores llenando un pequeño búfer de datos. Si los objetos que hay en el búfer se acaban, el objeto DataReader regresará a la base de datos para recuperar más registros, por lo tanto su el servicio de SQL Server esta detenido o el de alguno de nuestros orígenes de datos esto provocaría un error.

Pero basta de rollos vamos a ver un ejemplo, pero antes necesitamos una base de datos, si tiene una perfecto, sino aquí un post de cómo crear una base de datos con SQL Server, ya que tenemos nuestra base ahora hacemos lo siguiente:

Creamos una aplicación para Windows a la que llamaremos AccesoConectado, como se ve en la figura:

        AccesoConectado1

Dentro ya de nuestro formulario, vamos a trabajar con un DataGridView para mostrar nuestros datos y un botón para mostrarlos, entonces nuestro formulario quedaría así:

                   AccesoConectado2

Ahora vamos agregar un origen de datos a nuestro proyecto para ello damos clic en la pestaña Datos->Agregar nuevo origen de datos lo que hacemos ak es solo utilizar el asistente, así como guardar nuestra cadena de conexión que es la que utilizaremos.

Ya con la base en el proyecto, ahora trabajaremos con ella desde código :-) , y es aquí en donde iniciamos con el método LeerBaseDeDatos y el código es el siguiente:

public void leerBaseDeDatos()
        {
            //abrimos la base de datos

            string cadenConexion = "Data Source=.\\SQLEXPRESS;AttachDbFilename='C:\\Users\\nor\\Desktop\\Curso UNAM\\AccesoConectado\\AccesoConectado\\NORTHWND.MDF';" +
                "Integrated Security=True;User Instance=True";
            
            conexionBD = new SqlConnection(cadenConexion);
            conexionBD.Open();

            //creamos una consulta
            string Consulta = "SELECT LastName, FirstName FROM Employees";
            Orden = new SqlCommand(Consulta, conexionBD);

            //ExecuteReader Hacela consulta y devuelve un SqlDataAdapter
            Lector = Orden.ExecuteReader();
            
            //llamamos siempre al método Read antes de aacedera los datos
            if (Lector.Read())
            {
                //asignamos al gridview
                miData = new DataTable();
                miData.Load(Lector);
                dataGridView1.DataSource = miData;
                       
                
            }
            //llamamos siempre al close  una vez finalizada la lectura
            Lector.Close();
        }

Como se pueden dar cuenta, en este método hacemos la conexión a nuestra base, realizamos una consulta sencilla, aplicamos el ExecuteReader que nos devuelve un SqlAdapter, llenamos un data table y lo asignamos a nuestro GridView.

Ahora solo un método más para cerrar nuestro lector y nuestra conexión esto una vez que ya no usamos nuestra base de datos. El método se llama CerrarConexion y el código es este:

public void CerrarConexion()
        {
            //cerramos nuestrs conexion cuando ya no le necesitemos
            if (Lector != null)
                Lector.Close();
            if (conexionBD != null)
                conexionBD.Close();
        }

por último dentro de nuestro evento clic de nuestro botón mandamos llamar estos métodos, aplicando el control de excepciones, y esto queda así:

public void CerrarConexion()
        {
            //cerramos nuestrs conexion cuando ya no le necesitemos
            if (Lector != null)
                Lector.Close();
            if (conexionBD != null)
                conexionBD.Close();
        }

Ahora solo resta crear una solución del proyecto, si todo va bien como parece, ejecutamos y el resultado al dar clic en el botón es algo como lo que se ve en la siguiente figura:

                     Dibujo1

Con esto tenemos ya un acceso de datos y con el DataReader podemos manipular de la misma manera manipular los datos, pero esto lo veremos en otro ejemplo. Aquí el archivo con el código completo.

Acceso  Conectado a una Base de Datos

Saludos!! :-)

Categorías:ADO.NET, C#

Reflector, todo lo que siempre quisiste

diciembre 26, 2007 3 comentarios

Así es en algún lugar de la web me encontré con esta pequeña aplicación, que es muy poderosa, en este pequeño articulo descubriremos que es reflector y para que nos sirve.

primero entendamos lo que hace, o cómo funciona el CLR, antes debe quedar entendido que cuando nosotros presionamos F6 (construimos la solución de nuestra aplicación), lo que creamos es un *.exe o un *.dll, que en si es un código MSIL (Microsoft Intermediate Language), pero como sabemos este es el código que resulta de cada uno de los compiladores del lenguaje de .NET, (csc para C#, por ejemplo), lo que hace el CLR es compilar de nuevo este resultado, y ahí si es en donde es llevado a lenguaje máquina.

Aquí es a lo que harry le llama programación mezclada, un por raro el nombre, pero a lo que se refiere el buen amigo José David, es que es la parte en donde se desarrolla la magia de  .NET que nos permite programar algunos módulos en VB.NET y hacer uso de ellos en una aplicación de C#, de verdad, si no me creen, aquí un ejemplo y luego el uso de Reflector.

Primero creamos un proyecto de VB.NET que sea de tipo librería de clases, que llamaremos Películas (que será una demo de LINQ, todo esto con Visual Studio 2008).

Luego ya en el código, lo primero es importar los nombres de espacio que nos permite trabajar con LINQ y con Listas:

Imports System.Linq
Imports System.Collections.Generic

luego escribimos una clase llamada pelicula con las siguientes propiedades:

Public Class pelicula
        Public Titulo As String
        Public Genero As String
        Public Duracio As Double
        Public Musica As String
    End Class

después de esto agregamos un método que se llama PeliculasTerror, que recibe una variable de tipo string llamada genero, en la que agregamos a una lista de llamada ListaTerror tres películas dos de terror y una para niños, además realizamos una consulta (con ayuda de LINQ), en donde la filtramos por genero, luego mandamos a pantalla el resultado, el código sería el siguiente:

Public Sub PeliculasTerror(ByVal genero As String)
        Dim ListaTerror As New List(Of pelicula)
        Dim peli1 As New pelicula()
        peli1.Titulo = “Alvin y las Ardillas”
        peli1.Genero = “Comedia/Familiar”
        peli1.Duracio = 93
        peli1.Musica = “Cristopher Lennertz”
        ListaTerror.Add(peli1)

        Dim peli2 As New pelicula
        peli2.Titulo = “Gritos de la oscuridad”
        peli2.Genero = “Horror/Thriller”
        peli2.Duracio = 84
        peli2.Musica = “Shirley Walker”
        ListaTerror.Add(peli2)

        Dim peli3 As New pelicula
        peli3.Titulo = “El arte del Pánico”
        peli3.Genero = “Horror/Thriller”
        peli3.Duracio = 98
        peli3.Musica = “Tomandandy”
        ListaTerror.Add(peli3)

Dim peliculaTerro = From terror In ListaTerror Where terror.Genero Like genero Select terror

Console.WriteLine(“Las peliculas del genero {0} son: “, genero)
        For Each terror In peliculaTerro
            Console.WriteLine(“{0}”, terror.Titulo)

        Next

    End Sub

Por último generamos y ya que no hay errores, terminamos con esta parte, ahora para mostrar que realmente es verdad lo que les digo, creamos un proyecto de tipo consola con C# y agregamos la referencia de  Peliculas.dll, que acabamos de crear y creamos una instancia de la referencia y pedimos que el usuario introduzca el género, el código seria como este:

static void Main(string[] args)
        {
            Peliculas.Peliculas peliculaTerror = new Peliculas.Peliculas();
            Console.WriteLine(“Introduce genero: “);
            string genero = Console.ReadLine();
            peliculaTerror.PeliculasTerror(genero);
            Console.ReadLine();
        }

ejecutamos y el resultado seria este:

clip_image002[4]

Como se pueden dar cuenta si es posible, ahora veamos cómo es que funciona Reflector, pero entes de eso veamos, que es. MSIL y como se ve, para ello lo encontramos en la ruta: C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\Bin, aquí lo encontramos abrimos la dll de películas que hicimos en VB.NET que se muestro mas o menos así:

clip_image003[4]

 

 

 

 

 

 

Si damos doble clic en alguno de los métodos o clases, nos muestra el ya famoso código MSIL, por ejemplo demos doble clic en el de PeliculasTerror y veamos que se nos muestra algo así:

clip_image004[4]

Como se pueden dar cuenta este código no es muy entendible pero si = que el que hicimos con C#, para que vean hagan lo mismo, abran de nuevo otro MSIL y abran la aplicación de C#, y den doble clic en void Main, observen que es del mismo tipo:

clip_image005[4]

Insisto aun así no es muy entendible el código así que es aquí en donde entra esta herramienta tan genial, que es Reflector, para eso primero la descargamos de aquí: http://www.aisto.com/roeder/dotnet/Download.aspx?File=Reflector,

Ahora que hace esta herramienta,lo que hace es desensamblar el código MSIL y llevarlo a código .NET, de nuevo no me creen?, mta, pues chequemos el ejemplo jeje.

Veamos, primero al abrir Reflector nos muestra la opción de elegir entre la versión del Framework que queremos usar (ya soporta la ultima versión 3.5 y claro LINQ, por eso la demo si funciona jeje). nos muestra esta opción:

                   clip_image006[4]

Y para que vean que si funciona y muy bien, abrimos la .dll de películas que hicimos en VB.NET en Visual Studio 2008 y este es el resultado:

clip_image007[4]

En la figura se observa claramente las variables que declaramos en esta clase, y además el constructor que .NET nos genera por Default, ven que si es muy interesante esta Herramienta, podemos hacer todo esto con nuestros proyectos, y además podemos elegir el lenguaje en el que nos lo desensambla a .NET. Los lenguajes soportados actualmente son: C#, Visual Basic, Delphi, MC++, Chrome, y el mismo IL. Y también da la posibilidad de elegir la versión de .Net Framework sobre la cual va a mostrar las librerías del mismo .Net Framework. La navegación entre clases también es bastante buena.

No esperen más seguro cuando la comiencen a usar, formara parte de sus herramientas de cabecera.

Saludos desde Toluca de parte de su amigo Norberto, y Feliz año nuevo

Categorías:.NET, C#, LINQ, VB.NET
Seguir

Get every new post delivered to your Inbox.