lunes, 13 de diciembre de 2010

SqlServerCe no insert desde c#

Si tenes problemas insertando datos o que los datos se insertan, pero al cerrar la conexion no se salvan, podes solucionarlo poniendo en la conexion a la base un path absoluto.No es la mejor solucion, pero funciona.

martes, 28 de septiembre de 2010

Enviar mails de forma simple con .net

Es necesario poner el namepace
using System.Net.Mail;


Luego es muy simple la manera de enviar el correo:

MailMessage mm = new MailMessage(direccionDesde, destinatario);
mm.Subject = motivo;
mm.Body = cuerpoMail;
mm.IsBodyHtml = false;
SmtpClient smtp=new SmtpClient();
smtp.Send(mm);

viernes, 6 de agosto de 2010

Para poder cambiar el tamaño de la imagen, primero creo una nueva al tamaño al que queremos hacerlo (en este caso 100 pixels por 100 pixels), luego creando el objeto Graphics a partir de la imagen anterior, y "escribiendo" a la imagen nueva la imagen resizeada.

Bitmap imagenNueva = new Bitmap( 100, 100 );
using( Graphics g = Graphics.FromImage( (Image) imagenVieja ) )
g.DrawImage( imagenNueva, 0, 0, 100, 100 );

martes, 3 de agosto de 2010

Detectar emails con Expresiones regulares en C#

La forma de detectar varios emails con expresiones regulares es una tarea facil, una vez que se sabe que patron usar.
Una vez corrido el proceso, se generan los terminos encontrados, que pueden ser recorridos uno por uno con un for each.

List output = new List();
string pattern = @"(([^<>()[\]\\.,;:\s@\""]+"
+ @"(\.[^<>()[\]\\.,;:\s@\""]+)*)|(\"".+\""))@"
+ @"((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}"
+ @"\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+"
+ @"[a-zA-Z]{2,}))";

Regex emailregex = new Regex(pattern);
MatchCollection matches = emailregex.Matches(source);
foreach (Match item in matches)
{
if (item.Success)
{
if(!output.Contains(item.Value.ToLower()))
output.Add(item.Value.ToLower());
}
}

viernes, 11 de junio de 2010

Crear Objetos dinamicamente

Hay dos formas de crear de forma dinámica un objeto "on the fly".
Estas formas de implementar patterns de "factory" usan siempre reflection de .net.
Incluir:
using System.Reflection;

Lo esencial quizas es que todos los objetos que creemos tengan una clase Base comun, para poder asignarselos y luego poder castearlos a la clase que queremos.

Type tipoObjeto = typeof(ClaseaInstanciar)
ClaseBase c = (ClaseBase)Assembly.GetExecutingAssembly().CreateInstance(tipoObjeto.FullName);

Otra forma es (aparentemente mas lenta):
string strClase = "NombreDeClaseACrear";
Type tipoClase = Type.GetType(strClase);
ClaseBase c = (ClaseBase) t.InvokeMember("ctor", BindingFlags.CreateInstance, null, null, null);


---------------------------------------

Ejemplo Concreto:

class Persona
{
string nombre="";
}
class Trabajador : Persona
{
string IDTrabajador = "";
}


private void llamada()
{
Type tipoObjeto = typeof(Trabajador);
Persona c = (Persona)Assembly.GetExecutingAssembly().CreateInstance(tipoObjeto.FullName);
}


viernes, 4 de junio de 2010

Obtener la tangente en grados en .net

El angulo que devuelven las funciones trigonometricas de .net es en radianes, por lo cual hay que transformar esto a grados si es eso lo que se desea.
La forma es asi:

double phi = 0; //angulo en radianes;
phi = Math.Atan2(y , x);
angulo = phi * (180.0 / Math.PI);

viernes, 14 de mayo de 2010

Borrar multiples archivos en c#

Para borrar muchos archivos con el uso de comodines (por ejemplo *) se debe seleccionar primero en ese directorio todos los que cumplan con esa condición y luego recorrerlos borrándolos uno por uno.
No existen comodines en el metodo Delete para borrar archivos.

dim path as string ="C:\"
For Each archivo As String In Directory.GetFiles(path, "out*.tmp")
File.Delete(archivo)
Next

Disparar un beep en .net

