2011-02-08 24 views
2

我可能是一个小问题,但无法找到解决办法......C#组合框的结合和第一空值

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

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

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

其中availablePrinters是这个类的列表:在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, “默认打印机”);

我在做什么错?

+0

当你运行它会发生什么? – recursive 2011-02-08 15:30:56

+0

作为打印机的值,当选择“default”时,空字符串将存储insead的空值... – Ray 2011-02-08 15:42:14

回答

1

一些选项:

鉴于myPrinter对象的集合,如表或数据表的约束,你可以简单地插入默认值集合的第一个元素。然后,当您DataBind时,所有当前元素都将被丢弃,并且新元素将重新加载上一个空白元素。

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

您也可以放弃默认的DataBind行为,并自行填充组合框。我在“延迟加载”组合框的情况下做了很多次(我首先设置了一个是当前记录值的项目,然后当他们想要删除列表时,我将检索值并完全填充列表)。这有点牵强了;你需要基本上使用Items.Add()来滚动你自己的数据绑定行为。但是,这并不难,它给了你更多的灵活性,包括添加不在数据源中的项目的能力。在这种情况下(当你想要NULL时写入一个空字符串),我会将下列内容放入扩展方法库中,然后在comboBox.SelectedValue()的末尾粘贴一个调用,当你检索它粘到你的域对象:

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

基本上,设置文本,值或其他显示的数据属性时,web控件将null转换为空字符串,这样他们就可以简化其内部运作。但是,它们不会转换回null,因此如果您希望使用null而不是空字符串,则必须自己进行转换。由于上述方法显示它很容易。