c#combobox绑定和第一个空值

时间:2011-02-08 15:19:17

标签: c# combobox null

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

我在winform上有一个组合框,这个组合框已绑定到数据表中的一列。 此列(保留打印机名称)是允许的空值。我希望组合框显示第一个值字符串“default”,然后显示打印机列表。但我不希望“默认”字符串存储在datatable中,只是null。

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;
    }
}

和availablePrinters中的第一个元素是:myPrinter(null,“Default printer”);

我做错了什么?

1 个答案:

答案 0 :(得分: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而不是空字符串,则必须自己进行转换。由于上述方法显示它非常简单。