Archivo

Archive for the ‘Ejemplos’ Category

[Sharepoint 2010] Custom Actions en Sharepoint 2010 dese Visual Studio

enero 3, 2011 2 comentarios

Buenas,

El escenario es el siguiente, necesito colocar un Grupo de acciones dentro de la página de Configuración del Sitio, para dar mantenimiento a unas listas. (limpiar en mi caso). Esto lo podemos hacer, desde la Interface de usuario, pero aquí el objetivo es hacerlo desde nuestra aplicación de SharePoint para que solo despleguemos y esta haga todo el trabajo, además es practico, entre menos configuremos manualmente nuestra aplicación mejor.

Una vez platicado que quiero hacer, les platico como hacerlo:

1.- Tener un Feature.

  • Cuando creamos un proyecto de SharePoint 2010 desde Visual Studio 2010, por default agrega un Feature con el que podemos trabajar, le podemos agregar nombre, descripción etc. Cómo hacemos esto: Abrir Visual Studio, Crear Nuevo Proyecto-> SharePoint 2010->Empty SharePoint Project.

image

2.- Ahora agregamos un ElementManifest a nuestro feature, en el archivo Feature1.Template.xml

image

El XML queda más o menos así:

<Feature xmlns="http://schemas.microsoft.com/sharepoint/" 
        ActivateOnDefault="FALSE"
        AlwaysForceInstall="FALSE"
        AutoActivateInCentralAdmin="FALSE" Hidden="FALSE" Scope="Web"
        Description="Permite Limpiar las Listas"
        Title="Limpiar Listas 11">
    <ElementManifests>
      <ElementManifest Location="Listassss\Elements.xml" />
    </ElementManifests>
</Feature>

 

La parte de Location se refiere al XML que contiene la definición de nuestro Grupo de Acciones, y como lo agregamos de la siguiente manera, clic derecho en nuestra solución->Add->New Item…, y seleccionamos Empty Element, con el nombre que mejor les guste: mis caso Listassss

image

3.- Aquí viene la definición de nuestro Grupo de Acciones, y las acciones mismas. En mi caso solo un link que apunta a mi blog, pero podemos agregar un query string para poder manipular datos de nuestras listas den el evento Load de alguna ASPX que tengamos. El XML se ve así:

<?xml version="1.0" encoding="utf-8"?>
<Elements xmlns="http://schemas.microsoft.com/sharepoint/">
  <CustomActionGroup Description="Revisar el Blog del desarrollador" 
                     Id="BlogDelNor" ImageUrl="/_layouts/images/medios/agregar.png"
                      Location="Microsoft.SharePoint.SiteSettings" Sequence="10000" Title="My ContentPipeline">
  </CustomActionGroup>
  <CustomAction GroupId="BlogDelNor" Id="CustomFeatureLink"  Location="Microsoft.SharePoint.SiteSettings"
                Sequence="10001"
                Title="My Content Pipeline">
    <UrlAction Url="https://mspnor.wordpress.com" />
  </CustomAction>
</Elements>

Con esto es más que suficiente para agregar un grupo en nuestras Configuraciones del Sitio, algo curioso aquí es que si se dan cuenta agregueen la propiedad Location el valor de Microsoft.SharePoint.SiteSettings porque ahí es donde quiero que se vea este Grupo de Acciones, pero aquí les dejo la documentación del MSDN sobre los diferentes sitios en donde podemos agregarlos: http://msdn.microsoft.com/en-us/library/bb802730%28office.14%29.aspx

Y bien el resultado que obtenemos al hacer esto es el siguiente:

 

image

Es un post rápido y sencillo, pero seguro saca a alguien de un apuro y sino, mínimo me sirve de referencia, porque luego se me olvida.

Saludos.

Etiquetas de Technorati:

Categorías: Ejemplos, Sharepoint, Tips

[WPF] Manejo de Temas de Estilos, Resource Dictionary

abril 24, 2010 4 comentarios

Buenas,

