【问题标题】:How do you clear a cell (so it gets NULL value) in (WPF) DataGrid?如何清除(WPF)DataGrid 中的单元格(使其获得 NULL 值)?
【发布时间】:2011-07-09 03:28:38
【问题描述】:

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

“...无法转换”。

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

我已经用 google 搜索了这个问题 2 天,并发现了任何东西。我试图编辑我对 HCL 的评论,但它永远无法保存。

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

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

** 最新添加**

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

我正在绑定到一个 SQL 表。有问题的列是一个int,它允许NULLs。

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

【问题讨论】:

  • 能看到验证码吗?
  • 没有。这是一个非常普通的网格。

标签: wpf binding wpfdatagrid


【解决方案1】:

扩展 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;
}

我对这个问题感到非常沮丧。我希望这对某人有所帮助。

【讨论】:

  • 谢谢,虽然我遇到的问题是我的 DataGridTextColumn 不会采用 TargetNullValue - VS 说当我尝试 。啊!没关系,我找到了,它需要是:
【解决方案2】:

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

TargetNullValue

这篇文章解释了它:HERE

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

【讨论】:

  • 我知道如何获取类型...它作为“e.PropertyType”传递给 AutoGenerateColumn 处理程序。问题是,它不是真正的“类型”......它不能为空,但数据库列可以为空。所以,我只需要按列名对其进行硬编码。 :(
【解决方案3】:

我决定也为这个字段采用 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;
        }
    }

【讨论】:

    猜你喜欢
    • 2020-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多