【问题标题】:How do I allow a null value when binding to a numeric field in a datatable?绑定到数据表中的数字字段时如何允许空值?
【发布时间】:2023-03-21 03:54:01
【问题描述】:

我有一个表单上有一个数字字段的 winforms 应用程序。这开始为空,然后如果我将其设置为数字,更改焦点然后再次清除文本框更改回之前输入的数字。如果我更改号码,例如。从 4 到 5 已正确更新,但我希望用户能够清除已输入的内容。

以下是一些演示此行为的示例代码:

public partial class Form1 : Form
{
    DataTable table = new DataTable("TableName");
    public Form1()
    {
        DataColumn column = new DataColumn("NumericColumnName", typeof(Double));
        column.AllowDBNull = true;
        table.Columns.Add(column);
        object[] rowData = new object[1];
        rowData[0] = DBNull.Value;
        table.Rows.Add(rowData);

        InitializeComponent();

        BindingSource bindingSource = new BindingSource();
        bindingSource.DataSource = table;
        Binding binding = new Binding("Text", bindingSource, "NumericColumnName");
        textBox1.DataBindings.Add(binding);
    }
}

这是在 Visual Studio 2008 中一个全新的 .net 3.5 表单项目中。我在表单中添加了两个文本框。

我的实际应用程序以不同方式生成数据集,但它具有相同的行为。绑定到数据表的数字列是否允许空值。

【问题讨论】:

  • 能否在您检查/显示文本框值的位置插入处理程序的代码?谢谢
  • 没有处理程序 - 请参阅我更新的帖子我创建了一个简单的表单 winforms 应用程序来演示问题。

标签: c# .net winforms .net-3.5 binding


【解决方案1】:

事实上你可以允许 NULL 值,但是你必须在代码中添加额外的解析:

binding.Parse += new ConvertEventHandler(ParseNumeric);

其中 ParseNumeric 具有以下形式:

private void ParseNumeric(object sender, ConvertEventArgs e)
{
    if(e.Value.Equals(""))
        e.Value = DBNull.Value;
}

对我来说,这段代码允许文本框中的空文本在数据库中由 NULL 值表示。

【讨论】:

    【解决方案2】:

    默认情况下 double 是不可为空的字段。所以即使你输入一个空值,它也会变成0。

    您需要将列数据类型更改为双精度吗?双倍的?是nullable type

    更新

    进一步查看,类型化数据集不支持可为空的类型。

    一种解决方案是使用“松散”类型(IE:对象),但您必须检查它以确保输入有效。

    我用您的样品进行了测试并将其更改为允许我清空盒子的对象。

    【讨论】:

    • 如果我将示例代码更改为 typeof(Double?) 我得到“DataSet 不支持 System.Nullable”。异常
    猜你喜欢
    • 1970-01-01
    • 2017-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多