Aquí con un post sobre como majear los estilos en una aplicación de WPF. Les platico el escenario, Imaginen que ya terminamos una aplicación que ya funciona y todo, pero queremos que el Layout se vea mejor, ustedes saben eso de la UX (User Experience), entonces pensamos en agregar la opción de que cambie el Estilo de nuestra aplicación (cómo lo que se hace en ASP.NET :P). Bueno ps aquí un pequeño post de como hacer esto.

1.- Creamos una nueva aplicación de WPF, y agregamos este código en la Ventana Principal.

<Grid x:Name="host">
        <Button Content="Button" Height="23" HorizontalAlignment="Left" Margin="12,96,0,0" Name="button1" VerticalAlignment="Top" Width="75" />
        
        <Menu Height="23" HorizontalAlignment="Left" Margin="12,0,0,0" Name="menu1" VerticalAlignment="Top" Width="80" >
            <MenuItem Header="Diseño" >
                <MenuItem Header="Temas">
                    <MenuItem Header="Azul" Tag="Azul" Click="Selected_Theme" />
                    <MenuItem Header="Rojo" Tag="Rojo" Click="Selected_Theme" />
                    <MenuItem Header="Verde" Tag="Verde" Click="Selected_Theme" />
                </MenuItem>
            </MenuItem>
        </Menu>
    </Grid>

2.- Luego  agregamos una carpeta que se llame “Temas” en donde colocaremos los diccionarios de recursos para nuestros temas. Dentro de esta carpeta vamos a agregar los respectivos diccionarios, en este caso Azul.xaml, Rojo.xaml y Verde.xaml.

Este es el código para recurso.

Azul.xaml

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Style x:Key="Azul" TargetType="{x:Type Control}">
        <Setter Property="Background" Value="Blue" />
    </Style>
</ResourceDictionary>

Rojo.xaml

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Style x:Key="Rojo" TargetType="{x:Type Control}">
        <Setter Property="Background" Value="Red" />
    </Style>
</ResourceDictionary>

Verde.xaml

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    
    <Style x:Key="Verde" TargetType="{x:Type Control}">
        <Setter Property="Background" Value="Green" />
    </Style>
    
</ResourceDictionary>

Como se pueden dar cuenta solo estoy cambiando la propiedad Background, eso solo como ejemplo, porque en la practica estos archivos llevan un montón de código que se genera por lo regular con Expression Blend 😀

Los archivos quedan así:

image

Ahora en el evento de Click de los elementos del menú, colocamos el siguiente código:

private void Selected_Theme(object sender, RoutedEventArgs e)
{
    MenuItem menu = sender as MenuItem;
    string tema = menu.Tag as string;            
    AplicaEstilo(tema);
}

Y por ultimo el método de de AplicarEstilo, que tiene este código:

private void AplicaEstilo(string tema)
{

    string uri = string.Format("{0}{1}.xaml", rutaTemas, tema.ToString());

    Collection<ResourceDictionary> stylesDiccionario = new Collection<ResourceDictionary>();

    IEnumerable controles = LogicalTreeHelper.GetChildren(this.host);
    
    ResourceDictionary diccionario = new ResourceDictionary();
    diccionario.Source = new Uri(uri, UriKind.RelativeOrAbsolute);
    Style nuevo = diccionario[tema] as Style;

    
    
    foreach (object c in controles)
    {
        if (c is Control)
        {
            ((Control)c).Style = nuevo;
        }
    }            

}

 

Cabe mencionar, que en el foreach solo aplico a los elementos que heredan de Controls, ya que la propiedad background no aplica en todos los elementos. Pero vaya si ejecutamos la aplicación funciona más o menos así:

image

Aquí el código fuente, que por cierto esta en VS 2010 :p

image

Etiquetas de Technorati: ,,,
Categorías: Ejemplos, WPF

[XML] Error – "Namespace Manager or XsltContext needed. This query has a prefix, variable, or user-defined function."

noviembre 14, 2009 Deja un comentario

buenas,

