如何清除(WPF)DataGrid中的单元格(因此它获取NULL值)?

时间:2011-03-04 21:36:46

标签: wpf binding wpfdatagrid

我们有一个绑定到可以为空的sql整数值的列。当用户尝试“清除”DataGrid中的单元格时,我们会收到验证错误

  

“......无法转换”。

如何将其设为空并将“null”值绑定到基础列?

我已经用Google搜索了这个问题2天了,发现了什么。我试图将你的评论编辑给你HCL,但它永远不会保存。

我熟悉IValueConverters。我写了一个来处理我们的百分比(因此用户可以输入“50%”并将其转换为“.5”)。我正在尝试做一些非常相似的事情,但是当值返回为Null时(我写了一个虚拟IValueConterter来调试它),我只是想将它作为{保存到数据库中} {1}}。也许我只需要将其设置为Null?对于我认为可能具有内置属性的东西来说,这看起来似乎很多。我尝试使用列DBNullValue)上的TargetNullValue属性并将其设置为DataGridBoundColumn,但它没有更改值(基于我的虚拟DBNull.Value它是仍然以常规(字符串)IValueConverter进入。

我只是希望能够为此(整数类型)列保存空值到数据库。

**最新添加**

好点HCL,我忘了有时整个世界都不是ADO。

我绑定到SQL表。相关列是NULL,允许int s。

使用NULL创建列,因此它基本上只是“自动”连接它们(某些样式,如右对齐在此方法中应用,但不适用于此列)。它采用这种方法,因为该应用程序几乎是“访问”的替代品。我们的CIO强制要求我们从用户中删除Access,因此这就是解决方案(创建我们自己的MS Access)。无论如何,因为它可以打开任何表(并创建表,列等),它只是根据打开的表“AutoGenerates”列。虽然,由于应用程序固有地知道某些列,例如Discount_Pct,当它遇到其中一列时,它会做一些“特殊的东西”(比如分配上面描述的AutoGeneratingColumn)。虽然,就像我说的......对于这个特殊的专栏,没有任何“特殊”的做法。它只是一个常规的SQL整数(可空),它是“AutoGenerated”。

3 个答案:

答案 0 :(得分:7)

我刚刚找到了我要找的房产!!

TargetNullValue

这篇文章解释了它:HERE

问题是,这些列是使用“AutoGenerateColumns”生成的(因为数据源......一个sql表......是“动态的”)。如果我能弄清楚如何获取表列(基元)类型,我已经知道如何查看它是否为Nullable,那么我可以为该列设置此值。 (我仍然不明白为什么AutoGenerateColumns不会自动处理这个!!)

答案 1 :(得分:3)

延伸Shayne的自我回答,我发现TargetNullValue属性在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;
}

我对这个问题非常沮丧。我希望这有助于某人。

答案 2 :(得分: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;
        }
    }