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

时间:2017-04-22 03:53:21

标签: c# winforms data-binding combobox null

ComboBox绑定到BindingList<T>实例作为数据源,DisplayMemberValueMember属性已设置并按预期工作。

在代码的某个时刻,我将以编程方式切换所选值,并给出ValueMember值,这在完美的情况下完美地完成,只需comboBox.SelectedValue = newValue。但在其他情况下,提供的newValue很容易为空(或者只是在数据源中的实际键中不会发生的事情),并且这些情况将被静默处理,同时,尽可能合理 - 选择要么重置为&#34;没有选择&#34;状态或某些默认值(如预先配置的值或列表中的第一个)。但是,如果数据源中没有出现默认值,或者数据源是否为空,该怎么办? ComboBox.SelectedValue属性不支持将其设置为null。只是忽略了问题,留下之前的选择保持不变,因为有些人建议不是一个选项,因为这部分代码到达的事实通常意味着整个情况已经改变,先前的选项设置和先前的选择可能恰好没有或在新的背景下有不同的含义。

4 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

您可以添加&#34;默认&#34;绑定源的值。
假设您有一个绑定到ShippingMethod

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

然后,您可以使用&#34;默认&#34;创建ShippingMethod的实例。值,并在每次更新值时将其添加到BindingList<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 - 您可以在视图模型中使用相同的方法,而是直接将它们设置为{{1你只是回来&#34;处理&#34;收集或&#34;处理&#34;选定的价值。

如果您不希望在ComboBox中使用此代码,则可以在视图方ViewModel事件中使用此代码。

答案 2 :(得分:0)

您是否可以替换使用combobox.SelectedItem?它应该返回相同的值,我相信它可以设置为null。

答案 3 :(得分:0)

我刚刚发布了一个关于SelectedIndex属性的非常相似的问题的答案:

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

我在那里发布的解决方法,即设置FormattingEnabled = true,在设置SelectedItem = null时也能正常工作。

显然,这并没有改变这一事实,即这仍然是一项不受支持的操作,所以如果你关注&#34;保持在线内&#34;,这不会有帮助。但它确实使它在我尝试的情况下工作,并且由于它增加了我的代码的复杂性,我发现它是我的用例非常可接受的解决方法。