viernes, 14 de octubre de 2011

Control FileUpload dentro de un UpdatePanel

Pues para empezar, según Microsoft, el control FileUpload no es compatible con AJAX y el UpdatePanel. Para hacer que funcione, es necesario que tengamos un PostBack.

Entonces deberíamos tener algo asi:

  1. <Triggers>
  2.     <asp:PostBackTrigger ControlID="cmdGuardar" />
  3. </Triggers>

 

Con esto, se forzara a que en el evento del botón que realizaría la carga del archivo mediante el FielUpload, haga un PostBack. Quitando la parte asíncrona de AJAX.

Y según esto “Microsoft”, todo queda resuelto, pero nop. los dolores de cabeza no hacen mas que empezar.

Al tenerlo así, en algún momento se subirá el archivo, pero no al primer intento, por desgracia, ya que al presionar el botón, el FileUpload viene vacío.

he estado buscando documentación de por que hace esto, pero no he tenido suerte para documentar el problema, pero lo que si tengo es una solución a este problema.

Habrá que agregar un poquito de codigo al botón el lado del cliente:

  1. OnClientClick="javascript:document.forms[0].encoding = 'multipart/form-data';"

 

o en ultimo de los casos se puede dejar el tag form de la siguiente manera:

  1. <form id="form1" runat="server" enctype="multipart/form-data">

 

Con esto se le esta diciendo al request que esta compuesto de dos partes, uno que el request como tal, y por otro lado el archivo, y por lo que he descubierto, en el foro de asp.net dicen que es necesario si se van a estar subiendo archivos al servidor con la página.

Por ultimo dejo otro link con otra alternativa, y solo menciono que esa no la he utilizado: The Code Project

Suerte y espero que les sea de utilidad.

viernes, 2 de septiembre de 2011

Restablecer el valor de Identidad

Pues la cuestión es que, en SQL la mayoría de las tablas que uso tienen campos de identity, y tienen llaves foráneas, con lo cual no se pueden truncar, para poder borrar los registros hay que hacer un “DELETE” a la tabla, y lo ejecutara, siempre y cuando no tenga registros relacionados.

Hasta aquí todo bien, el problema es que al ser identidad, ya tenemos huecos en el campo de identidad. pfffff que relajo.

Bueno pues para solucionar esto aqui esta lo que se debe hacer

1) Ejecutar el Delete a la tabla

DELETE FROM Tabla

2) Resetear el campo identidad

DBCC CHECKIDENT (Tabla, RESEED, 0)

Con el comando de CHECKIDENT nos permite saber el valor actual del Identity, y resetearlo a un valor especifico.


Para ver el valor actual seria de la siguiente forma:

DBCC CHECKIDENT ('Tabla', NORESEED)

Así que ahí tienen, espero sea de utilidad.

lunes, 27 de junio de 2011

Linq y el Metodo Distinct con IEqualityComparer

En este ejemplo no estoy usando tipos anónimos, ya que previamente definí mi clase a ocupar con Linq.

Lo primero es importar la libreria de Reflection.

using System.Reflection;

Lo siguiente es crear una clase que implemente la interface de IEqualityComparer, esta clase se usa sobre un listado del tipo de dato a utilizar

public class OCDiferentes : IEqualityComparer<OCxItem>
{
public bool Equals(OCxItem x, OCxItem y)
{
if (x == null || y == null) //optional
return false;
else
return
x.ID == y.ID;
}

public int GetHashCode(OCxItem Item)
{
return Item.ID.GetHashCode();
}
}
Dentro de esta clase tenemos el método Equals donde se compararan los valores que queremos que sean únicos. Ahora la implementación.
ListadoResultante = (ListadoOrigen
.Where(d => (d.Y- d.X) > 0) //Filtro
.Select(d => new OCxItem
{
PId = (string)d.PId,
Nombre = d.Nombre,
ID = d.ID,
Fecha = d.Fecha,
}).Distinct(new OCDiferentes())
.OrderBy(d => d.ID)).ToList(); //Ordenamiento

Dentro del llamado al metodo Distinct creamos una clase para que compare, del tipo que habíamos definido previamente “OCDiferentes


También incluyo un Where y un Order by para que se entienda como se utilizarían esas otras instrucciones.


Por ultimo tamvien estoy usando la instruccion ToList(), para que cree el listado del tipo que se define en el Select que es “OCxItem


Nota: Listado ListadoResultante y ListadoOrigen son del tipo List<OCxItem>

jueves, 16 de junio de 2011

Visual Studio 2005 ASP.NET Debug en Windows 7 y IIS 7.0

Pues hay una pequeña cuestión con el IIS 7, y es que después de un rato por default termina con nuestro debug de aplicación, y si estábamos evaluando algún valor de la ejecución, pues simple y sencillamente ya no se podía, habría que parar la ejecución y volver a iniciar el debug para poder seguir evaluando valores.

Y pues como esto no es funcional, le vengo ofreciendo, la solución a este problema!

bueno aquí están los 5 pasos para solucionarlo.

1) Entrar al IIS y seleccionar el pool donde esta nuestra aplicación

2) Entrar en las configuraciones avanzadas del pool

3)En la sección de Proccess Model, poner en Ping Enabled= False

ó

4) Modificar el valor de Ping Maximum Response Timeout que por default es 90 segundos, e incrementarlo para que siga habilitada la opción de ping (esto monitorea nuestra aplicación)

5) Guardar los cambios y salir

Y con eso debe solucionarse ese pequeño problemita!

Saluuuuuuuu2

lunes, 13 de junio de 2011

Aplicaciones para iPhone Publicación IV

Pues aquí va una nueva lista, para actualizar las recomendaciones de aplicaciones del iPhone.

