C# ComboBox绑定和第一个空值。

3

我可能有一个小问题,但找不到解决方法...

我在一个winform中有一个组合框,这个组合框与数据表中的一列绑定。 这一列(保存打印机名称)允许为空值。我希望组合框显示一个首选项字符串“默认”,然后是打印机列表。但我不希望“默认”字符串存储在数据表中,只想要空值。

cmbDefaultPrinter.DataSource = this.availablePrinters;
cmbDefaultPrinter.DisplayMember = "Display";
cmbDefaultPrinter.ValueMember = "Value";

cmbDefaultPrinter.DataBindings.Add(new Binding("Text", ctr.ds.Tables[t.toTable], "printer"));

在这里,availablePrinters是一个该类的列表:

class myPrinters
{
    public string Value { get; set; }
    public string Display { get; set; }

    public myPrinters(string value, string display)
    {
        this.Value = value;
        this.Display = display;
    }
}

可用打印机中的第一个元素是:myPrinter(null, "默认打印机")。

我做错了什么?


当你运行它时会发生什么? - recursive
当选择“默认”打印机时,空字符串将被存储而不是null。 - Ray
你可以创建一个 NullIfEmpty() 扩展方法,并在获取组合框的 SelectedValue 时添加它。 - KeithS
1个回答

1

一些选项:

给定一个 myPrinter 对象的集合,例如 List 或绑定的 DataTable,您可以将默认值简单地插入到集合的第一个元素中。然后,在 DataBind 时,所有当前元素都被丢弃,并重新加载带有空白元素的新元素。

您还可以通过覆盖 OnDataBound 来自定义数据绑定。在添加了所有 DataTable 的元素之后,手动插入默认值。

您还可以放弃默认的 DataBind 行为,并自己填充 ComboBox。我在“惰性加载”组合框的情况下多次这样做(我首先设置一个作为记录当前值的项目,然后当他们想要展开列表时,我会检索值并完全填充列表)。这需要更多的工作;您需要基本上使用 Items.Add() 滚动自己的数据绑定行为。但是,它并不难,而且它给您更多的灵活性,包括添加不在 DataSource 中的项目的能力。

编辑:在这种情况下(当您想要 NULL 时写入空字符串),我会将以下内容放入扩展方法库中,然后在将其检索到您的域对象中的 comboBox.SelectedValue() 结尾处调用它:

public static string NullIfEmpty(this string input)
{
    return String.IsNullOrEmpty(input) ? null : input;
}

基本上,Web 控件在设置文本、值或其他显示数据属性时将 null 转换为空字符串,以简化其内部工作。但是,它们不会转换回 null,因此如果您想要 null 而不是空字符串,则必须自己进行转换。如上所示的方法非常简单。

抱歉,我的错因为我没有写明效果 - 当选择“默认”值而不是空值时,存储在数据库中的数据将为空字符串。 - Ray
感谢您的帖子,但我刚刚发现解决方案是使用System.DBNull.Value,这与典型的null不同。然而,这需要稍微不同的代码,因为System.DBNull.Value不能写入字符串变量,但可以在ADO.NET列对象中设置。无论如何,感谢您的时间! - Ray
@Ray,你是怎么解决这个问题的?我也遇到了同样的问题。我一直在寻找将我的 DataTable 列从 int 转换为 int 的方法,以便它可以接受 DBNull。 - eddyparkinson
@Ray已经解决了这个问题...http://stackoverflow.com/questions/26706156/how-to-create-a-list-for-a-combobox-that-allows-dbnull/26706931#26706931 - eddyparkinson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接