2017-04-22 11 views
1

ComboBoxは、データソースとしてBindingList<T>インスタンスにバインドされ、DisplayMemberおよびValueMemberプロパティが設定され、想定どおり動作します。データバインドされたComboBoxの選択された値を何もまたはデフォルトに設定するには?

コードのある時点で、ValueMemberという値を指定して、選択した値をプログラムで切り替えることができます。これは完璧なケースでは、ちょうどちょうどcomboBox.SelectedValue = newValueとして実行されます。しかし、他の場合には、newValueは簡単にヌル(またはデータソース内の実際のキーにはおそらく存在しないもの)である可能性があります。これらの状況は、静かに処理すると同時に、可能な限り合理的に処理する必要があります。選択は「選択なし」状態にリセットされるか、または既定の値(あらかじめ設定された値やリストの最初の値など)にリセットされます。しかし、データソースにデフォルト値が存在しない場合、またはデータソースが空の場合はどうすればよいですか? ComboBox.SelectedValueプロパティでnullを設定することはできません。コードのこの部分に達するという事実は、状況全体が変化し、前のオプションが設定され、前の選択が無条件に起こることを意味することがあるため、以前の選択を残して問題を無視するだけで、新しい文脈では異なる意味を持ちます。 exceptionがあるたびに、例外がスローされたときに、それは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ブロックに移動しますあなたの値はnullであるか、存在しません。今までそうするとき、それは例外がスローされますtrycatchを使用することができます

答えて

0

あなたは値を"0"に設定することができますempty

+0

最初にソースデータに実際には "1"の値はほとんど現れず、他の種類のキーのサポートも実装されていますが、GUIDが最も頻繁に使用されます(場合によっては、数字のサポートは将来必要になる可能性があります)ので、 "BindingList"(およびそれにバインドされているComboBox自体、またはそうでない場合でも)の "BindingList"に "1"空である。この解決法はいずれの場合にも当てはまらないようだが、間違っているのだろうか? – Ivan

+0

例外がスローされない – Usman

+0

@Ivan値が存在しない場合は空を選択する "0"を使用できます – Usman

0

バインディングソースに「デフォルト」の値を追加できます。
はあなたが次にあなたが「デフォルト」の値を持つShippingMethodのインスタンスを作成し、BindingList<ShippingMethod>にあなたが値を更新するたびに、それを追加することができComboBox

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

に特異的に結合する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を使用して、プロパティMethodsSelectMethodViewModel持っている場合 - あなたはのviewmodelsで同じメソッドを使用しますが、代わりにそれらを設定することができますがComboBoxにまっすぐに "処理された"コレクションまたは "処理された"選択された値が返されます。

ViewModelでこのコードを使用しない場合は、ビュー側のBinding.Formatイベントで使用できます。

0

代わりにcombobox.SelectedItemを使用できませんか?同じ値を返す必要があり、nullに設定できると思います。

0

私は、SelectedIndexプロパティについて非常に類似した質問の答え投稿:

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

私はのSelectedItem = NULLを設定するときに同じようにうまく機能、すなわち真= FormattingEnabledを設定し、そこに掲載さ回避策を。

明らかに、これは依然としてサポートされていない操作であるという事実は変わりません。したがって、「ライン内に留まる」ことが心配であれば、これは役に立ちません。しかし、私が試した事例ではうまくいくように見えるし、コードには複雑さがないので、私はそれを私のユースケースでは非常に容認できる回避策であると感じました。

関連する問題