2011-03-04 7 views
5

Tenemos una columna vinculada a un valor entero sql que puede contener nulos. Cuando el usuario intenta "borrar" la celda en el DataGrid, obtenemos el error de validación¿Cómo se borra una celda (para que tenga valor NULL) en (WPF) DataGrid?

"... no se pudo convertir".

¿Cómo puedo hacer que quede vacío y vincular un valor "nulo" a la columna subyacente?

He buscado este problema en Google durante 2 días y he encontrado algo. Traté de editar mi comentario HCL, pero nunca se guardará.

Estoy familiarizado con IValueConverters. Escribí uno para manejar nuestros porcentajes (por lo que el usuario puede ingresar "50%" y se convierte a ".5"). Estoy tratando de hacer algo muy similar, pero cuando el valor vuelve como Null (escribí un dummy IValueConterter para depurarlo), solo quiero que se guarde en la base de datos como Null. Tal vez solo necesito configurarlo en DBNullValue? Parece mucho trabajo para algo que creo que podría tener una propiedad incorporada. He intentado utilizar la propiedad TargetNullValue en la columna (DataGridBoundColumn) y establecer que a DBNull.Value, pero no cambiar el valor (en base a mi maniquí IValueConverter todavía está entrando como regular (cadena) NULL.

I simplemente quiere ser capaz de guardar un valor nulo a la base de datos para esta columna (tipo entero).

** ** Última actualización

Buen punto HCL, se me olvida que todo el mundo no se ADO veces

Estoy vinculado a una tabla SQL. La columna en cuestión es int que permite NULL s.

Las columnas se crean usando AutoGeneratingColumn, por lo que básicamente las conecta "automágicamente" (se aplican ciertos estilos como Right Justify en este método, pero no para esta columna). Toma este enfoque, porque la aplicación es prácticamente un reemplazo de "Acceso". Nuestro CIO ordenó que elimináramos Access de los usuarios, por lo que esta fue la solución (crear nuestro propio MS Access). De todos modos, dado que puede abrir cualquier tabla (y crear tablas, columnas, etc.) simplemente "Autogenera" las columnas según la tabla que se abrió. Aunque, dado que hay ciertas columnas que la aplicación conoce inherentemente, como Discount_Pct, cuando encuentra una de esas columnas, sí hace algunas "cosas especiales" (como asignar el IValueConverter que describí anteriormente). Aunque, como dije ... para esta columna en particular, no se le hace nada "especial". Es solo un entero de SQL regular (nulable) que es "Autogenerado".

+0

¿Podemos ver el código de validación? – SQLMason

+0

No hay ninguno. Es una bonita rejilla vainilla. – Shayne

Respuesta

6

me acaba de encontrar la propiedad que estaba buscando !!

TargetNullValue

Este post lo explica: HERE

El problema es que estas columnas se generan utilizando "AutoGenerateColumns" (debido a que la fuente de datos ... una tabla de SQL ... es "dinámica"). Si pudiera averiguar cómo obtener el tipo de columna de tabla (primitiva), ya sé cómo ver si es Nullable, entonces puedo establecer este valor para esa columna. (Todavía no entiendo por qué AutoGenerateColumns no maneja esto automáticamente !!)

+0

Sé cómo obtener el tipo ... se pasa al manejador AutoGenerateColumn como "e.PropertyType". El problema es que no es realmente el "tipo" ... No puede contener nulos, pero la columna de la base de datos ES NULABLE. Entonces, voy a tener que codificar esto por Nombre de columna. :( – Shayne

1

Decidí tomar la ruta IValueConverter para este campo también.

Esto es lo que escribí (y funciona, todavía me siento como que debe haber una manera más fácil lol!):

[ValueConversion(typeof(Int32), typeof(String))] 
    public class IntDBNullConverter : IValueConverter 
    { 
     public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
     { 
      if (value == null) 
       return ""; 
      else if (DBNull.Value.Equals(value)) 
       return ""; 
      else 
       return value.ToString(); 
     } 

     public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
     { 
      string str = value as string; 
      if (String.IsNullOrEmpty(str)) 
       return DBNull.Value; // returns DBNull.Value 

      Int32 result = 0; 

      Int32.TryParse(str, out result); 

      return result; 
     } 
    } 
3

Al extenderme la respuesta de Shayne, descubrí que la propiedad TargetNullValue está disponible en los objetos DataGridBoundColumn. Puede usar la lógica adicional descrita from this comment para hacer este condicional. Por desgracia, ese puesto no explica cómo relacionar su lógica a una cuadrícula de datos, así que aquí está mi solución:

<DataGrid AutoGenerateColumns="True" AutoGeneratingColumn="m_grid_AutoGeneratingColumn"/> 

Y ...

public void m_grid_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e) 
{ 
    // Make all columns nullable 
    ((DataGridBoundColumn)e.Column).Binding.TargetNullValue = string.Empty; 
} 

yo estaba tan frustrado con este problema. Espero que esto ayude a alguien.

+1

Gracias, aunque el problema que tengo es que mi DataGridTextColumn no tomará TargetNullValue - VS dice que no está en el esquema cuando intento . AH! No importa, lo encontré, tiene que ser: Dronz

Cuestiones relacionadas