繁体   English   中英

如何将数据绑定对象的组合框字段绑定到数据源,并且仍然允许空值?

[英]How can I bind a combobox field of a databound object to a datasource and still allow nulls?

我有一个数据绑定到客户对象的表单,并且字段之一是可空的int,表示“类型”。 这显示为一个组合框,并且组合框绑定到“类型”表。

当将具有空类型的客户加载到表单的数据源中时,组合框不显示任何值,但是在单击它时,您必须选择一个值。 窗体/组合框将永远不允许您改回空白项(在客户对象上代表“ null”)。

我不想要数据库中的“虚拟行”,当前通过添加一个虚拟对象并在Submit事件中将其清空(不干净!)来实现。

是否可以干净地执行此操作并保持可为空的主键?

有关可空数据绑定的其他链接和资源:

有人告诉我,到目前为止,它已经解决了,在数据库数据源和UI之间应该有一层业务对象,您可以按照shahkalpesh的建议添加项目,而不必担心它会进入数据库。

Jez Humble在本文的底部和注释中提供了有关绑定可空类型的一些信息,如果“您将DataSourceUpdateMode显式设置为DataSourceUpdateMode.OnPropertyChanged”,则建议绑定到可空类型是可行的。

关于数据绑定可空类型的另一篇文章:代码的喜悦-WinForms.NET中的数据绑定和可空类型

也许此用于绑定可为null的DateTimePicker的代码可以帮助您找到此问题或其他可为null的问题的其他解决方案。

另外,请查看Dan Hannan ,了解我提出扩展方法的来源。

/// <summary>
    /// From BReusable
    /// </summary>
    /// <param name="dtp"></param>
    /// <param name="dataSource"></param>
    /// <param name="valueMember"></param>
    /// <remarks>With help from Dan Hanan at http://blogs.interknowlogy.com/danhanan/archive/2007/01/21/10847.aspx</remarks>
    public static void BindNullableValue(this DateTimePicker dateTimePicker, BindingSource dataSource, String valueMember,bool showCheckBox)
    {
        var binding = new Binding("Value", dataSource, valueMember, true);

        //OBJECT PROPERTY --> CONTROL VALUE
        binding.Format += new ConvertEventHandler((sender, e) =>
        {
            Binding b = sender as Binding;

            if (b != null)
            {
                DateTimePicker dtp = (binding.Control as DateTimePicker);
                if (dtp != null)
                {
                    if (e.Value == null)
                    {

                        dtp.ShowCheckBox = showCheckBox;
                        dtp.Checked = false;

                        // have to set e.Value to SOMETHING, since it's coming in as NULL
                        // if i set to DateTime.Today, and that's DIFFERENT than the control's current
                        // value, then it triggers a CHANGE to the value, which CHECKS the box (not ok)
                        // the trick - set e.Value to whatever value the control currently has. 
                        // This does NOT cause a CHANGE, and the checkbox stays OFF.

                        e.Value = dtp.Value;

                    }
                    else
                    {
                        dtp.ShowCheckBox = showCheckBox;
                        dtp.Checked = true;
                        // leave e.Value unchanged - it's not null, so the DTP is fine with it.
                    }

                }

            }
        });
        // CONTROL VALUE --> OBJECT PROPERTY
        binding.Parse += new ConvertEventHandler((sender, e) =>
        {
            // e.value is the formatted value coming from the control. 
            // we change it to be the value we want to stuff in the object.
            Binding b = sender as Binding;

            if (b != null)
            {
                DateTimePicker dtp = (b.Control as DateTimePicker);
                if (dtp != null)
                {
                    if (dtp.Checked == false)
                    {
                        dtp.ShowCheckBox = showCheckBox;
                        dtp.Checked = false;
                        e.Value = (Nullable<DateTime>)null;
                    }
                    else
                    {
                        DateTime val = Convert.ToDateTime(e.Value);
                        e.Value = val;
                    }
                }
            }
        });
        dateTimePicker.DataBindings.Add(binding);

    }

如果您的主要目标是将组合恢复为空白并且将值恢复为null,则在编辑行时只需按Ctrl + 0。

我花了两天时间进行疯狂的研究和心脏病发作的风险,才发现这隐藏在某个地方的小帖子中。

用于绑定到“类型”组合的数据源中可能还有1个条目为NULL值。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
TypeID   Name
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1        Business
2        Government
-1       NULL

您可以为没有类型的客户存储-1(如果允许客户不需要类型,则可以存储-1)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM