2011-03-04 6 views
5

null可能なSQLの整数値にバインドされた列があります。ユーザーがDataGridでセルをクリアしようとすると、検証エラー(WPF)DataGridでどのようにセルをクリアする(NULL値を取得する)のですか?

"...変換できませんでした"が表示されます。

どうすれば空にして、 "null"値を基になる列にバインドできますか?

私は今この問題を2日間見つけて何かを見つけました。私はあなたのコメントをHCLに編集しようとしましたが、それは保存されません。

私はIValueConvertersに精通しています。私はパーセンテージを扱うよう書いています(ユーザは "50%"を入力でき、 ".5"に変換されます)。私は非常に似たようなことをやろうとしていますが、値がNull(私はダミーのIValueConterterをデバッグして書きました)に戻ると、データベースにNullとして保存したいだけです。たぶん私はそれをDBNullValueに設定する必要がありますか?それは、私が財産を持つかもしれないと思う何かのための多くの仕事のように思える。私は列(DataGridBoundColumn)とDBNull.Valueにその設定にTargetNullValueプロパティを使用してみましたが、それは私のIValueConverterダミーそれはまだ)、通常の(文字列として来ているNULL

Iに基づいて(値を変更していません単純に、この(整数型)列にデータベースにNULL値を保存できるようにしたい。

**最新の追加**

良い点HCLは、私は全世界が時々、ADOされていないことを忘れ。

私はSQLテーブル問題の列は、NULLを許可するintです。

列はAutoGeneratingColumnを使用して作成されるため、基本的には「自動的に」(右寄せなどの特定のスタイルはこの列には適用されませんが、この列には適用されません)。このアプローチは、アプリがかなり "アクセス"の代替品であるためです。当社のCIOは、ユーザーからのアクセスを削除することを義務づけたので、これが解決策でした(独自のMS Accessを作成する)。とにかく、それは任意のテーブルを開くことができます(そして、テーブル、カラムなどを作成する)ので、オープンされたテーブルに基づいてカラムを "自動生成"します。アプリがDiscount_Pctなどの本質的に知っている特定の列があるので、これらの列の1つに出会うと、(前述のIValueConverterを割り当てるなどの)特別な処理を行います。しかし、私が言ったように...この特定のコラムについては、それに対して特別なことは何もありません。これは "AutoGenerated"である通常のSQL整数(null可能)です。

+0

検証コードが表示されますか? – SQLMason

+0

ありません。それはかなりバニラのグリッドです。 – Shayne

答えて

6

私はちょうど私が探していたプロパティを見つけました!

TargetNullValue

この投稿は、それを説明する:HERE

問題があり、これらの列は、 "AutoGenerateColumns"(データソース... SQLテーブルが... "ダイナミック" であるため)を使用して生成されます。テーブルの列(プリミティブ)型を取得する方法を理解できれば、Nullableかどうかを知る方法はすでに分かっています。この値をこの列に設定できます。 (私はまだAutoGenerateColumnsがこれを自動的に処理しない理由を理解していません!!)

+0

私は型を取得する方法を知っています...それは "e.PropertyType"としてAutoGenerateColumnハンドラに渡されます。問題は、実際には「型」ではないということです。ヌル入力可能ではありませんが、データベース列はNULLになります。だから、私はただ列名でこれをハードコードする必要があります。 :( – Shayne

1

私はこのフィールドのIValueConverterルートに行くことにしました。ここで

は、私が書いたものである(そして、それは動作しますが、もっと簡単な方法がなければならないように私はまだ感じる笑!):

[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

Shayneの自己解答を拡張して、TargetNullValueプロパティがDataGridBoundColumnオブジェクトで利用できることを発見しました。 from this commentと記述された追加ロジックを使用して、これを条件付きにすることができます。

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

そして...

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

私はこの問題に不満でした。残念ながら、そのポストは、データグリッドにそのロジックを関連付ける方法について説明していませんので、ここで私の解決策です。私はこれが誰かを助けることを望む。

+1

ありがとう、私が持っている問題は、私のDataGridTextColumnはTargetNullValueを取らないということです - VSは私がこのようにする必要があります。 – Dronz

関連する問題