Electrónica a Martillazos, actualización de la sección de VB6 y C++:
Creando una DLL en Visual C++ 2010 y Usándola en una Aplicación en C#.
Link directo
Un mirror
:D
Códigos de ejemplo para aprender distintas tecnologías, o lo que sucede cuando a una cuarentona se la deja sola con una computadora
Acerca de:
Este blog contiene los códigos, ejemplos y bases de datos que he usado cuando aprendía acerca de algún tema específico. En lugar de borrarlos (una vez dominado ya el tema), he decidido publicarlos :)
lunes, 21 de enero de 2013
martes, 15 de enero de 2013
El Control DataGridView lanza una System.ArgumentOutOfRangeException al recorrer sus filas
Tengo un DataGridView llamado dGridVIew al cual le añado datos de la siguiente manera:
DataRow[] dRow = MetodoQueDevuelveUnArrayDeDataRows();
object[] param = new object[3];
for (int i = 0; i < dRow.Count(); i++)
{
param[0] = dRow[i]["Campo 1"];
param[1] = dRow[i]["Campo 2"];
param[2] = dRow[i]["Campo 3"];
// Evito una excepción al hacer click en las cabeceras y si alguna celda tiene valor nulo
for (int j = 0; j < param.Length; j++)
if (param[j] == DBNull.Value)
param[j] = String.Empty;
dGridView.Rows.Add(param);
}
Todo bien hasta aquí. Pero sucedía que después de llamar a este código, en el control dGridView no se mostraban todas las filas añadidas, a menos que redimensionada el formulario contenedor. Peor aún, al recorrer las filas con las teclas de las flechas hacia arriba o abajo, me saltaba la siguiente excepción:
No se controló System.ArgumentOutOfRangeException
Message=El valor de '484' no es válido para 'Value'. 'Value' debería estar entre 'minimum' y 'maximum'.
Nombre del parámetro: Value
Source=System.Windows.Forms
ParamName=Value
StackTrace:
en System.Windows.Forms.ScrollBar.set_Value(Int32 value)
en System.Windows.Forms.DataGridView.ScrollRows(Int32 rowCount, Int32 deltaY, ScrollEventType scrollEventType)
Rebuscando en Internet, este blog me dio la solución.
Y era muy simple: Después de llenar el DataGridView se debe llamar al método PerformLayout de la siguiente manera:
dGridView.PerformLayout();
No he podido encontrar porqué esta función evita la excepción, ni siquiera en la web de Microsoft.
Update!!
El código de ejemplo aún tiene un error: el DataGridView dGridView aún puede tirar una excepción si hacemos clic a la cabecera de una columna que espera recibir datos numéricos. El código corregido es:
DataRow[] dRow = MetodoQueDevuelveUnArrayDeDataRows();
object[] param = new object[3];
// Los valores del sgte array deben coincidir con los nombres de las columnas
string[] columnas = { "Campo 1", "Campo 2", "Campo 3" };
for (int i = 0; i < dRow.Count(); i++)
{
param[0] = dRow[i]["Campo 1"];
param[1] = dRow[i]["Campo 2"];
param[2] = dRow[i]["Campo 3"];
// Evito una excepción al hacer click en las cabeceras y si alguna celda tiene valor nulo
for (int j = 0; j < param.Length; j++)
if (param[j] == DBNull.Value)
{
// en el caso de trabajar directamente con un Datatable la sgte línea se reemplaza por:
// if (unDataTable.Columns[columnas[j]].DataType == typeof(string))
if (dRow[i].Table.Columns[columnas[j]].DataType == typeof(string))
param[j] = String.Empty;
else
param[j] = 0;
}
dGridView.Rows.Add(param);
}
dGridView.PerformLayout();
DataRow[] dRow = MetodoQueDevuelveUnArrayDeDataRows();
object[] param = new object[3];
for (int i = 0; i < dRow.Count(); i++)
{
param[0] = dRow[i]["Campo 1"];
param[1] = dRow[i]["Campo 2"];
param[2] = dRow[i]["Campo 3"];
// Evito una excepción al hacer click en las cabeceras y si alguna celda tiene valor nulo
for (int j = 0; j < param.Length; j++)
if (param[j] == DBNull.Value)
param[j] = String.Empty;
dGridView.Rows.Add(param);
}
Todo bien hasta aquí. Pero sucedía que después de llamar a este código, en el control dGridView no se mostraban todas las filas añadidas, a menos que redimensionada el formulario contenedor. Peor aún, al recorrer las filas con las teclas de las flechas hacia arriba o abajo, me saltaba la siguiente excepción:
No se controló System.ArgumentOutOfRangeException
Message=El valor de '484' no es válido para 'Value'. 'Value' debería estar entre 'minimum' y 'maximum'.
Nombre del parámetro: Value
Source=System.Windows.Forms
ParamName=Value
StackTrace:
en System.Windows.Forms.ScrollBar.set_Value(Int32 value)
en System.Windows.Forms.DataGridView.ScrollRows(Int32 rowCount, Int32 deltaY, ScrollEventType scrollEventType)
Rebuscando en Internet, este blog me dio la solución.
Y era muy simple: Después de llenar el DataGridView se debe llamar al método PerformLayout de la siguiente manera:
dGridView.PerformLayout();
No he podido encontrar porqué esta función evita la excepción, ni siquiera en la web de Microsoft.
Update!!
El código de ejemplo aún tiene un error: el DataGridView dGridView aún puede tirar una excepción si hacemos clic a la cabecera de una columna que espera recibir datos numéricos. El código corregido es:
DataRow[] dRow = MetodoQueDevuelveUnArrayDeDataRows();
object[] param = new object[3];
// Los valores del sgte array deben coincidir con los nombres de las columnas
string[] columnas = { "Campo 1", "Campo 2", "Campo 3" };
for (int i = 0; i < dRow.Count(); i++)
{
param[0] = dRow[i]["Campo 1"];
param[1] = dRow[i]["Campo 2"];
param[2] = dRow[i]["Campo 3"];
// Evito una excepción al hacer click en las cabeceras y si alguna celda tiene valor nulo
for (int j = 0; j < param.Length; j++)
if (param[j] == DBNull.Value)
{
// en el caso de trabajar directamente con un Datatable la sgte línea se reemplaza por:
// if (unDataTable.Columns[columnas[j]].DataType == typeof(string))
if (dRow[i].Table.Columns[columnas[j]].DataType == typeof(string))
param[j] = String.Empty;
else
param[j] = 0;
}
dGridView.Rows.Add(param);
}
dGridView.PerformLayout();
lunes, 14 de enero de 2013
C#: Propiedad Select de un Datatable. Un par de Detalles.
Tengo un Datatable llamado "DT" que contiene muchos datos organizados en dos campos: "Campo1" y Campo 2". Quiero filtrar aquellos datos que contengan valores nulos en "Campo1" y en "Campo 2".
El código fuente será:
DataRow[] dRow = DT.Select("Campo1 is Null and [Campo 2] is Null");
Para detectar campos con valores nulos, le mandamos una consulta con "is Null". Como "Campo 2" tiene un espacio en blanco, lo pongo entre corchetes.
Si tengo este método:
DataRow[] Method1(string filtro)
{
Datatable DT = metodoQueDevuelveUnDatatable();
return DT.Select(filtro);
}
lo llamaré así:
DataRow[] dRow = Method1("Campo1 is Null and [Campo 2] is Null");
¿Pero cómo hago si deseo que Method1 me devuelva todas las filas de DT, sin aplicar ningún filtro?
Escribo lo siguiente:
DataRow[] dRow = Method1(String.Empty);
Enviar un String.Empty a la propiedad Select de un Datatable es una forma de decirle que no queremos filtrar nada y también de eliminar cualquier filtro aplicado con anterioridad.
El código fuente será:
DataRow[] dRow = DT.Select("Campo1 is Null and [Campo 2] is Null");
Para detectar campos con valores nulos, le mandamos una consulta con "is Null". Como "Campo 2" tiene un espacio en blanco, lo pongo entre corchetes.
Si tengo este método:
DataRow[] Method1(string filtro)
{
Datatable DT = metodoQueDevuelveUnDatatable();
return DT.Select(filtro);
}
lo llamaré así:
DataRow[] dRow = Method1("Campo1 is Null and [Campo 2] is Null");
¿Pero cómo hago si deseo que Method1 me devuelva todas las filas de DT, sin aplicar ningún filtro?
Escribo lo siguiente:
DataRow[] dRow = Method1(String.Empty);
Enviar un String.Empty a la propiedad Select de un Datatable es una forma de decirle que no queremos filtrar nada y también de eliminar cualquier filtro aplicado con anterioridad.
Suscribirse a:
Entradas (Atom)