[Sharepoint 2010] Custom Actions en Sharepoint 2010 dese Visual Studio
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.
2.- Ahora agregamos un ElementManifest a nuestro feature, en el archivo Feature1.Template.xml
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
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:
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.
[WPF] Manejo de Temas de Estilos, Resource Dictionary
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í:
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í:
Aquí el código fuente, que por cierto esta en VS 2010 :p
[XML] Error – "Namespace Manager or XsltContext needed. This query has a prefix, variable, or user-defined function."
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 😛
[LINQ] SELECT en LINQ To SQL
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
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
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
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.
[C#] Pirámide iterativa
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
[Word] Saber el total de páginas en un documento
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.
[C#] El operador ++, prefijo ó sufijo?
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++;
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!.
[Silverlight] Mostrar RSS en una aplicación de Silverlight
Primero es crear un proyecto desde Expression Blend 2 de tipo Silverlight 2:
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í:
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í:
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!
[ASP.NET – SQL] Tare 2. Conectándome a una BD sin colocar la cadena de conexión en el WebConfig
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:
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í:
Bien espero que les ayude, cualquier duda, escríbanla en los comentarios. Y no olviden votar por el blog 😀
[IE8] WebSlice del blog del Nor xD
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:
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í:
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 😛
¿Por qué el número del puerto del Servidor de desarrollo ASP.NET es diferente al que se muestra en el explorador?
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:
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
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…
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.
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!
[Windows Form] Definir un Access Key con un Label Control
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:
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!!
[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!
[C#] Haciendo la tarea xD, string, palíndromo, invertir una cadena, etc.
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: "); }
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())); }
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:
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
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.
Saludos!
[Windows Form] Full Screen en un aplicación Windows Form
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!
[IE8] Creando un Acelerador para Internet Explorer
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:
Ahora 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:
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:
Como 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!!
[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:
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:
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!
[Word] Colocar el cursor en la primera página
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.
Comentarios recientes