Tipos de datos en un DataGridView ¿como conservarlos? [Solucionado]

Iniciado por Xavelets, 5 Septiembre 2011, 03:31 AM

0 Miembros y 1 Visitante están viendo este tema.

Xavelets

Hola amigos!!


Escribo esta consulta porque ni siquiera se si el título describe mi duda....

Tengo un formulario con un DataGridView con tres columnas de tipo DataGridViewTextBoxColumn: "cantidad"  "precio_unitario"  e "importe"

a las dos ultimas las he configurado con formato de moneda de tal manera que presentan los numeros precedidos del simbolo $.....

la idea es que:              importe = cantidad * precio_unitario


Mientras asigne valores de tipo float programaticamente a las celdas de dichas columnas, se realiza correctamente la operación deseada.

El problema es cuando desde el formulario cambio el valor de la celda en la columna "precio_unitario" dicho valor pareciera ser un string (en realidad un object), por lo que ya no realiza la operación deseada de forma correcta.

Lo he resuelto momentáneamente usando el evento CellValueChanged y con el siguiente código:

if (datagridview1.Columns[e.ColumnIndex].Name == "precio_u")
{
  int cant = Convert.ToInt32(datagridview1.Rows[e.RowIndex].Cells["cantidad"].Value);

  datagridview1.Rows[e.RowIndex].Cells[e.ColumnIndex].Value = float.Parse(datagridview1.Rows[e.RowIndex].Cells[e.ColumnIndex].Value.ToString());
  datagridview1.Rows[e.RowIndex].Cells[4].Value = cant * float.Parse(datagridview1.Rows[e.RowIndex].Cells["precio_u"].Value.ToString());
}


Como pueden ver primero obtengo el valor contenido en la celda, para converirlo a string, y luego poderlo convertir a float, y de nuevo asignarlo a la misma celda, eso sin contar con el hecho de esas horribles y enormes sentencias jeej  :-[

Esto funciona, si embargo creo que dista mucho de ser la forma más adecuada y eficiente.

¿Alguien conoce una mejor forma de hacer esto?

Les agradeceré mucho sus respuestas

Salu2
"Llegará un día en que un hombre te hablará a miles de kilómetros de distancia, y tu tranquilamente le podrás escuchar donde estés, más no le podrás ver por estar tan lejos." Quinta profecía Maya.

Xavelets

Hola a todos de nuevo!!!

Después de horas de búsqueda infructuosa en la red, y de consultarlo con la almoada creo que di con la solución.

Buscando minuciosamente en las propiedades de la clase DataGridViewCell me encontré con la propiedad ValueType, así que intente el siguiente código:


if (dGV_l.Columns[e.ColumnIndex].Name == "precio_u")
{
   int cant = Convert.ToInt32(dGV_l.Rows[e.RowIndex].Cells["cantidad"].Value);

   dGV_l.Rows[e.RowIndex].Cells[e.ColumnIndex].ValueType = typeof(float);
   dGV_l.Rows[e.RowIndex].Cells["precio_u"].ValueType = typeof(float);

   dGV_l.Rows[e.RowIndex].Cells[4].Value = cant * (float)dGV_l.Rows[e.RowIndex].Cells["precio_u"].Value;
}


Como pueden ver este código parece mas elegante......
la novedad es que a las celdas de "precio_unitario" e "importe" les asigno a su propiedad ValueType el tipo float;  gracias a esto, en la última línea ya puedo hacer un cast simple a float.

Por cierto, todavía mejor es establecer la propiedad ValueType de la columna entera al tiempo de cargar el formulario.

Espero a alguien mas le sirva.

Salu2
"Llegará un día en que un hombre te hablará a miles de kilómetros de distancia, y tu tranquilamente le podrás escuchar donde estés, más no le podrás ver por estar tan lejos." Quinta profecía Maya.