代码之家  ›  专栏  ›  技术社区  ›  Steve Hiner

将Winforms控件数据绑定到可空类型的最佳方法?

  •  18
  • Steve Hiner  · 技术社区  · 17 年前

    我在网上看到一些解决方案建议人们创建新的文本框类来处理可为空的类型,但如果要替换我已经创建的表单上的文本框,那可能会很痛苦。

    起初,我认为使用扩展方法来实现这一点会很好。基本上是为textbox类创建一个扩展属性并绑定到它。从我有限的扩展方法经验和在线检查来看,您似乎无法执行扩展属性。据我所知,绑定必须通过属性,因为它需要能够获取或设置值,这样扩展方法就无法工作。

    由于需要在Windows 2000上运行,我的项目目前仅限于.Net 2.0。

    有什么建议吗?

    4 回复  |  直到 16 年前
        1
  •  49
  •   shindigo    16 年前

    在上面提到的文章的评论部分,其中一张海报提出了一个简单的解决方案。

    而不是绑定到:

    textBox1.DataBindings.Add("Text", myClass, "MyTextProperty");
    

    绑定到:

    textBox1.DataBindings.Add("Text", myClass, "MyTextProperty", true, DataSourceUpdateMode.OnPropertyChanged, string.Empty); 
    
        2
  •  6
  •   Damien    17 年前

    我自己刚刚偶然发现了这个问题,真让人头疼。

    绑定可为null的类型的有趣之处在于DataGridView处理这些类型时没有任何问题——只是文本框导致了问题。

    因此,这不是一个很好的答案,但我的建议是,对于表单上的可空类型,尝试使用DataGridView。

    编辑:现在已经下载了这个页面上的示例代码,它的工作非常出色。

    http://www.thejoyofcode.com/Databinding_and_Nullable_types_in_WinForms.NET.aspx

        3
  •  2
  •   BenAlabaster    17 年前

    哦,真恶心。。。我只能想出几种方法来实现这一目标,但这两种方法都不是我所说的理想方法。

    • 第二是确保数据库中的所有值都不为null。。。同样,这并不理想

    • 您已经决定的第三个在这种情况下不可行的方法是创建一个自定义对象,该对象扩展textbox以添加一个可以绑定到可为null的属性。

    • 我能想到的第四个最理想的方法似乎不可能。创建一个扩展属性,该属性允许您扩展所有textbox对象并绑定到该对象,但此时似乎不可能使用扩展属性。在这种情况下,这种类型的功能在.NET框架中特别有用。

        4
  •  0
  •   Community Mohan Dere    6 年前

    Databinding and Nullable types in WinForms.NET

    脚本

    • 您有一个具有可为空属性的实体类型。
    • 您有一个绑定到该属性的文本框。
    • 当用户清除文本框中的文本时,您希望将属性的值设置为null。

    当清除绑定到可空类型的文本框时,数据绑定的结果将不会成功。

    解决方案

    在本文中,我将展示如何通过使用扩展程序提供程序来实现这一点。

    只需向项目中添加一个组件类,该类还实现了IExtenderProvider接口

    [ProvideProperty("NullableBinding", typeof(TextBox))]  
    public partial class NullableExtender : Component, IExtenderProvider
    

    ProviderProperty属性表示在将NullableExtender组件添加到表单或UserControl时,所有文本框都将具有名为NullableBinding的附加属性。在VS.NET设计器中,它的外观如下所示:

    NullableBinding Property

    现在要实现此属性的一些功能:

    private Dictionary<Control, Boolean> _nullables = new Dictionary<Control,bool>();
    
    /// <summary>
    /// This is the get part of the extender property.
    /// It is actually a method because it takes the control.
    /// </summary>
    /// <param name="control"></param>
    [DefaultValue(false),
    Category("Data")]
    public bool GetNullableBinding(Control control)
    {
        bool nullableBinding = false;
        _nullables.TryGetValue(control, out nullableBinding);
        return nullableBinding;
    }
    
    /// <summary>
    /// This is the set part of the extender property.
    /// It is actually a method because it takes the control.
    /// </summary>
    /// <param name="control"></param>
    /// <param name="nullable"></param>
    public void SetNullableBinding(Control control, bool nullable)
    {
        if (_nullables.ContainsKey(control))
            _nullables[control] = nullable;
        else
            _nullables.Add(control, nullable);
        if (nullable)
        {
            // Add a parse event handler.
            control.DataBindings["Text"].Parse += new ConvertEventHandler(NullableExtender_Parse);
        }
    }
    
    /// <summary>
    /// When parsing, set the value to null if the value is empty.
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void NullableExtender_Parse(object sender, ConvertEventArgs e)
    {
        if (e.Value.ToString().Length == 0)
        {
            e.Value = null;
        }
    }
    

    实际执行上述操作的代码是为数据绑定解析事件添加事件处理程序。如果值是空字符串,则事件处理程序只将该值设置为null,并且数据绑定成功。