2013-05-15 13 views
7

Warum bewirkt das Setzen des SelectedValue eines ComboBox auf null einen ArgumentNullException?Warum verursacht das Setzen von ComboBox.SelectedValue auf null eine ArgumentNullException?

Die Ausnahme tritt nur auf, wenn die ComboBox tatsächlich Teil eines Formulars ist. Ich kann SelectedValue auf alle Arten von Werten oder Typen einstellen, die keinen Sinn ergeben, aber ich kann es nicht auf null setzen.

Es ist nicht so, dass SelectedValue nicht null sein kann. In der Tat ist sein Wert null zu der Zeit, die ich versuche, es auf null einzustellen.

In meinem echten Code passiert das nicht im Konstruktor, und ich setze es nicht explizit auf null. Der Code verwendet eine Variable, die zufällig null ist. Ich kann es beheben, indem Sie die Variable überprüfen, ist nicht null vor dem Versuch, die SelectedValue einzustellen. Aber was ich nicht verstehe ist warum Ich kann es nicht auf einen null Wert setzen.

-Code bearbeiten: Datasource enthält nun einen Eintrag in dem der ValueMembers Wert ist es tatsächlich null

using System.Collections.Generic; 
using System.Windows.Forms; 

public class Form1 : Form { 
    public Form1() { 
     var comboBox1 = new ComboBox(); 
     Controls.Add(comboBox1); 
     comboBox1.ValueMember = "Key"; 
     comboBox1.DisplayMember = "Value"; 
     comboBox1.DataSource = new List<Record> { 
      new Record {Key = "1", Value = "One"}, 
      new Record {Key = null, Value = "null"} 
     }; 
     comboBox1.SelectedItem = null;   // no problem 
     comboBox1.SelectedValue = "";   // no problem 
     comboBox1.SelectedValue = new object(); // no problem 
     comboBox1.SelectedValue = null;   // ArgumentNullException!! 
    } 
} 

public class Record { 
    public string Key { get; set; } 
    public string Value { get; set; } 
} 
+0

Haben Sie Code verknüpft mit SelectedIndexChanged Ereignis oder ein anderes Ereignis ausgelöst durch die Änderung des aktuellen Wertes? – Steve

+0

Sehen Sie, ob diese Frage helfen kann. http://stackoverflow.com/questions/2864065/c-sharp-set-combo-item-with-selectedvalue/2864119 –

+0

@Steve: Nein. Der obige Beispielcode ist ein vollständiges funktionierendes Beispiel, das die Ausnahme zeigt. – comecme

Antwort

0

Vielleicht, weil, wenn die Eigenschaft Valuemember von SelectedValue Nichts ist, dann wird die SelectedValue zurückkehren .ToString() auf das SelectedItem.

5

Inspizieren die Umsetzung der Immobilie in Reflector sieht es wie folgt aus:

public object SelectedValue 
{ 
    get 
    { 
     if ((this.SelectedIndex != -1) && (this.dataManager != null)) 
     { 
      object item = this.dataManager[this.SelectedIndex]; 
      return this.FilterItemOnProperty(item, this.valueMember.BindingField); 
     } 
     return null; 
    } 
    set 
    { 
     if (this.dataManager != null) 
     { 
      string bindingField = this.valueMember.BindingField; 
      if (string.IsNullOrEmpty(bindingField)) 
      { 
       throw new InvalidOperationException(SR.GetString("ListControlEmptyValueMemberInSettingSelectedValue")); 
      } 
      PropertyDescriptor property = this.dataManager.GetItemProperties().Find(bindingField, true); 
      int num = this.dataManager.Find(property, value, true); 
      this.SelectedIndex = num; 
     } 
    } 
} 

scheint also das Scharnier zu auf this.dataManager nicht null sein.

Wenn this.dataManager nicht null ist, wird der Setter nennen Find() mit key auf den Wert, den Sie SelectedValue zu sind Einstellung:

internal int Find(PropertyDescriptor property, object key, bool keepIndex) 
{ 
    if (key == null) 
    { 
     throw new ArgumentNullException("key"); 
    } 
    if (((property != null) && (this.list is IBindingList)) && ((IBindingList) this.list).SupportsSearching) 
    { 
     return ((IBindingList) this.list).Find(property, key); 
    } 
    if (property != null) 
    { 
     for (int i = 0; i < this.list.Count; i++) 
     { 
      object obj2 = property.GetValue(this.list[i]); 
      if (key.Equals(obj2)) 
      { 
       return i; 
      } 
     } 
    } 
    return -1; 
} 

, die eine Ausnahme auslösen, wenn key null ist.

Ich vermute, dass dataManager nur auf nicht null gesetzt ist, wenn die ComboBox in einen Container (z. B. ein Formular) eingefügt wird, weshalb es nicht explodiert, wenn es nicht in einem Container ist.

(In der Tat, dataManager wird auf nicht-null gesetzt werden, wenn Sie die Control.DataSource Eigenschaft auf nicht-null gesetzt.)

Dies ist jedoch nicht ganz richtig scheint, weil Sie eine NullReferenceException und dies berichtet eindeutig wirft eine ArgumentNullException.

[Bearbeiten] Es war in der Tat ein ArgumentNullExeption; OP wurde entsprechend aktualisiert.

+0

+1 für schnelle und gründliche "Gummihandschuh" -Analyse sozusagen. Ich bemerkte, dass die ausgelöste Ausnahme tatsächlich 'ArgumentNullException' ist ... aber anfangs nicht bemerkte, dass' key' der problematische Parameter war, dass der Setter selbst nicht die Quelle der Ausnahme war. Starke Arbeit. :} – J0e3gan

+1

Es tut mir leid, die Ausnahme geworfen ist in der Tat die ArgumentNullException. Ich werde meinen Posten wechseln. – comecme

+1

Es stellt sich nun die Frage, warum die Methode Find nicht 'null' als' Schlüssel' akzeptiert. Es ist * möglich, einen 'Record' mit einem' Schlüssel' von 'null' zu erstellen und ihn der' DataSource' hinzuzufügen. Aber Sie könnten 'SelectedValue' nicht auf diesen Wert setzen. – comecme

2

Meine Vermutung war, dass dies ein Miss auf was sollte ein ArgumentNullException sein, anstatt eine NullReferenceException (in der Implementierung des Property Setter geworfen).

Auf den Code schnell Überprüfung Sie zur Verfügung gestellt (plus ein Main Verfahren mit var form1 = new Form1()), finde ich aber, dass ich tatsächlich eine NullReferenceException nicht bekommen, wie Sie beschreiben, sondern eine ArgumentNullException wie ich erwarte, dass ich sollte.

Sind Sie sicher, dass Sie den Ausnahmetyp korrekt notiert haben?

UPDATE:

als Matthew Watson beschreibt, wird der Parameter durch den ArgumentNullException angezeigt ist, in der Tat, key.

+1

Sie haben Recht. Redigiert meine Frage. – comecme

0

Auf der button_click, dieser Code fonctionned und gelöscht Argument:

if (comboBoxPays.SelectedValue == null) 
{ 
    id_pays = 0; 
} 
else 
    id_pays = int.Parse(comboBoxPays.SelectedValue.ToString()); 
0

Ich weiß, dass dies eine alte Frage, aber ich habe jetzt den gleichen Fehler und ich habe feststellen, dass ich nicht einstellen SelectedValue = null, aber ich habe es geschafft, es auf DBNull.Value

Verwandte Themen