featured-soundtracking SoundTraking: con esta aplicación se pueden identificar canciones que escuchamos en la radio, o postear en twitter la cancion que se esta reproduciendo en ese momento en nuestro iphone.

Dropbox Dropbox. el cliente de este servicio, directo para el iphone, la verdad esta muy completo este cliente, ya hice un post previo de este servicio y valdría la pena que lo revisaran para saber de que les hablo.

ibook iBooks: cliente nativo de la manzana, para leer pdf’s o libros que descarguemos de su appstore.

Creo que ahora no ando tan inspirado, o no he utilizado tantas aplicaciones nuevas, no mas bien creo que no ha salido nada que me impresione y que merezca ser compartido!.

Se aceptan sugerencias para ver que mas se puede compartir!

jueves, 12 de mayo de 2011

miércoles, 27 de abril de 2011

DataTable con XML y LINQ

Pues me acabo de dar de topes, tratando de manejar un archivo XML. La tarea era la siguiente:

Se tiene un archivo en XML, y para leerlo decidí utilizar un Datatable

Dim dtMenu As New DataTable("MenuItem")
dtMenu.ReadXmlSchema(Server.MapPath("Menu.xsd"))
dtMenu.ReadXml(Server.MapPath("Menu.xml"))

Una vez  que tenemos el XML cargado en el datatable, se procede a consultarlo con LINQ

Dim query = From NI In dtMenu.AsEnumerable() _
Where NI.Field(Of String)(2) = "0" _
Select NI

Pero cual va siendo mi sorpresa, que el CAST de tipos para el campo que tengo como filtro en el Where no funciona ya que el XML lo esta manejando todo como String. Aquí hay algo curioso, ya que el esquema del XML si hace las validaciones de tipo, pero parece que LINQ se lo pasa por el arco del triunfo.


El error que aparece es algo como esto:

at System.Data.DataRowExtensions.UnboxT`1.ValueField (Object value)
at System.Data.DataRowExtensions.Field[T](DataRow row, String columnName)

y el mensaje fue : Message="Specified cast is not valid."


Cual fue la solución, hacer un CAST de tipos antes de compararlo, independiente de LINQ

Dim query = From NI In dtMenu.AsEnumerable() _
Where CType(NI(2), String) = "0" _
Select NI

Como referencia les dejo este link que fue el que me ayudo a solucionar este problema


DataTable using LINQ to DataSets

jueves, 3 de marzo de 2011

Inicializando una clase en C# con sus propiedades

Pues en este ejemplo no hay mucha ciencia, solo es utilizar sus propiedades para inicializarlo, sin utilizar un constructor sobrecargado.

Empecemos con la definición de la clase.

    private class Person
{
public string Nombre { get; set; }
public string Apellido { get; set; }
}

De hecho podemos observar que la clase ni siquiera tiene un constructor, pero por defecto siempre tiene el constructor sin parámetros.


ahora en otra rutina que no sea dentro de esta clase, se crea un objeto que instanciara a nuestra clase, y le pasamos el valor para esos parámetros.

Person persona = new Person
{
Nombre = "Juanito",
Apellido = "Maldad"
};

Y listo, ya esta instanciada la clase y además inicializamos sus valores utilizando sus propiedades.


Saludos Sonrisa

Incluir librerías con atajos

Nos ha pasado que de repente estamos trabajando con ciertas clases, y esas clases están en una librería que no hemos importado y que luego ni nos acordamos en cual librería esta contenida. Bueno si a ustedes no, a mi si. Y este atajo es para poder hacer esa importación mas fácil.

Lo primero es escribir el nombre de la clase que vamos a utilizar. y nos da como resultado la imagen que viene abajo, una palabra, subrayada de rojo por que no es reconocida por el compilador, y con un pequeño rectángulo azul al inicio de la palabra.

StringBuilder

Para hacer la importación tenemos 2 opciones, una poner el mouse sobre la palabra y esperar a que salga el menú contextual, o dos presionar las teclas de Ctrl + .   “Control  mas Punto”

StringBuilder2

Voala. y nos aparecerá ese menú contextual donde solo presionamos enter para importar la librería necesaria.

Felices trazos. Guiño

lunes, 28 de febrero de 2011

Atributo Flags en Enumeradores

Primero que nada hay que definir que es un Enumerador con banderas; y tenemos que Microsoft lo define como: “Es un tipo de valor que se representa como una secuencia de bits

Declarando el enumerador con el atributo “Flags” antecediéndolo

En C#


[Flags]
public enum Auto
{
SubCompacto= 1,
Compacto = 2,
Sedan = 4,
Cupe= 8,
CrossOver=16
}

En VB


<Flags()> _
Public Enum Auto
SubCompacto= 1
Compacto = 2
Sedan = 4
Cupe= 8
CrossOver=16
End Enum

Ahora comparamos que dentro de una variable tenga asignado el valor del enumerador


En C#


Auto MyAuto= Auto.Compacto;

if ((MyAuto & Auto.Compacto) == Auto.Compacto)

Esta sentencia “(MyAuto & Auto.Compacto)” quita todos menos Auto.Compacto, y lo evalúa contra el enumerador para saber si lo contiene realmente.


Tambien se tiene un nuevo metodo en .NET 4.0 “HasFlag” whe realiza lo mismo del if mencionado anteriormente


En C#

if ( MyAuto.HasFlag(Auto.Compacto) )

Para asignar mas de un valor de bandera a la variable:

Auto MyAuto= Auto.Sedan | Auto.CrossOver ;

jueves, 20 de enero de 2011

Generar un GUID Secuencial en SQL

Para generar el identificador secuencialmente se usa:

NEWSEQUIENTIALID()

El modo de empleo es igual que newid():

SELECT NEWSEQUIENTIALID()