Actualmente se puede desde .net (vb.net o c#) reproducir facilmente un beep, ya sea desde una aplicación de consola o de forms.
En el namespace de sistema System.Media podemos encontrar La clase SystemSounds que nos deja acceder a este tipo de recursos de sonido, la forma es la siguiente:

System.Media.SystemSounds.Beep.Play();

Tambien se puede acceder a otros sonidos del sistema como de errores o información, etc.

martes, 13 de abril de 2010

Ajax no anda en chrome o safari

Visual Studio parece generar siempre paginas que andan en internet explorer, pero que tienen varios(o muchos) problemas en otros browsers.
Es el caso de Google Chrome por ejemplo. En .net 3.5 con los controles del ajaxControlToolkit tengo problemas de carga de extenders, scripts que no se cargan, asi que encontre esta solución.
En vez de usar el viejo ScriptManager se usa el nuevo que viene con el AjaxControlToolkit: ToolkitScriptManager

Por ejemplo asi:



<ajax:toolkitscriptmanager id="scripts" runat="server" scriptmode="Release" enablehistory="true" EnableSecureHistoryState="false" EnablePageMethods="True" CombineScripts="true" >
<Scripts>
<asp:ScriptReference Path="~/chrome.js" />
</Scripts>
</ajax:ToolkitScriptManager>

crear un archivo chrome.js y llenarlo con:
Sys.Browser.WebKit = {}; //Safari 3 is considered WebKit
if (navigator.userAgent.indexOf('WebKit/') > -1) {
Sys.Browser.agent = Sys.Browser.WebKit;
Sys.Browser.version = parseFloat(navigator.userAgent.match(/WebKit\/(\d+(\.\d+)?)/)[1]);
Sys.Browser.name = 'WebKit';
}


Visual Studio 2008 no reconoce las paginas aspx

Puede que Visual Studio 2008 deje de reconocer las paginas aspx (markups, formatos, sintaxis t coloreo) y otro tipo de paginas tambien. Ocurre de un dia para el otro y no hay forma de desinstalar e instalar y que funcione.
Para esto encontre una solucion muy simple, hay que abrir el "Visual Studio 2008 command prompt" y correr lo siguiente:
devenv.exe /ResetSkipPkgs

Esto resetea parametros del entorno y todo comienza a andar normalmente desde ese momento (al menos hasta ahora...)

lunes, 12 de abril de 2010

Reproducir sonidos o wav en .net

En C# o vb.net es muy simple reproducir sonidos gracias a la inclusion del sound player, una vez definido se le especifica que sonido tiene que cargar (con el nombre de archivo en disco) y luego simplemente dandole "Play" lo reproduce:


System.Media.SoundPlayer player = new System.Media.SoundPlayer();
player.SoundLocation = @"c:\sonidos\sonido.wav";
player.Play();

definir cosas que se ejecutan solo en debug en C#

Cuando uno quiere que ciertas cosas se ejecuten o se vean cuando se debugea, o al reves, cuando se ejecuta en release, tiene que usar directivas de preprocesador, definiendo variables. Hay una que ya esta definida por default, esta es DEBUG (está en true en modo debug, false en release).

Entonces podemos hacer esto:

#if DEBUG
Console.WriteLine("Estoy en debug");
Control1.Visible=true;
#else
Console.WriteLine("Estoy en Release");
Control1.Visible=false;
#endif

domingo, 11 de abril de 2010

Ocultar y mostrar cursor o puntero del mouse c#

Para ocultar el puntero del ratón se debe llamar al objeto Cursor, este tiene varios metodos pero el que vamos a usar es el hide, asi:

Cursor.Hide();

Si deseamos hacer aparecer o mostrar el mouse nuevamente, haremos:

Cursor.Show();


domingo, 28 de marzo de 2010

DoEvents en C#

El equivalente a DoEvents del viejo vb6 es el mismo en c#, pero escondido, es decir, no es una función global, lo accederemos asi:

Application.DoEvents();

Si tenes que acceder desde una clase, debes poner esto:
System.Windows.Forms.Application.DoEvents();

lunes, 22 de marzo de 2010

Javascript: Como llamar una funcion con una string

Si queremos llamar a una función de javascript contando con una cadena de texto, pasandole parámetros, etc, lo que tenemos que hacer es "evaluar" esa expresión. Esto nos permitirá correr cualquier pedazo de código que querramos en tiempo de ejecución (por ejemplo código dinámico).
Esto tiene el problema que no se compila, ni sabremos de sus errores hasta el momento que lo corramos.

Ejemplo:



Aqui se puede observar que llamamos a nombreFuncion con 3 parametros, dos de ellos estáticos y uno dinámico. El primero un boolena "true", el segundo es el parámetro dinámico, y el tercero es un número.
Por último, si esta función devuelve valor, lo hará en la variable "ret"

martes, 16 de marzo de 2010

Codificar url o texto online

Desde esta dirección se baja una página html que codifica o decodifica rápidamente el texto que queremos tratar:

http://sites.google.com/site/netzreport2/online_tool_for_url_en_decoding.html

Casi abajo de todo hay una caja de texto que dice "URL decoded text", ingresamos nuestro texto, y debajo hacemos click en Encode si deseamos codificar nuestra cadena o Decode si deseamos decodificarla.

Codificar datos complejos para pasarlos por url

Si queremos codificar (u encodear) una cadena (string) o url para pasarla como parámetro de otra url, a través de un navegador hacia el servidor, tenemos que hacer lo siguiente:

Dim url As String
url = "http://www.abc.com/pagina.aspx?direccion=" & Server.UrlEncode("pepe.aspx?eee=1")


Este ejemplo nos permite ver como se puede codificar una dirección a otra página, pasarla por un parámetro y que la reciba una página en el servidor para poder redireccionar (con response.Redirect por ejemplo) el navegador hacia allí.

jueves, 4 de marzo de 2010

Reemplazar sin importar el casing o si es mayuscula o minuscula

Por alguna razon estas funciones no estan en la clase string como deberian. Pero, de todas formas estan en algun lugar del framework, esto es la clase "Strings" de .net.
Si utilizamos la funcion replace de ahi tendremos que pasar primero la string con la cual queremos trabajar, luego lo que queremos encontrar, y como tercero que es lo que queremos poner. Hay dos parámetros que indican desde que indice hasta cuanta cantidad de caracteres considerará el replace.
Por último, y lo mas importante, es el parámetro que indica que esto es texto, es decir, no le hace caso a mayusculas/minusculas.

Ejemplo:
dim strDestino as string = Strings.Replace(strOrigen, strQueReemplazar, strPorQueReemplazarlo, 0, , CompareMethod.Text)

miércoles, 3 de marzo de 2010

El tipo o espacio de nombre profilecommon no se encuentra

Este error sucede muchas veces cuando se borro accidentalmente o se cambio el web.config. Es decir, no se declaro la sección que define el profilecommon.
Me he encontrado con esto las veces que hago una migración o cambio una pagina a otro proyecto, o hago uno nuevo sin copiar los archivos necesarios.

Esto es fácil de solucionar, solo agregando la sección del web.config que falta, es decir la "profile" debajo de "system.web".
Puede hacerse de la siguiente manera:

<profile>
<properties>
<add name="email">
<add name="direccion">
</properties>
</profile>

lunes, 22 de febrero de 2010

Abrir archivo en asp.net

Para devolver un archivo cualquiera en asp.net, primero se deben borrar los contenidos de cabeceras y contenido en general. Luego poner el tipo de contenido mime (text/html, text/plain, etc). Y luego simplemente escribir el archivo a la salida de la página:

dim fullPath as string = "C:\temp\a.xls"
Response.ClearHeaders()
Response.ClearContent()
Response.ContentType = "application/vnd.ms-excel"
Response.AddHeader("Content-Disposition", "attachment;filename=" + filename)
Response.WriteFile(fullPath)
Response.Flush()
Response.End()

Como obtener el path temporal en .Net


Los directorios temporales son buenos para guardar registros simples durante la ejecución de un programa. Puede ser una operación de nuestro programa, como una descompresión o un archivo de salida que solo servirá por un tiempo y luego se podrá borrar.

La ubcación del archivo temporal variará de sistema operativo a otros, por eso usamos este pequeño código para obtener el path temporal.

string sDir = System.IO.Path.GetTempPath();

Console.WriteLine("Path temporario = " + sDir );


validar email con expresiones regulares

Para validar con javascript un mail mediante expresiones regulares tenemos que crear un patrón de la expresión y luego testearlo contra la cadena dada (que debe provenir del control que contiene la dirección de email):

function
validateEmail(elementValue){
var emailPattern = /^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$/;
return emailPattern.test(elementValue);
}

miércoles, 17 de febrero de 2010

Cannot create/shadow copy '#webname#' when that file already exists

Para corregir este error lo único que se puede hacer es un rebuild de todo el sitio, volver a cargar el sitio.
Si esto no funcionará tratar de nuevo, en general funciona correctamente.

Login failed for user 'user1'. The user is not associated with a trusted SQL Server connection

Este mensaje indica que SQL Server no permite el acceso a este usuario, porque está en modo de Autenticacion Windows, Hay que cambiar el modo a "mixto". Se hace de la siguiente manera:

  • Ir a propiedades del server
  • Ir a Seguridad
  • En la seccion Autenticación del Server hay que seleccionar "Modo de autenticacion de SQL Server y Windows" (que es el modo mixto que permite los dos modos)

Hacer invisible una tabla HTML

Hacer una funcion en javascript que haga lo siguiente y llamarla pasandole en checked true o false:
function hideOptions(var checked){

if(checked)
hide='none';
else
hide='';

var obj=document.getElementById('HTMLTableID');
obj.style.display = hide;
}

Como usar el ProfileCommon desde App_Code

Para usar el profileCommon desde una clase en app_code, que nos permite acceder a datos de usuarios, crearlos, etc, se puede acceder de esta manera:

ProfileCommon p = (ProfileCommon)ProfileBase.Create(tmp_username,true);

Este es un metodo estático, que crea una versión mas genérica del profile, profileBase, por eso hay que castearla a ProfileCommon.

martes, 16 de febrero de 2010

Poner un elemento u objeto invisible en javascript

Para ocultar un objeto seteamos el elemento visibility del estilo en hidden o en blanco para hacerlo visible:
var obj=document.getElementById('IdObjeto');
obj.style.visibility = hide;

SQL: cuantos registros fueron afectados?

Si uno desea saber en un sql, stored procedure, etc cuantos fueron los registros afectados por la ultima operacion, debe hacer:

SELECT @@ROWCOUNT

Por ejemplo para insertar un registro si no se pudo hacer la actualización (pseudocodigo):

UPDATE tabla con registro=ID
IF @@ROWCOUNT=0
BEGIN
INSERT tabla mismo registro
END

MSSQL Reemplazar

En microsoft SQL (MsSQL) la forma de reemplazar un texto en un campo es de la siguiente manera:
REPLACE ( expresion , cosa_a_reemplazar , reemplazo)

por ejemplo:
PRINT REPLACE ( 'Hola blabla tal?' , 'blabla' , 'que')

Lo que daria como resultado: 'Hola que tal?'

lunes, 15 de febrero de 2010

Editar y seguir corriendo

Esto solo anda con el web server itnerno de VS, no con IIS.
Para hacer andar el comando "Edit and Continue" en Visual Studio asp.net hay que hacer dos cosas que estan no tan a la vista.
Por un lado en Herramientas / Opciones / Depuración (Si no lo encuentra ir debajo y chequear mostrar todas las opciones) y ahi encontrará en Edit and Continue y chequear "habilitar".

Luego en las propiedades del proyecto en Web, habilitar edit and continue también.

Y asi deberia andar.

jueves, 11 de febrero de 2010

errores corriendo aplicaciones en drives de red

Errores tales como:
"Project location is not trust", "No se confia en la ubicacion del proyecto", "No se pueden obtener los permisos necesarios" etc, significan que .net no puede tomar permisos en el caso de una ubicacion de red.
Si agregamos la ubicacion de red como un disco de Red (Z: en la mayoria de los casos), este disco es como si fuera de la maquina, para darle acceso debemos correr desde una ventana de comando de las que vienen en el grupo de inicio de visual studio, con permisos de administrador :

c:\>caspol -q -machine -addgroup 1 -url file://z:/* FullTrust -name "Z Drive"

Una vez hecho esto se le dará permisos fulltrust a cualquier codigo en ese disco, asi que tenga cuidado.

Creando una nueva planilla en excel desde c#


using (OleDbConnection conn = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\dummy.xls;Extended Properties='Excel 8.0;HDR=Yes'"))
{
conn.Open();
OleDbCommand cmd = new OleDbCommand("CREATE TABLE [Sheet1] ([Col1] string, [Col2] string)", conn);
cmd.ExecuteNonQuery();
}

lunes, 8 de febrero de 2010

encodear url en forms

Para codificar una string como url en forms de c# hay que agregar una referencia a System.Web (boton derecho sobre el proyecto, Agregar referencia, y luego seleccionar System.web)

Luego llamar al metodo estatico asi:

string url = HttpUtility.UrlEncode(cadena);