2011-03-04 3 views
5

Abbiamo una colonna associata a un valore intero SQL che è annullabile. Quando l'utente tenta di "cancellare" la cella nello DataGrid, viene visualizzato l'errore di convalidaCome si cancella una cella (quindi ottiene il valore NULL) in DataGrid (WPF)?

"... non può essere convertito".

Come posso renderlo vuoto e associare un valore "null" alla colonna sottostante?

Ho cercato su Google questo problema per 2 giorni e ho trovato qualcosa. Ho provato a modificare il mio commento su di te HCL, ma non avrebbe mai salvato.

Conosco lo IValueConverters. Ne ho scritto uno per gestire le nostre percentuali (quindi l'utente può inserire "50%" e viene convertito in ".5"). Sto cercando di fare qualcosa di molto simile, ma quando il valore ritorna come (ho scritto un dummy IValueConterter per eseguirne il debug), voglio solo che venga salvato nel database come Null. Forse ho solo bisogno di impostarlo su DBNullValue? Sembra solo un sacco di lavoro per qualcosa che penso possa avere una proprietà incorporata. Ho provato ad utilizzare la proprietà TargetNullValue sulla colonna (DataGridBoundColumn) e l'impostazione che a DBNull.Value, ma non ha cambiato il valore (in base alla mia manichino IValueConverter è ancora venuta in come un normale (stringa) NULL.

I semplicemente vuole essere in grado di salvare un valore nullo al database per questa colonna (tipo integer).

** ** Ultima aggiunta

Buon punto HCL, non ricordo che il mondo intero non è ADO volte

Sono vincolante per una tabella SQL. La colonna in questione è un int che consente NULL s.

Le colonne vengono create utilizzando AutoGeneratingColumn, quindi in pratica le aggancia semplicemente "automagicamente" (alcuni stili come Giustifica destro vengono applicati in questo metodo, ma non per questa colonna). Prende questo approccio, perché l'app è praticamente una sostituzione "Access". Il nostro CIO ci ha incaricato di rimuovere Access dagli utenti, quindi questa era la soluzione (crea il nostro MS Access). Ad ogni modo, dato che può aprire qualsiasi tabella (e creare tabelle, colonne, ecc.) Semplicemente "Genera automaticamente" le colonne in base alla tabella che è stata aperta. Anche se, dal momento che ci sono determinate colonne che l'app conosce intrinsecamente come Discount_Pct, quando incontra una di quelle colonne, fa alcune "cose ​​speciali" (come assegnare lo IValueConverter che ho descritto sopra). Anche se, come ho detto ... per questa particolare colonna, non c'è nulla di "speciale" fatto. È solo un normale numero intero SQL (nullable) che è "AutoGenerato".

+0

Possiamo vedere il codice di convalida? – SQLMason

+0

Non ce n'è. È una bella griglia alla vaniglia. – Shayne

risposta

6

Ho appena trovato la proprietà che cercavo !!

TargetNullValue

Questo post spiega: HERE

Il problema è che queste colonne vengono generati utilizzando "AutoGenerateColumns" (perché l'origine dati ... una tabella SQL ... è "dinamica"). Se riuscivo a capire come ottenere il tipo di colonna della tabella (primitiva), so già come per vedere se è Nullable, allora posso impostare questo valore per quella colonna. (Ancora non capisco perché AutoGenerateColumns non lo gestisce automaticamente !!)

+0

so come ottenere il tipo ... si passa al gestore AutoGenerateColumn come "e.PropertyType". Il problema è che non è realmente il "tipo" ... Non è annullabile, tuttavia la colonna del database è nullable. Quindi, dovrò semplicemente scrivere questo codice per Nome colonna. :( – Shayne

1

Ho deciso di utilizzare il percorso IValueConverter anche per questo campo.

Ecco quello che ho scritto (e funziona, mi sento ancora come ci deve essere un modo più semplice 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

Estendendo l'auto-risposta di Shayne, ho scoperto che la proprietà TargetNullValue è disponibile sugli oggetti DataGridBoundColumn. È possibile utilizzare la logica aggiuntiva descritto from this comment per rendere questa condizione. Purtroppo, quel post non spiega come mettere in relazione la sua logica a un DataGrid, ecco la mia soluzione:

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

E ...

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

Ero così frustrato con questo problema. Spero che questo aiuti qualcuno.

+1

Grazie, anche se il problema che sto avendo è che il mio DataGridTextColumn non prenderà TargetNullValue - VS dice che non è nello schema quando provo AH Non importa, l'ho trovato, ha bisogno di essere: Dronz