Aquí mi solución para este problema , supongamos que tenemos el siguiente archivo XML, que puede ser una respuesta de consumir un WebService, un archivo que generamos, etc.

Archivo Xml

<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
               xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
               xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <GetReportResultsResponse xmlns="https://myservice">
      <GetReportResultsResult>FileXml</GetReportResultsResult>
    </GetReportResultsResponse>
  </soap:Body>
</soap:Envelope>

Como se pueden dar cuenta, se observan prefijos en cada nodo, este prefijo es “soap” y el archivo Xml contiene el namespace para usar este prefijo, pero al momento de seleccionar un nodo de la siguiente manera:

XmlDocument document = new XmlDocument();
document.Load(@"../../FileXml.xml");

XmlNodeList nodes = 
    document.SelectNodes(@"soap:Body");

Visual Studio nos informa de la siguiente excepción:

“Exception: Namespace Manager or XsltContext needed. This query has a prefix, variable, or user-defined function.”

Esto se debe a que no se reconoce el nombre de espacio que contiene nuestro archivo Xml, para solucionarlo debemos agregar un administrador de namespace y agregarlo a la selección de la siguiente manera:

Solución:

XmlNamespaceManager nms = 
    new XmlNamespaceManager(document.NameTable);
nms.AddNamespace("soap", "http://schemas.xmlsoap.org/soap/envelope");


XmlNodeList nodes = 
    document.SelectNodes(@"soap:Body",nms);

Con esto es suficiente para poder seleccionar nuestros nodos, y así manipularlo a nuestro antojo. Espero que les ayude este tip, así que saludos….. 😀

Saludos,

Norberto 😛

Etiquetas de Technorati: ,,,
Categorías: Ejemplos, Errores, Tips, XML

[LINQ] SELECT en LINQ To SQL

octubre 10, 2009 1 comentario

Buenas,

Aquí el primero de unos post rápidos de LINQ TO SQL, para aquellos que estamos aprendiendo :D. Comenzamos con un SELEC

 

1.- Select * from —-> xD

T-SQL

SELECT * FROM dbo.EntradasBlog

LINQ TO SQL

VB.NET

Dim [select] = From e In sel.EntradasBlogs Select e

C#

var selec = from e in sel.EntradasBlogs
                          select e;

 

2. Select —> en un solo campo

T-SQL

SELECT Titulo FROM dbo.EntradasBlog

LINQ TO SQL

VB.NET

Dim [select] = From e In sel.EntradasBlogs Select e.Titulo

C#

var selec = from e in sel.EntradasBlogs select e.Titulo;

3.- Select —> obtenido el primer registro

T-SQL

SELECT TOP 1 Titulo FROM dbo.EntradasBlog

LINQ TO SQL

VB.NET

Dim [select] = (From e In sel.EntradasBlogs Select e.Titulo).First

C#

var selec = (from e in sel.EntradasBlogs 
                         select e.Titulo).First();

4. Select —> un registro en especifico

T-SQL

SELECT Titulo FROM dbo.EntradasBlog
WHERE id = 1

LINQ TO SQL

VB.NET

Dim [select] = sel.EntradasBlogs.SingleOrDefault _
                (Function(c) c.Id = "0000000001")

donde ser es:

Dim sel As New DemosDataContext

ó

Dim [select] = (From e In sel.EntradasBlogs _
                     Where e.Id = "0000000001" _
                       Select e.Titulo).Single

C#

var selec = sel.EntradasBlogs.SingleOrDefault(c 
                        => c.Id == "0000000001");

ó

var selec = (from e in sel.EntradasBlogs
             where e.Id == "0000000001"
             select e).Single();

5. Select —> un numero especifico de registros

T-SQL

SELECT TOP 3 * FROM dbo.EntradasBlog 

LINQ TO SQL

VB.NET

Dim [select] = (From e In sel.EntradasBlogs).Take(3)

C#

var selec = (from e in sel.EntradasBlogs 
                         select e).Take(3);

6. Select—> con subquerys

T-SQL

