El Libro del Día: 2015-02-12
Titulo: HTML5 Up and Running
Autor: Mark Pilgrim
Editorial: O'Reilly
Nro Paginas: 222
Capítulos:
1. How Did We Get Here?
2. Detecting HTML5 Features
3. What Does It All Mean?
4. Let’s Call It a Draw(ing Surface)
5. Video on the Web
6. You Are Here (And So Is Everybody Else)
7. The Past, Present, and Future of Local Storage for Web Applications
8. Let’s Take This Offline
9. A Form of Madness
10. “Distributed,” “Extensibility,” and Other Fancy Words
Appendix: The All-in-One Almost-Alphabetical Guide to Detecting Everything
Descarga:
HTML5_Up_and_Running
Blog de Luis Dueñas dedicado a la difusión del Desarrollo en Microsoft .NET, Visual Studio, WinForms, WebForms, MVC, ASP .NET, jQuery, AJAX, HTML5, JavaScript, Móviles, etc. Encontrarás Libros, Demos, Artículos Técnicos, Entrenamiento.
jueves, 12 de febrero de 2015
El Libro del Día: HTML5 Up and Running
Etiquetas:
Distributed,
Drawing,
Extensibility,
Features,
Form,
Google,
HTML5,
Libros,
Local Storage,
Mark Pilgrim,
O'Reilly,
Offline,
Up and Running,
Video,
Web App
miércoles, 11 de febrero de 2015
El Libro del Día: Mobile and Web Messaging
El Libro del Día: 2015-02-11
Titulo: Mobile and Web Messaging
Autor: Jeff Mesnil
Editorial: O'Reilly
Nro Paginas: 183
Capítulos:
1. Introduction
Part I. STOMP
2. Mobile Messaging with STOMP
3. Web Messaging with STOMP
4. Advanced STOMP
5. Beyond STOMP
Part II. MQTT
6. Mobile Messaging with MQTT
7. Web Messaging with MQTT
8. Advanced MQTT
Part III. Appendixes
A. Apache ActiveMQ
B. Mosquitto
Descarga:
Mobile_and_Web_Messaging
Titulo: Mobile and Web Messaging
Autor: Jeff Mesnil
Editorial: O'Reilly
Nro Paginas: 183
Capítulos:
1. Introduction
Part I. STOMP
2. Mobile Messaging with STOMP
3. Web Messaging with STOMP
4. Advanced STOMP
5. Beyond STOMP
Part II. MQTT
6. Mobile Messaging with MQTT
7. Web Messaging with MQTT
8. Advanced MQTT
Part III. Appendixes
A. Apache ActiveMQ
B. Mosquitto
Descarga:
Mobile_and_Web_Messaging
Etiquetas:
ActiveMQ,
Advanced,
Apache,
Beyond,
Introduction,
Jeff Mesnil,
Libros,
Messaging,
Mobile,
Mosquitto,
MQTT,
O'Reilly,
Protocols,
STOMP,
Web
martes, 10 de febrero de 2015
El Libro del Día: jQuery 2.0 Development Cookbook
El Libro del Día: 2015-02-10
Titulo: jQuery 2.0 Development Cookbook
Autor: Leon Revill
Editorial: Packt
Nro Paginas: 410
Capítulos:
Chapter 1: Document Object Model Manipulation
Chapter 2: Interacting with the User by Making Use of jQuery Events
Chapter 3: Loading and Manipulating Dynamic Content with AJAX and JSON
Chapter 4: Adding Attractive Visuals with jQuery Effects
Chapter 5: Form Handling
Chapter 6: User Interface
Chapter 7: User Interface Animation
Chapter 8: Understanding Plugin Development
Chapter 9: jQuery UI
Chapter 10: Working with jQuery Mobile
Descarga:
jQuery_2.0_Development_Cookbook
Titulo: jQuery 2.0 Development Cookbook
Autor: Leon Revill
Editorial: Packt
Nro Paginas: 410
Capítulos:
Chapter 1: Document Object Model Manipulation
Chapter 2: Interacting with the User by Making Use of jQuery Events
Chapter 3: Loading and Manipulating Dynamic Content with AJAX and JSON
Chapter 4: Adding Attractive Visuals with jQuery Effects
Chapter 5: Form Handling
Chapter 6: User Interface
Chapter 7: User Interface Animation
Chapter 8: Understanding Plugin Development
Chapter 9: jQuery UI
Chapter 10: Working with jQuery Mobile
Descarga:
jQuery_2.0_Development_Cookbook
Etiquetas:
AJAX,
Animation,
Cookbook,
Development,
DOM,
Dynamic Content,
Effects,
Events,
Form,
jQuery,
jQuery Mobile,
jQuery UI,
JSON,
Leon Revill,
Libros,
Loading,
Packt,
Plugin,
User Interface,
Visuals
lunes, 9 de febrero de 2015
El Libro del Día: JavaScript Security
El Libro del Día: 2015-02-09
Titulo: JavaScript Security
Autor: Y.E Liang
Editorial: Packt
Nro Paginas: 112
Capítulos:
Chapter 1: JavaScript and the Web
Chapter 2: Secure Ajax RESTful APIs
Chapter 3: Cross-site Scripting
Chapter 4: Cross-site Request Forgery
Chapter 5: Misplaced Trust in the Client
Chapter 6: JavaScript Phishing
Descarga:
JavaScript_Security
Titulo: JavaScript Security
Autor: Y.E Liang
Editorial: Packt
Nro Paginas: 112
Capítulos:
Chapter 1: JavaScript and the Web
Chapter 2: Secure Ajax RESTful APIs
Chapter 3: Cross-site Scripting
Chapter 4: Cross-site Request Forgery
Chapter 5: Misplaced Trust in the Client
Chapter 6: JavaScript Phishing
Descarga:
JavaScript_Security
Etiquetas:
AJAX,
Client,
Cross-site,
Javascript,
Libros,
Packt,
Phishing,
Request Forgery,
RESTful APIs,
Scripting,
Secure,
Security,
Trust,
Web,
Y.E Liang
sábado, 7 de febrero de 2015
El Libro del Día: Mastering JavaScript Design Patterns
El Libro del Día: 2015-02-07
Titulo: Mastering JavaScript Design Patterns
Autor: Simon Timms
Editorial: Packt
Nro Paginas: 290
Capítulos:
Chapter 1: Designing for Fun and Profit
Part 1: Classical Design Patterns
Chapter 2: Organizing Code
Chapter 3: Creational Patterns
Chapter 4: Structural Patterns
Chapter 5: Behavioral Patterns
Part 2: Other Patterns
Chapter 6: Functional Programming
Chapter 7: Model View Patterns
Chapter 8: Web Patterns
Chapter 9: Messaging Patterns
Chapter 10: Patterns for Testing
Chapter 11: Advanced Patterns
Chapter 12: ES6 Solutions Today
Appendix: Conclusion
Descarga:
Mastering_JavaScript_Design_Patterns
Titulo: Mastering JavaScript Design Patterns
Autor: Simon Timms
Editorial: Packt
Nro Paginas: 290
Capítulos:
Chapter 1: Designing for Fun and Profit
Part 1: Classical Design Patterns
Chapter 2: Organizing Code
Chapter 3: Creational Patterns
Chapter 4: Structural Patterns
Chapter 5: Behavioral Patterns
Part 2: Other Patterns
Chapter 6: Functional Programming
Chapter 7: Model View Patterns
Chapter 8: Web Patterns
Chapter 9: Messaging Patterns
Chapter 10: Patterns for Testing
Chapter 11: Advanced Patterns
Chapter 12: ES6 Solutions Today
Appendix: Conclusion
Descarga:
Mastering_JavaScript_Design_Patterns
Etiquetas:
Advanced,
Behavioral,
Classical,
Creational,
Design Patterns,
ES6,
Functional,
Javascript,
Libros,
Mastering,
Messaging,
Model View,
Organizing Code,
Packt,
Patterns,
Simon Timms,
Structural,
Testing,
Web
viernes, 6 de febrero de 2015
El Demo del Día: Agrupación de Celdas del DataGridView en WinForms
Agrupación de Celdas del DataGridView en WinForms
Requerimiento
Se necesita agrupar los valores repetidos de ciertas columnas del DataGridView en una Aplicación Windows en .NET, por ejemplo para ver los productos por categorías o por proveedores sin tener que repetir varias veces el mismo valor.
Solución
Crearemos una clase personalizada llamada Grilla que herede del DataGridView y que sobre escriba los eventos "OnCellPainting" y "OnCellFormatting".
En el primer evento (CellPainting) colocaremos los bordes solo cuando el valor de la columna sea diferente y en el segundo evento (CellFormatting) borraremos los valores repetidos de cada columna.
En ambos casos solo se considera si es una columna a combinar, para lo cual crearemos una propiedad llamada "GroupColumns".
Crear el Procedimiento Almacenado en la Base de Datos de SQL Server
Para el ejemplo usaremos la Base de Datos Northwind de SQL Server, en la cual crearemos el siguiente Procedimiento almacenado:
Create Procedure uspProductsListarStock
As
Select p.ProductName,p.CategoryID,c.CategoryName,UnitsInStock
From Products p
Inner Join Categories c On c.CategoryID=p.CategoryID
Order By 2,3,1
Crear una Aplicación Windows Forms en C#
En Visual Studio crear un proyecto Windows Forms en C# con el nombre de "DataGridView_Agrupado", luego cambiar el nombre del formulario a "frmListaProductos".
Crear la Clase Entidad del Negocio
Crear la clase beProducto escribiendo el siguiente código:
Requerimiento
Se necesita agrupar los valores repetidos de ciertas columnas del DataGridView en una Aplicación Windows en .NET, por ejemplo para ver los productos por categorías o por proveedores sin tener que repetir varias veces el mismo valor.
Solución
Crearemos una clase personalizada llamada Grilla que herede del DataGridView y que sobre escriba los eventos "OnCellPainting" y "OnCellFormatting".
En el primer evento (CellPainting) colocaremos los bordes solo cuando el valor de la columna sea diferente y en el segundo evento (CellFormatting) borraremos los valores repetidos de cada columna.
En ambos casos solo se considera si es una columna a combinar, para lo cual crearemos una propiedad llamada "GroupColumns".
Crear el Procedimiento Almacenado en la Base de Datos de SQL Server
Para el ejemplo usaremos la Base de Datos Northwind de SQL Server, en la cual crearemos el siguiente Procedimiento almacenado:
Create Procedure uspProductsListarStock
As
Select p.ProductName,p.CategoryID,c.CategoryName,UnitsInStock
From Products p
Inner Join Categories c On c.CategoryID=p.CategoryID
Order By 2,3,1
Crear una Aplicación Windows Forms en C#
En Visual Studio crear un proyecto Windows Forms en C# con el nombre de "DataGridView_Agrupado", luego cambiar el nombre del formulario a "frmListaProductos".
Crear la Clase Entidad del Negocio
Crear la clase beProducto escribiendo el siguiente código:
namespace DataGridView_Agrupado
{
public class beProducto
{
public int IdCategoria { get; set; }
public string NombreCategoria { get; set; }
public string NombreProducto { get; set; }
public short Stock { get; set; }
}
}
Crear la Clase de Acceso a Datos
Crear la clase daProducto escribiendo el siguiente código:
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
namespace DataGridView_Agrupado
{
public class daProducto
{
public List<beProducto> listarStock(SqlConnection con)
{
List<beProducto> lbeProducto = null;
SqlCommand cmd = new SqlCommand("uspProductsListarStock", con);
cmd.CommandType = CommandType.StoredProcedure;
SqlDataReader drd = cmd.ExecuteReader(CommandBehavior.SingleResult);
if (drd != null)
{
lbeProducto = new List<beProducto>();
int posNombreProducto = drd.GetOrdinal("ProductName");
int posIdCategoria = drd.GetOrdinal("CategoryID");
int posNombreCategoria = drd.GetOrdinal("CategoryName");
int posStock = drd.GetOrdinal("UnitsInStock");
beProducto obeProducto;
while (drd.Read())
{
obeProducto = new beProducto();
obeProducto.NombreProducto = drd.GetString(posNombreProducto);
obeProducto.IdCategoria = drd.GetInt32(posIdCategoria);
obeProducto.NombreCategoria = drd.GetString(posNombreCategoria);
obeProducto.Stock = drd.GetInt16(posStock);
lbeProducto.Add(obeProducto);
}
drd.Close();
}
return (lbeProducto);
}
}
}
Nota: Tiene que haberse creado el Procedimiento Almacenado "uspProductsListarStock" en la BD Northwind.
Crear la Clase de Reglas del Negocio
Crear la clase brProducto escribiendo el siguiente código:
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;
namespace DataGridView_Agrupado
{
public class brProducto
{
public List<beProducto> listarStock()
{
List<beProducto> lbeProducto = null;
string CadenaConexion = ConfigurationManager.ConnectionStrings
["conNW"].ConnectionString;
using (SqlConnection con = new SqlConnection(CadenaConexion))
{
try
{
con.Open();
daProducto odaProducto = new daProducto();
lbeProducto = odaProducto.listarStock(con);
}
catch (Exception ex)
{
//grabarLog(ex);
}
}
return (lbeProducto);
}
}
}
Nota: Hay que hacer referencia a la librería "System.Configuration.dll" para usar la clase ConfigurationManager para leer el archivo de configuración.
Crear una Clase para Combinar las Celdas del DataGridView
Crear la clase "Grilla" escribiendo el siguiente código:
using System;
using System.Drawing;
using System.Windows.Forms;
namespace DataGridView_Agrupado
{
public class Grilla : DataGridView
{
public string[] GroupColumns { get; set; }
private bool esRepetidoValorCelda(int fila, int columna)
{
bool exito = false;
int c = fila - 1;
dynamic valorCelda = this.Rows[fila].Cells[columna].Value;
dynamic valorComparar;
while (c > -1)
{
valorComparar = this.Rows[c].Cells[columna].Value;
if (valorCelda.Equals(valorComparar))
{
exito = true;
break;
}
c--;
}
return (exito);
}
private bool esColumnaCombinar(string nombreColumna)
{
bool exito = false;
foreach (string columna in GroupColumns)
{
if (columna.Equals(nombreColumna))
{
exito = true;
break;
}
}
return (exito);
}
protected override void OnCellPainting(DataGridViewCellPaintingEventArgs e)
{
base.OnCellPainting(e);
e.AdvancedBorderStyle.Bottom = DataGridViewAdvancedCellBorderStyle.None;
if (e.RowIndex < 1 || e.ColumnIndex < 0) return;
string nombreColumna = this.Columns[e.ColumnIndex].Name;
bool esCombinada = (GroupColumns!=null && esColumnaCombinar(nombreColumna));
if ((esCombinada && !esRepetidoValorCelda(e.RowIndex, e.ColumnIndex))
|| !esCombinada) e.AdvancedBorderStyle.Top = AdvancedCellBorderStyle.Top;
else e.AdvancedBorderStyle.Top = DataGridViewAdvancedCellBorderStyle.None;
}
protected override void OnCellFormatting(DataGridViewCellFormattingEventArgs e)
{
base.OnCellFormatting(e);
bool esNumero = (e.Value is Int16||e.Value is Int32||e.Value is Int64||e.Value is int
||e.Value is decimal);
if (esNumero)
{
e.CellStyle.Alignment = DataGridViewContentAlignment.MiddleRight;
bool esDecimal = (e.Value is decimal);
if (esDecimal) e.CellStyle.Format = "n2";
}
string nombreColumna = this.Columns[e.ColumnIndex].Name;
bool esCombinada = (GroupColumns != null && esColumnaCombinar(nombreColumna));
if (esCombinada&&esRepetidoValorCelda(e.RowIndex, e.ColumnIndex))
{
e.Value = string.Empty;
e.FormattingApplied = true;
}
}
}
}
Nota: La clase Grilla hereda del DataGridView y sobre escribe los eventos "CellPainting" y "CellFormatting". Ademas se crea una propiedad llamada "GroupColumns" para especificar las columnas que se desean combinar o agrupar sus valores repetidos, para eso creamos 2 funciones: "esRepetidoValorCelda" y "esColumnaCombinar".
Usar la Clase Grilla en el Formulario
Regresar al formulario "frmListaProductos" y escribir el siguiente código:
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;
namespace DataGridView_Agrupado
{
public partial class frmListaProductos : Form
{
public frmGraficoProductos()
{
InitializeComponent();
}
private void listarProductos(object sender, EventArgs e)
{
brProducto obrProducto = new brProducto();
List<beProducto> lbeProducto = obrProducto.listarStock();
Grilla dgvProducto = new Grilla();
dgvProducto.Dock = DockStyle.Fill;
dgvProducto.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;
//dgvProducto.GroupColumns = new string[] { "IdCategoria", "NombreCategoria"};
dgvProducto.DataSource = lbeProducto;
this.Controls.Add(dgvProducto);
}
}
}
Nota: En el evento "load" del formulario se llama a la función "listarProductos" que obtiene los datos de los productos y lo almacena en una lista de objetos, luego esta se enlaza al control Grilla creado.
Inicialmente la línea de código donde se configura la propiedad GroupColumns esta comentada.
Modificar el archivo App.Config para incluir la Cadena de Conexión
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<connectionStrings>
<add name="conNW" providerName="System.Data.SqlClient" connectionString="uid=UsuarioNW;pwd=123456;data source=DSOFT\Sqlexpress;initial catalog=Northwind"/>
</connectionStrings>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
</startup>
</configuration>
Probar la Aplicación Windows Forms
Grabar la aplicación y ejecutarla con F5. Se mostrará la siguiente ventana:
Observar que los valores de las columnas IdCategoria y NombreCategoria salen repetidos, que es la forma normal como funciona el DataGridView.
Detener la ejecución de la aplicación, descomentar la línea comentada:
dgvProducto.GroupColumns = new string[] { "IdCategoria", "NombreCategoria"};
Probar nuevamente y se mostrará una ventana similar a la siguiente figura:
Observar que las columnas IdCategoria y NombreCategoria no se repite los valores ya que se agrupo mediante la propiedad "GroupColumns".
Detener nuevamente la ejecución de la aplicación y eliminar el campo "NombreCategoria" de la propiedad GroupColumns, tal como sigue:
dgvProducto.GroupColumns = new string[] { "IdCategoria" };
Probar nuevamente y se mostrará una ventana similar a la siguiente figura:
Observar que solo la primera columna esta agrupada. Si deseas puedes aumentar nuevos productos con nombres iguales y aumentar a la propiedad "GroupColumns" el campo "NombreProducto".
Comentario Final
En este post hemos visto como agrupar celdas repetidas en una o varias columnas del DataGridView de Windows Forms para lo cual sobre escribimos los eventos CellPainting y CellFormatting que son los 2 principales eventos de dicho control.
En realidad la agrupación de valores repetidos No ha combinado las celdas sino solo ha borrado los valores repetidos y ha puesto el borde superior. Si deseas combinar las celdas se tendría que programar la escritura en el evento Paint causando demora al renderizar, es decir, la técnica que estamos usando es la mas eficiente aunque no se vea fusionada la celda.
Descarga
Etiquetas:
.NET,
Agrupación,
Agrupar,
C#,
CellFormatting,
CellPainting,
CellStyle,
Combinar,
DataGridView,
DataSource,
Demos,
Grilla,
GroupColumns,
Lduenas,
Listas de Objetos,
Merge Cells,
WinForms
El Libro del Día: Designing for Performance
El Libro del Día: 2015-02-06
Titulo: Designing for Performance
Autor: Lara Callender Hogan
Editorial: O'Reilly
Nro Paginas: 181
Capítulos:
Chapter 1 Performance Is User Experience
Chapter 2 The Basics of Page Speed
Chapter 3 Optimizing Images
Chapter 4 Optimizing Markup and Styles
Chapter 5 Responsive Web Design
Chapter 6 Measuring and Iterating on Performance
Chapter 7 Weighing Aesthetics and Performance
Chapter 8 Changing Culture at Your Organization
Descarga:
Designing_for_Performance
Titulo: Designing for Performance
Autor: Lara Callender Hogan
Editorial: O'Reilly
Nro Paginas: 181
Capítulos:
Chapter 1 Performance Is User Experience
Chapter 2 The Basics of Page Speed
Chapter 3 Optimizing Images
Chapter 4 Optimizing Markup and Styles
Chapter 5 Responsive Web Design
Chapter 6 Measuring and Iterating on Performance
Chapter 7 Weighing Aesthetics and Performance
Chapter 8 Changing Culture at Your Organization
Descarga:
Designing_for_Performance
Etiquetas:
Aesthetics,
CSS3,
Culture,
Designing,
HTML5,
Images,
Iterating,
Javascript,
Lara Callender Hogan,
Libros,
Markup,
Measuring,
O'Reilly,
Optimizing,
Page Speed,
Performance,
Responsive Web Design,
Styles,
User Experience
Suscribirse a:
Entradas (Atom)








