2011-03-04 42 views
5

我們有一個列綁定到一個可爲空的sql整數值。當用戶試圖「清除」DataGrid中的單元時,我們得到驗證錯誤如何清除(WPF)DataGrid中的單元格(以便獲取NULL值)?

「......無法轉換」。

如何讓它爲空並將「空」值綁定到基礎列?

我已經將這個問題搜索了兩天,發現了任何東西。我試圖編輯我的評論給你HCL,但它永遠不會保存。

我熟悉IValueConverters。我寫了一個來處理我們的百分比(因此用戶可以輸入「50%」並將其轉換爲「.5」)。我試圖做一些非常相似的事情,但是當數值回到Null(我寫了一個虛擬的IValueConterter來調試它)時,我只想將它作爲Null保存到數據庫中。也許我只需要將它設置爲DBNullValue?對於我認爲可能擁有內置財產的東西來說,這似乎有很多工作要做。我試圖使用的列(DataGridBoundColumn)和設置,爲DBNull.ValueTargetNullValue屬性,但它並沒有改變的值(根據我的虛擬IValueConverter它仍然進來作爲一個經常(串)NULL

我只是希望能夠爲空值保存到數據庫這個(整型)列。

**最新**

好一點HCL,我忘了,整個世界是不是有時ADO 。

我綁定到一個SQL表。有問題的列是允許NULL s的int

這些列是使用AutoGeneratingColumn創建的,所以它基本上只是「自動」掛鉤它們(某些樣式,如右對齊適用於此方法,但不適用於此列)。它採用這種方法,因爲該應用程序幾乎是「Access」替代品。我們的CIO要求我們從用戶中刪除Access,所以這是解決方案(創建我們自己的MS Access)。無論如何,因爲它可以打開任何表(並創建表,列等),它只是基於打開的表「自動生成」列。雖然,由於應用程序固有地知道諸如Discount_Pct的某些列,但遇到其中一列時,它確實會做一些「特殊的事情」(例如分配上述的IValueConverter)。雖然,就像我說的...對於這個特定的專欄,沒有任何「特殊」做到了。它只是一個常規的SQL整數(可爲空),即「AutoGenerated」。

+0

我們可以看到驗證碼嗎? – SQLMason

+0

沒有任何。這是一個漂亮的香草網格。 – Shayne

回答

6

我才發現我一直在尋找的財產!

TargetNullValue

這篇文章解釋了它:HERE

的問題是,這些列使用 「的AutoGenerateColumns」(因爲數據源... SQL表...是 「動態」)中產生。如果我能弄清楚如何獲得表列(原始)類型,我已經知道如何查看它是否爲空,然後我可以爲該列設置此值。 (我仍然不明白爲什麼AutoGenerateColumns不能自動處理這個問題!!)

+0

我知道如何獲取類型......它作爲「e.PropertyType」傳遞給AutoGenerateColumn處理程序。問題是,它不是真正的「類型」...它不是可空的,但數據庫列是可空的。所以,我只需要按列名對此進行硬編碼。 :( – 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的自我回答,我發現TargetGullValue屬性在DataGridBoundColumn對象上可用。你可以使用附加的邏輯描述from this comment來使這個條件。不幸的是,文章沒有解釋如何它的邏輯涉及到一個DataGrid,所以這裏是我的解決方案:

<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說,它不是在架構中,當我嘗試。AH!沒關係,我發現它,它需要: Dronz

相關問題