我可能遇到了一个小问题,但找不到解决方法......
我在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”);
我做错了什么?
答案 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而不是空字符串,则必须自己进行转换。由于上述方法显示它非常简单。