2011-02-08 57 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而不是空字符串,則必須自己進行轉換。由於上述方法顯示它很容易。