Algoritmo para Palindromas o Capicuas en C#


Primera aproximación: Recorriendo toda la cadena.

            Boolean palindroma = true;
            string str = new string(Console.ReadLine().ToCharArray());
            for (int i=0; i < str.Length; i++)
            {
                if (str[i] != str[str.Length-i-1])
                    palindroma = false;
            }
            Console.WriteLine(palindroma.ToString());

Segunda aproximación: Solo evaluamos la mitad de la cadena

            Boolean palindroma = true;
            string str = new string(Console.ReadLine().ToCharArray());
            for (int i=0; i < str.Length; i++)
            {
                if (str[i] != str[str.Length-i-1])
                    palindroma = false;
            }
            Console.WriteLine(palindroma.ToString());

Tercera aproximación: el bucle corta por falso de palindroma.

            string str = new string(Console.ReadLine().ToCharArray());
            for (int i = 0; i < str.Length / 2; i++)
            {
                if (str[i] != str[str.Length - i - 1])
                    return false;
            }
            return true;

C# comportamiento de ComboBox enlazado a datos


Algo de lo que siempre me olvido cada vez que me pongo a tocar código en C# con VS2008.

Cuando creamos un orígen de datos desde un objeto, para luego arrastrar un ComboBox desde Data Sources hacia el formulario, deberemos setear algunas propiedades de datos enlazados a fin de evitar comportamientos extraños en el combo (por ejemplo: no libera el foco al hacer click o inmediatamente luego de cambiar el valor del combo vuelve al valor anterior).

En propiedades–>DataBindings–>Text dejamos en blanco la propiedad.

En propiedades–>DataBindings–>SelectedItem dejamos en blanco la propiedad.

En propiedades–>DataBindings–>SelectedValue establecemos la propiedad al campo del objeto a enlazar.

 

C#: Añadir ToolTip Text a un botón / Set ToolTip for a Button


Instanciamos un objeto ToolTip y, dentro de un evento MouseHover, establecemos el texto que queremos que aparezca al pasar por arriba del botón:

System.Windows.Forms.ToolTip ToolTip1 = new System.Windows.Forms.ToolTip();

public frmABMC() 
{
    InitializeComponent();
    this.btnCerrar.MouseHover += new EventHandler(btnCerrar_MouseHover);
}

void btnCerrar_MouseHover(object sender, EventArgs e)
{
    ToolTip1.SetToolTip(this.btnCerrar, "Cerrar");
}

Añadir búsqueda en ComboBox / ComboBox Autocomplete


Dado que no es una opción que sea muy intuitiva para el usuario y que muchas veces es necesaria, acá va un ayuda memoria de como configurar la búsqueda o autocompletar cadenas a medida que se escribe dentro de un ComboBox:

Supongamos que ya tenemos cargado un ComboBox con los datos de clientes, debemos configurar, adicionalmente, 3 propiedades que harán posible esta funcionalidad, AutoCompleteCustomSource, AutoCompleteMode, AutoCompleteSource:

AutoCompleteCustomSource

Debemos definir una fuente de datos adicional que contenga todos los strings o cadenas donde se realizará la búsqueda. En este caso, llamamos a un método que nos devuelva todas las razones sociales de los clientes en una lista de strings.

this.clienteComboBox.AutoCompleteCustomSource.AddRange(new Clientes().getListaRazonSocial().ToArray());

AutoCompleteMode

Los modos mas utilizados son suggest y suggestappend, para completado sugerido o suger y añadir.

this.clienteComboBox.AutoCompleteMode = AutoCompleteMode.Suggest;

AutoCompleteSource

Definimos la fuente de datos cargada en el CustomSource.

this.clienteComboBox.AutoCompleteSource = AutoCompleteSource.CustomSource;

El resultado es algo así:

autocompletarComboBox

Vale aclarar que la propiedad DropDownStyle debe establecerse en DropDown en vez de DropDownList.

 

Utilizando parámetros opcionales en Sql Server Stored Procedure


Supongamos que tenemos un programa que realiza una consulta a una base de datos sql server a través de un stored procedure. Ese programa debe pasarle parámetros, o no, en función de las selecciones del usuario.

En otro post, vimos como podemos pasarle parametros null a un stored procedure. Ahora vamos a utilizarlo para armar una consulta de acuerdo a criterios variables:

CREATE procedure [dbo].[ConsultaPorCriterios]
@idProvincia int,
@superficieMin float,
@superficieMax float,
@dni as varchar(10)
AS

select   idProvincia
        , superficie
        , dni
from tablita
where    (idPersona = @idPersona or @idPersona is null) and
         ((superficie between @superficieMin and @superficieMax) or @superficieMax is null) and
         (dni = @dni or @dni is null)

Pasando parametros null a Sql Server


Aquí un pequeño ejemplo de como pasar parámetros null con C# a un stored procedure en sql server:

        public DataTable Consulta(int? id)
        {
            string[] NomParam = new string[] { "id"};
            object[] arg = new object[] { id == null ? System.Data.SqlTypes.SqlInt32.Null : Int32.Parse(id.ToString()) };

            return conn.execSP("spConsula", arg, NomParam);
        }

