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

C# 如何将数据绑定对象的combobox字段绑定到数据源,并且仍然允许空值?,c#,winforms,data-binding,null,datasource,C#,Winforms,Data Binding,Null,Datasource,我有一个绑定到客户对象的表单数据,其中一个字段是表示类型的可为null的int。这将显示为组合框,并且组合框绑定到类型表 当将空类型的客户加载到表单的数据源中时,组合框不显示任何值,但单击该组合框后,必须选择一个值。表单/组合框永远不允许您更改回空白项,以表示customer对象上的null 我不希望数据库中出现伪行,目前通过添加一个伪对象并在submit事件not clean!中将其置零来实现这一点 是否可以使用可为空的主键干净地执行此操作 用于绑定到类型组合的数据源中可以有另外一个包含NUL

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

当将空类型的客户加载到表单的数据源中时,组合框不显示任何值,但单击该组合框后,必须选择一个值。表单/组合框永远不允许您更改回空白项,以表示customer对象上的null

我不希望数据库中出现伪行,目前通过添加一个伪对象并在submit事件not clean!中将其置零来实现这一点


是否可以使用可为空的主键干净地执行此操作

用于绑定到类型组合的数据源中可以有另外一个包含NULL值的条目

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ TypeID Name ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1 Business 2 Government -1 NULL
如果允许客户不需要类型,则可以为没有类型的客户存储-1。

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

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

Jez Humble在本文底部提供了一些关于绑定可空类型的信息,其中建议如果显式地将DataSourceUpdateMode设置为DataSourceUpdateMode.OnPropertyChanged,则可以绑定到可空类型

另一篇关于数据绑定可空类型的文章:代码的乐趣-

也许这段绑定可空DateTimePicker的代码可以帮助您找到解决此问题或其他可空问题的附加解决方案

还要查看我提出扩展方法的来源

/// <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


我花了两天疯狂的研究和心脏病发作的风险,才在某个地方的一篇小帖子中发现了这一点。

也许你应该在SO或外部资源上发布上述问题的链接。只是一个建议,让你的类型成为一个枚举,其中一个值未指定如何?我知道这不是一个答案,但无论如何你都应该使用enum…在某些情况下,enum可能是一个解决方案,但如果数据来自数据源,则不是。例如,考虑一辆汽车的产品配置器-可能有一个包含所有可用导航系统的组合框。在数据库中,表Car将有一个表导航系统的可空外键。因此,您希望将组合框绑定到NavigationSystems表,但如果用户决定不购买导航系统,则仍然允许null。添加一个新的无行导航系统并使外键不可为空可能是一个解决方案,但这也有缺点。我希望在这个问题上增加10票。它强调了在整个数据绑定基础设施中存在的巨大疏忽。开发人员显然从未亲自尝试过。我还感到惊讶的是,它只吸引了两个答案,其中一个答案是非常不透明的。我想要null。不要在数据库中存储-1。如果用户从数据库中选择空白项,则selectedItem的值将为-1-如果为空,则在数据库中存储空值case@shahkalpesh您建议我们如何告诉数据绑定将-1转换为null?@ProfK:我不建议使用数据绑定、数据集—MS抛出的所有东西都有利于演示,人们使用它后发现不足。CurrencyManager在这种情况下有帮助吗?@shahkalpesh我会看一看,谢谢。不过,我发现在大多数情况下,数据绑定是相当充分的。除此之外,我没有太多问题。你链接到的每个帖子和你的答案都涉及格式和解析。我今天可能有点慢,但这是如何解决组合框问题的呢?因为答案显示了问题的答案,如何在没有-1幻数的情况下将一个可空值绑定到组合框