如何将数据绑定的ComboBox选定值设置为空或默认值?

问题描述:

A ComboBox作为数据源绑定到BindingList<T>实例,DisplayMemberValueMember属性被设置并按假定工作。如何将数据绑定的ComboBox选定值设置为空或默认值?

在代码的某一点,我将以编程方式切换选定的值,给出一个ValueMember的值,这完美地适用于一个完美的情况,只需要简单,只需comboBox.SelectedValue = newValue。但在其他情况下,提供的newValue可能很容易为空(或者只是在数据源中的实际键中可能不会发生的情况),并且这些情况要默默处理,同时尽可能合理地处理 - 选择将被重置为“没有选择”状态或某些默认值(如预先配置的值或列表中的第一个)。但是如果数据源中没有发生默认值,或者数据源只是空的,该怎么办? ComboBox.SelectedValue属性不支持将其设置为空。只是忽略了前面选择的问题而没有改变,因为有些人认为这不是一种选择,因为这部分代码已经达到,这通常意味着整个情况已经改变了,以前的选项设置和之前的选择可能碰巧没有或在新的上下文中有不同的含义。

可以使用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

你可以给绑定源添加“默认”值。
假如你有一个绑定到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事件中使用它们。

难道你不能在替换中使用combobox.SelectedItem?它应该返回相同的值,我相信它可以设置为null。

我只是张贴解答有关SelectedIndex属性一个非常类似的问题:

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

解决方法我张贴在那里,即设置FormattingEnabled = TRUE,效果一样好设置的SelectedItem = null当。

显然,这不会改变的事实,这仍是一个不支持的操作,所以如果你很在意“住行内”,这不会帮助。但它似乎使它在,我试过的情况下工作,因为它增加了零的复杂性,以我的代码,我发现这是我的使用案例非常行之有效的解决方法。