El parámetro debe declararse con el simbolo “?” que le indica al compilador que puede venir un null en vez de un int. Luego, el tipo de datos es convertido a su equivalente nulo para sql server, de manera que interprete que es un parámetro con valor null y no que falta un parámetro.

 

problema de click doble en textbox enlazado a datos / must click twice to edit textbox


Algo que me ha pasado en C# NET, trabajando con controles enlazados es que teniendo un combo box enlazado a datos y con su contenido cargado, si hago un click sobre cualquier textbox del mismo formulario sin tocar el combo, accedo a completar texto en dicho control sin problemas.

Pero… si antes selecciono un valor del combo box, al querer cargar luego un texto en el textbox, debo hacer dos clicks en el textbox para poder cargar.

No les ha pasado nunca ?

Bueno, la unica solución que le encontré a este problema es colocar un evento SelectedIndexChanged en el combobox, y en ese evento colocar una llamada a cambiar el foco al control textbox cada vez que se cambia el indice del combobox.

La pérdida del foco en el combobox, equivaldría al primer click. Con lo que al hacer un click en el textbox obtengo un comportamiento normal.

Que enrosque no? supongo que solo me entenderá el que alguna vez se topó con esto.

Si le encuentran alguna otra solución me avisan !

Configuración Regional y de Idioma en SQL Server


Después de luchar un par de horas con la configuración de un servidor de base de datos sql server, dejo este pequeño recordatorio sobre la configuración necesaria para no tener inconvenietes al grabar fechas desde una aplicación desarrollada en C# .NET

Las fechas, tienen el formato Español – Argentina: dd/mm/aaaa con la hora seteada en HH:mm:ss (sin el am o pm)

Es muy común obtener un error como este al intentar grabar una fecha:

The conversion of a varchar data type to a datetime data type resulted in an out-of-range value.

Para evitar estos inconvenientes, verificar lo siguiente:

1) En el servidor, utilizando el SQL Server Management Studio, vamos a Seguridad –> Inicios de Sesión y verificamos que el usuario con que estamos conectando a la base de datos, tenga como idioma predeterminado spanish.

2) En el servidor, donde se aloja la base de datos, configuramos en Panel de Control –> Configuración Regional y de Idioma: Español – > Argentina

2) En la maquina cliente, configuramos en Panel de Control –> Configuración Regional y de Idioma: Español – > Argentina

3) Verifiquemos que la cadena de conexión de nuestra aplicación utilice ese usuario.

Crear reportes rápidos con Crystal Reports en Visual Studio Net


Un recordatorio para algo de uso frecuente: Como crear reportes enlazados rapidamente a través de un xml que contenga la estructura de los campos a imprimir.

Asumo que tenemos cargado un dataset ds con una tabla llamada Table1 con los datos que queremos imprimir.

Por otro lado, lo que debemos hacer es crear un formulario (llamarlo por ejemplo FrmReportes) y colocarle un control CrystalReportViewer. A este control le ponemos como nombre CrvReportes.

En dicho formulario creamos una sobrecarga sobre el constructor para pasarle el reporte como parámetro:

public FrmReportes(CrystalDecisions.CrystalReports.Engine.ReportDocument Reporte)
  {
     InitializeComponent();
     this.CrvReportes.ReportSource = Reporte;
     this.CrvReportes.Show();
     this.ShowDialog();
  }

Ahora bien, para generar el reporte, debemos primero generar el xml con la estructura de los campos a imprimir:

 DataSet ds = new DataSet();
 ds.Tables.Add (controlador.GetAllDt()); //ejemplo de carga del dataset
 ds.WriteXml(@"c:temprepo.xml", ,XmlWriteMode.WriteSchema);  //el path debe tener permisos de scritura

Una vez generado el xml y almacenado en algún lugar del disco con permisos de escritura, vamos en el menú de Visual Studio a Project –> Add Component (Proyecto –> Añadir Componente) y agregamos el componente Crystal Report colocandole como nombre, por ejemplo RptReporte.rpt

Seleccionamos tipo de reporte “Reporte en Blanco” y luego, en el menú del explorador de campos, buscaremos la opción Crear nueva conexión –> Archivos de Base de Datos y nos permitirá seleccionar el archivo repo.xml creado anteriormente.

De esta manera podremos seleccionar de Table1 los campos de nuestro dataset a agregar al reporte.

Solo nos queda pendiente llamar al formulario contenedor del reporte pasandole como parametro el reporte:

CrystalDecisions.CrystalReports.Engine.ReportDocument mirepo;
mirepo = new RptReporte();
//asignamos el dataset para que actualice los datos:
mirepo.Database.Tables["Table1"].SetDataSource(ds);
//llamamos al contenedor
FrmReportes FrmRepor = new FrmReportes(mirepo);

Ojo: Es importante definir la estructura de página del reporte para impresoras genericas, a fin de que no genere problemas al imprimir en distintos modelos de impresora.
Esto lo hacemos haciendo click derecho sobre una sección o sobre el fondo del reporte –> Design –> Printer Setup –> Tildamos “No Printer”.
Allí mismo podemos predeterminar si la página va apaisada o no.