2017-04-22 757 views
1

A ComboBox作爲數據源綁定到BindingList<T>實例,DisplayMemberValueMember屬性被設置並按假定工作。如何將數據綁定的ComboBox選定值設置爲空或默認值?

在代碼的某一點,我將以編程方式切換選定的值,給出一個ValueMember的值,這完美地適用於一個完美的情況,只需要簡單,只需comboBox.SelectedValue = newValue。但在其他情況下,提供的newValue可能很容易爲空(或者只是在數據源中的實際鍵中可能不會發生的情況),並且這些情況要默默處理,同時儘可能合理地處理 - 選擇將被重置爲「沒有選擇」狀態或某些默認值(如預先配置的值或列表中的第一個)。但是如果數據源中沒有發生默認值,或者數據源只是空的,該怎麼辦? ComboBox.SelectedValue屬性不支持將其設置爲空。只是忽略了前面選擇的問題而沒有改變,因爲有些人認爲這不是一種選擇,因爲這部分代碼已經達到,這通常意味着整個情況已經改變了,以前的選項設置和之前的選擇可能碰巧沒有或在新的上下文中有不同的含義。

回答

0

可以使用trycatch所以當過你的價值是null或不存在,它會拋出一個異常,所以當異常被拋出它會去catch

try 
    { 
     ComboBox.SelectedValue = null; //this will throw exception 
     ComboBox.SelectedValue = "text that dont exists" //this will throw exception 

    } 

catch (Exception exception) 
    { 
     ComboBox.SelectedValue = "0"; 
    } 

所以在catch每當exception是拋出你可以設置它的值爲"0"進行選擇empty

+0

首先,實際上在源數據中很少會出現「1」值,但GUID將最常使用,儘管也會實現對其他種類的鍵的支持(在某些情況下會使用非數字字符串,數字支持可能發生在未來需要),所以機會是「1」是不會出現在源的BindingList(和組合框本身,特別是當它被綁定到它,甚至如果不是)也可以空着。這種解決方案似乎不適用於任何情況,或者我錯了嗎? – Ivan

+0

它不會拋出任何異常 – Usman

+0

@Ivan您可以使用「0」它將選擇空值如果值不存在 – Usman

0

你可以給綁定源添加「默認」值。
假如你有一個綁定到ComboBox

public class ShippingMethod 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 

然後你就可以創建ShippingMethod與「默認」值的情況下,它每次更新值的時間添加到BindingList<ShippingMethod>一個ShippingMethod類。
對於是否存在給定值,檢查的使用Dictionary如果不是 - 設置默認

private Dictionary<int, ShippingMethod> _allMethods; 
private ShippingMethod _defaultShippingMethod = new ShippiingMethod 
{ 
    Id = 0, Name = "Not selected" 
} 

private void SetUpShippingMethods(IEnumerable<ShippingMethod> methods) 
{ 
    _allMethods = methods.ToDictionary(method => method.Id); 
    var shippingMethods = new List<ShippingMethod> { _defaultShippingMethod }; 

    shippingMethods.AddRange(methods); 

    _comboBox.ValueMember = "Id"; 
    _comboBox.DisplayMember = "Name"; 
    _comboBox.DataSource= shippingMethods; 
} 

private void SetSelectedShippingMethod(ShippingMethod method) 
{ 
    If (method == null) 
    { 
     _comboBox.SelectedValue = _defaultMethod.Id; 
     return; 
    } 

    if (_allMethods.ContainsKey(method.Id)) 
    { 
     _comboBox.SelectedValue = method.Id; 
    } 
    else 
    { 
     _comboBox.SelectedValue = _defaultMethod.Id; 
    } 
} 

如果使用MVVM和具有ViewModel,其屬性MethodsSelectMethod - 您可以使用相同的方法在的ViewModels,而是將它們設置直接到ComboBox您只需返回「已處理」集合或「已處理」選定值。

如果您不想在ViewModel中使用此代碼,則可以在視圖端的Binding.Format事件中使用它們。

0

難道你不能在替換中使用combobox.SelectedItem?它應該返回相同的值,我相信它可以設置爲null。

0

我只是張貼解答有關SelectedIndex屬性一個非常類似的問題:

How to deleselect/blank a databound ComboBox? SelectedIndex = -1 does not work

解決方法我張貼在那裏,即設置FormattingEnabled = TRUE,效果一樣好設置的SelectedItem = null當。

顯然,這不會改變的事實,這仍是一個不支持的操作,所以如果你很在意「住行內」,這不會幫助。但它似乎使它在,我試過的情況下工作,因爲它增加了零的複雜性,以我的代碼,我發現這是我的使用案例非常行之有效的解決方法。

相關問題