SELECT Titulo FROM dbo.EntradasBlog 
WHERE id = (SELECT id from dbo.Entradas 
            WHERE (id = '0000000001'))  

LINQ TO SQL

VB.NET

Dim [select] = _
        (From e In sel.EntradasBlogs _
        Where (From en In sel.Entradas _
               Where (en.id = "0000000001") _
               Select en.id).Contains(e.Id) _
        Select e.Titulo)

C#

var selec = from e in sel.EntradasBlogs
                        where (
                                from en in sel.Entradas
                                where en.id == "0000000001"
                                select en.id
                                ).Contains(e.Id)
                        select e.Titulo;

Bien parece que estos son algunas maneras de realizar Select desde LINQ2SQL, ya en otros post’s iremos hablando sobre otras sentencias.

Etiquetas de Technorati: ,,,

[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

[Word] Saber el total de páginas en un documento

septiembre 3, 2009 2 comentarios

Otro post rápido, para contestar al comentario de un lector del blog…

“Primero, quiero agradecer que comenten, esto me ayuda a seguir posteando y claro a ustedes a seguir leyendo para compartir información, pero a lo que voy.”

Para saber el total de páginas la clase Microsoft.Office.Interop.Word.Application nos provee de una instrucción, pero para entender mejor esto… realice una demo rápida en un proyecto de tipo Console Application, aquí el código:

 

Sub Main()
    'Instancia de Word
    Dim Word As New Microsoft.Office.Interop.Word.Application

    'Abrimos un documento
    Word.Documents.Open("Ruta de tu documento")
    Word.Application.Visible = True
    Word.WindowState = WdWindowState.wdWindowStateMaximize

    'Mostramos el total de páginas del documento
    Dim totalPaginas As String = String.Empty

    totalPaginas = Word.Selection.Information(WdInformation.wdNumberOfPagesInDocument).ToString

    Console.WriteLine("El documento {0} contiente {1} paginas", Word.ActiveDocument.Name, totalPaginas)


    Console.WriteLine("preciona la tecla 'X' para cerrar el documento")

    Dim cerrar As Char = Console.ReadLine

    'Cerramos el archivo sin guardar cambios
    Select Case cerrar
        Case "X"
            Word.ActiveDocument.Close(SaveChanges:=False)
            Word.Application.Quit()
        Case "x"
            Word.ActiveDocument.Close(SaveChanges:=False)
            Word.Application.Quit()
    End Select

    Console.ReadLine()
End Sub

Creo que es muy fácil de entender, y si tienen alguna duda, ya saben que pueden comentar y si tengo la respuesta seguro lo poste. Como es otro post rápido aquí lo doy por terminado 😛

Nota: no se les olvide agregar la referencia a la clase Microsoft.Office.Interop.Word.Application y después hacer su respectivo Imports:

Imports Microsoft.Office.Interop.Word

Saludos.

Etiquetas de Technorati: ,,,
Categorías: Ejemplos, office, Office 2007, Tips, Word

[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

[Silverlight] Mostrar RSS en una aplicación de Silverlight

Primero es crear un proyecto desde Expression Blend 2 de tipo Silverlight 2:

image

Luego Agregamos una imagen que será el fondo de donde se mostrara nuestras RSS, la imagen puede ser la que quieran, o en su caso darle diseño al control que muestra el contenido de Silverlight. Después que agregamos la imagen le quitamos el fondo al Grid, para que nuestro control se vea más o menos así:

image

Bien, a esto agregamos 2 TextBlock y un TextBox, con los siguientes nombres:

Control Nombre
TextBlock Titulo
Texblock Fecha
TextBox Contenido

Ya que tenemos nuestro “Diseño”, vamos a abrir el mismo proyecto desde Visual Studio 2008, abrimos la página xaml.cs para trabajar en ella y lo primero que hacemos el agregar los nombres de espacios que vamos a ocupar que son los siguientes:

using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.ServiceModel;
using System.ServiceModel.Syndication;
using System.Net;

Luego en la página xaml.cs declaramos el url de RSS con la siguiente instrucción:

string feedUrlTemplate = "https://mspnor.wordpress.com/feed/rss/";

Ya con esto necesitamos un método que lea nuestros RSS, el cual declaramos y hacemos uso de un WebClien y creamos una nueva URI

     
private void CargarRSS(string uri)
{
    WebClient wb = new WebClient();
    wb.OpenReadCompleted += new OpenReadCompletedEventHandler(wb_OpenReadCompleted);

    Uri feedUri = new Uri(uri, UriKind.Absolute);
    wb.OpenReadAsync(feedUri);
}

Ahora lo interesante viene en el evento OpenReadCompleted del webClient, el código es el siguiente:

void webClient_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e)
{
    if (e.Error != null)
    {
        this.Contenido.Text = "Error al cargar el XML del feed intentelo de nuevo";
        return;
    }
    using (System.IO.Stream stream = e.Result)
    {
        SyndicationFeed feed;
        using (System.Xml.XmlReader reader = System.Xml.XmlReader.Create(stream))
        {
            feed = SyndicationFeed.Load(reader);

            SyndicationItem item = feed.Items.First();

            this.Fecha.Text = item.PublishDate.ToString();
            this.Titulo.Text = item.Title.Text;
            this.Contenido.Text = item.Summary.Text;
        }
    }
}

Aquí hacemos uso de nuevo metodo para obtener los RSS a de una página y es la clase SyndicationFeed, y SyndicationItem como se pueden dar cuenta esto es muy sencillo esto es todo lo que necesitamos para tener RSS en una aplicación Silverlight. En el próximo post veremos como agregar esta aplicación a un WebSlice.

Se me olvidaba, El metodo cargarRSS tenemos que colocarlo en la sobrecarga de la página:

public Page()
{
    InitializeComponent();
    CargarRSS(feedURL.Trim());            
}

y si ejecutamos esto se ve más o menos así:

image

Aquí hay un pequeño detalle, que por el momento no existe un control en Silverlight que muestre contenido HTML como tal, aunque ya se esta trabajando en esto, e inlcuso existen algunos proyectos betas en CodeProject, aun no, pero vaya que esto se puede mejorar en muy poco tiempo, así que aquí les dejo este post, espero que les ayude y no duden en comentar y votar por el Blog.

 

Saludos!

Etiquetas de Technorati: ,,

[ASP.NET – SQL] Tare 2. Conectándome a una BD sin colocar la cadena de conexión en el WebConfig

junio 19, 2009 1 comentario

Bien, aquí el como hacer lo que se menciona en el titulo del post. Primero debemos tener una base de datos (la cual ya tengo y uso para las demos, estoy usando SQL Server Enterprise). Bien mi base contiene una tabla llamada EntradasBlog con 5 campos que son los siguientes:

image

Bien pues vamos a trabajar con esta base, creamos un proyecto web asp.net y agregamos una clase que se llame ClConexion, en la cual lo primero es agregar los nombres de espacios que vamos a usar:

using System.Data;
using System.Data.SqlClient;

Después creamos una función que nos regrese la conexión el código es este:

public static SqlConnection cnx()
{
    string conexion = "Data source=SQLNOR;" +
                        "initial catalog=BD_DEMOS;" +
                        "User id=sa; password=******
    SqlConnection con = new SqlConnection(conexion);
    return con;
}

Con esto ya tenemos nuestra conexión ahora veamos si funciona, para esto agregamos un GridView a nuestra página el cual enlazaremos desde código, vamos a colocar el siguiente código en el evento Load de nuestra página:

DataSet ds = null;
            SqlDataAdapter da = null;

            using (SqlConnection conexion = ClConexion.cnx())
            {
                SqlCommand com = new SqlCommand("Select * From EntradasBlog", conexion);
                com.CommandType = CommandType.Text;

                ds = new DataSet();
                da = new SqlDataAdapter(com);
                da.Fill(ds);

                com.Dispose();

                gvEntradasBlog.DataSource = ds;
                gvEntradasBlog.DataBind();
            }

 

Con esto tenemos todo listo, solo falta generar y listo!, entonces nuestra página se muestra así:

image

Bien espero que les ayude, cualquier duda, escríbanla en los comentarios. Y no olviden votar por el blog 😀

Etiquetas de Technorati: ,,,,,

[IE8] WebSlice del blog del Nor xD

junio 19, 2009 Deja un comentario

Después de la platica de Aceleradores y WebSlice de hace un par de días en la UNEVE, aquí el WebSlice de mi Blog. No les voy a decir como hacer un WebSlices, les recomiendo el post de mi  buen amigo Ivan en donde describe como hacer un WebSlice con acceso a datos, aquí la dirección:

http://sqlpsykrest.wordpress.com/2009/05/15/asp-net-creando-una-webslice-con-datos-de-una-bd-y-un-repeater-sql-2008/

Bien, como seguramente ya saben como hacer un WebSlices y saben que es muy fácil aquí tip, para poner un poco más chulos los WebSlices. (aunque el mío no se ve tan chulo xD). El punto es que voy a mostrar los RSS de mi blog en un WebSlice, como saben esto se hace con el microformato:

feedurl

y la instrucción sería más o menos así:

<a rel="feedurl" href="https://mspnor.wordpress.com/feed/" style="display:none;"></a>

Pero, aquí hay un problema es un poco complicado pornerle un estilo a nuestro WebSlices pa’ ponerlo chulo, así que la respuesta a esto es hacer referencia a una página que será la que se mostrará en el WebSlices, para esto usamos lo solucionamos haciendo referencia a dicha página htm:

<a href="display.htm" rel="entry-content" style="display:none"></a>

Como se dan cuenta tiene referencia al entry-content, en esta página podemos ponerle diseño para que se vea chulo nuestro WebSlice :D. Vale mi código para que se muestre mis RSS en un WebSlice con un poco de diseño es el siguiente:

<div id="topten"class="hslice">
  <h1 class="entry-title">WebSlices del Blgo del Nor</h1>
  <div class="entry-content">
    <script language="JavaScript" src="http://www.hoteljuice.com/conversor/feed2js" type="text/javascript"></script>
      <noscript>
         <a href="http://www.hoteljuice.com/conversor/feed2js.php?">Ver Feed RSS</a>
         </noscript>
  </div>
  <a href="display.htm" rel="entry-content" style="display:none"></a>
 </div> 

Aquí mi script es el que hace la magia para mostrar los RSS y si se dan cuenta es lo que muestro en el entry-content y al final hago referencia a la misma página, es decir en display.htm tengo este código dentro del body :D, y por ultimo un poco de css para poner una imagen de fondo y alinear al centro todo este rollo:

body
{
    width: 500px;
    margin: 0 auto;
    background: url(https://mspnor.files.wordpress.com/2009/06/webslice.png) no-repeat center top;
}

h1
{
    font-family: 'Comic Sans MS';
    font-size: large;
    color: #000080;
    text-align: center;
}

Con esto todo esta listo para mi WebSlices que cuando lo agrego a mi página se ve más o menos así:

image

Solo un pequeño detalle con esto de redireccionar a una página, es que los WebSlices se agregan con el titulo, cosa que con los otros, no, pero vaya que el hecho de poder poner chulos nuestros WebSlices ya es bastante :D. Espero que les ayude esto y no olviden votar por el Blog 😛

 

Etiquetas de Technorati: ,,,,
Categorías: Ejemplos, IE, IE8, Tips, WebSlices

¿Por qué el número del puerto del Servidor de desarrollo ASP.NET es diferente al que se muestra en el explorador?

junio 3, 2009 29 comentarios

Este es una cuestión un poco extraña de repente me comenzó a suceder de un momento a otro. El asunto es el siguiente inicie un nuevo proyecto en Visual Studio 2005, para ser exactos un Sitio Web para hacer unas pruebas en el trabajo, bien cuando intento ver mi sitio en el Explorador (en cualquier explorador, porque hice  pruebas con Firefox, Chrome e IE8) no me muestra la página .aspx, en primera impresión pensé que era error mío, pero me di cuenta que los números de los puertos del Servidor de desarrollo de ASP.NET  y del explorador es diferente:

image

image

Como se pueden dar cuenta en estas imágenes el  puerto es diferente y para que funcione tengo que estar cambiando manualmente el puerto del explorador, pero estarán de acuerdo que esto es muy tedioso.

Lo primero que pensé fue que era culpa del IIS, estuve indagando en Google y en Bing xD y nada :S.

Después pensé que era cosa de Visual Studio y cambia configuración incluso ejecute el sitio desde el prompt con ayuda de WebDev.WebServer.exe y nada, seguía sin funcionar, busque de nuevo en Bing y me encontre con esta solución del Guille

http://www.elguille.info/net/aspnet/numero_puerto_aspnet_development_server_diferente_explorador.aspx

Lo aplique y a la primera me funciono, pero luego cada que reiniciaba VS y quería ver mi sitio tenia que cambiar el puerto y me decía que el puerto estaba siendo usado :S, y pues que tedioso estar cambiando el numero del puerto.

Y seguí mi búsqueda en internet (bing) durante un rato más, hasta que en un foro me encontré con la solución, resulta que esto sucede gracias al vendito NOD32, el es el causante de todo este rollo.

Aquí la solución.

Abrimos NOD32->En Modo avanzado->Hacemos clic en Configuración->Antivirus y anti espía->Protección del tráfico de Internet->Configurar…

image

Se abre una ventana de configuración en donde nos dirigimos a Antivirus y anti espía->HTTP->Navegadores de Internet. Aquí debemos de buscar el EXE de Visual Studio y desmarcarlo para que no se analice la transferencia de datos.

image

Una ves hecho esto, solo hacemos clic en Aceptar y cerramos NOD32 y listo!, ahora si debe de funcionar correctamente, el numero de los puerto del servidor de desarrollo de ASP.NET debe de ser igual al del explorador.

Espero que este post les ayude cuando se encuentren con este error y puedan seguir trabajando.

Saludos!

Etiquetas de Technorati: ,,,

[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í:

https://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.

[Windows Form] Formulario triangular

May 26, 2009 2 comentarios

Hace algún tiempo escribí como hacer un formulario de tipo circular, esta vez roca como hacer triangular.

1.Necesitamos establecer la propiedad FormBorderStyle en None

2. Colocar la propiedad StartPosition en CenterParent

3. Colocar el siguiente código en el evento Load de nuestro formulario:

System.Drawing.Drawing2D.GraphicsPath miPath = new System.Drawing.Drawing2D.GraphicsPath();
miPath.AddPolygon(new Point[] { new Point(0, 0), new Point(300,0), new Point(150,150)});
Region miRegion = new Region(miPath);
this.Region = miRegion;

Y listo!!

Seguro se preguntaran que esto para que, pero me imagino que a alguien le puede servir.

Actualización 01/06/2009

Así se ve el formulario triangular.

image

Saludos!

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

[Windows Form] Full Screen en un aplicación Windows Form

May 26, 2009 5 comentarios

Si alguna vez tienen la necesidad de aplicar la posición y tamaño de un Formulario en pantalla completa, solo tenemos que hacer un par de cosas.

1. Colocar la propiedad StartPosition en Manual

2. Colocar el siguiente código en el evento Load de nuestro formulario:

this.Size = SystemInformation.PrimaryMonitorSize;

otra forma de hacerlo desde Visual Basic, que a mi en lo particular no me agrada es la siguiente:

Me.MaximumSize = New Point(My.Computer.Screen.Bounds.Width, My.Computer.Screen.Bounds.Height)
Me.MinimumSize = New Point(My.Computer.Screen.Bounds.Width, My.Computer.Screen.Bounds.Height)

Aquí el como hacerlo por si les sirve, se que es muy sencillo, pero me imagino que ha alguien le debe servir.

Saludos!

Etiquetas de Technorati: ,,
Categorías: .NET, Ejemplos, Tips, Windows Form

[IE8] Creando un Acelerador para Internet Explorer

May 25, 2009 1 comentario

Bien, no les voy a aventar un rollo de lo que son los Aceleradores de Internet Explorer 8, solo vamos a ver como hacer un Acelerador, en este caso el de mi Blog :D. Si quieren saber que son los aceleradores aquí unos links

http://www.microsoft.com/spain/windows/internet-explorer/features/accelerators.aspx?tabid=1&catid=1

http://es.wikipedia.org/wiki/Internet_Explorer_8#Aceleradores

 

Pero vamos al ejemplo: Acelerador Blog My Content Pipeline

Vamos a crear un proyecto de ASP.NET con C#, en donde vamos agregar un archivo XML que contiene los datos de nuestro Acelerador de el blog: https://mspnor.wordpress.com el cual tiene la siguiente apariencia:

<?xml version="1.0" encoding="utf-8" ?>
<os:openServiceDescription xmlns:os="http://www.microsoft.com/schemas/openservicedescription/1.0">
    <os:homepageUrl>https://mspnor.wordpress.com</os:homepageUrl>
      <os:display>
             <os:name>Busca en My Content Pipeline</os:name>
          <os:icon>https://s-ssl.wordpress.com/favicon.ico</os:icon>
          <os:description>Demo de un acelerador de IE8 del blog del nor xD</os:description>
      </os:display>
    <os:activity category="Blog">
           <os:activityAction context="selection">
                     <os:execute action="https://mspnor.wordpress.com/?s={selection}"></os:execute>
           </os:activityAction>
    </os:activity>
</os:openServiceDescription>

Entonces nuestro Explorador de Soluciones tendrá la siguiente apariencia:

imageAhora solo tenemos que aplicar la instalación de nuestro Acelerador en algún evento de nuestra página, en mi caso en el clic de un botón. Para esto necesitamos agregar en nuestro código de la pagina .aspx lo siguiente:

 

<script language="javascript" type="text/javascript">
           function FuncionJS() {
               window.external.AddService('mspnor.xml');
           }
   </script>

Y por último asociar dicha función al evento clic de nuestro botón el cual se llama btnInstall, este código lo colocamos en el evento Load de nuestra página:

btnInstall.Attributes.Add("onclick","FuncionJS();");

Con esto si ejecutamos nuestra aplicación y damos clic en el botón tenemos el siguiente mensaje de parte de IE8:

image

Aquí me aparece la opción de Reemplazar, porque ya habia hecho pruebas antes de postear esto, pero de inicio dice Instalar xD, ya que tenemos podemos hacer uso de nuestro Acelerador cada vez que seleccionemos algo en IE8 ejemplo:

imageComo pueden observar este acelerador no contiene un preview, cosa que vamos a hacer en otro post. por el momento aquí les dejo este ejemplo espero que sea de utilidad. 😀

Saludos!!

Categorías: Ejemplos, IE, IE8

[VS 2008] Error extraño al desinstalar componentes

Bien hace un buen rato que me estoy peleando con la versión Team Suite de VS 2008 en español, y me he decidido a desinstalar por completo esta versión, y mientras desinstalaba me eh topado con este error:

image

Lo que pasa es que siempre que desinstalo o instalando alguno producto que tenga que ver con tecnologías MS uso Snagit para poder capturar las pantallas y no perder tiempo, pero creo que esta ves tengo que cerrarlo para que no me marque otro error xD

[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", "https://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

[Word] Colocar el cursor en la primera página

febrero 23, 2009 2 comentarios

Aquí un Tip, para colocar el cursor el inicio del Documento. Esto lo hacemos con una sola línea de código que es:

Word.Selection.HomeKey(Microsoft.Office.Interop.Word.WdUnits.wdStory, False)

El segundo parámetro nos indica si vamos a seleccionar el texto, si lo colocamos en True, selecciona desde el punto donde se encontraba el puntero hasta el inicio.

Etiquetas de Technorati: ,,