2009-07-22 9 views
2

J'ai créé un UserControl avec une liste déroulante. Cette zone de liste déroulante est peuplée à partir d'un fichier XML, lorsque celui-ci n'est pas présent, il est chargé à partir du fichier de ressources.
Cela fonctionne très bien dans le programme, mais il ne peut pas être affiché dans le concepteur - il dit: "Référence d'objet n'est pas définie sur une instance d'un objet."UserControl ne peut pas être affiché dans la référence d'objet Designer - null

Dans la classe responsable de chargement de la liste de xml la vérification de référence null est ignorée pour des raisons indépendantes de ma compréhension ...

public SortedDictionary<string, string> Countries 
{ 
    get 
    { 
     if (object.ReferenceEquals(countries, null)) 
     { 
      GetCountryList(); 
     } 
     return countries; 
    } 
} 

Peuplement de l'comboBox va comme ceci:

comboBoxCountry.DataSource = new BindingSource(Program.language.Countries, null); 

Program.language est initialisé dans le programme, mais cela n'aide pas pour le concepteur.

La question est, comment (quand, à quel événement) devrais-je remplir le ComboBox (= charger la liste de xml) pour pouvoir afficher mon contrôle dans le concepteur.

Répondre

4

Si possible, vous voulez vérifier pour this.DesignMode, puis simplement ne pas charger le ComboBox au moment du design.

+0

Cela semble fonctionner. Y at-il une raison, pourquoi if(!this.DesignMode ne fonctionne pas dans le constructeur du composant, alors que cela fonctionne dans l'événement Load? – Lukas

+0

Quand vous dites que ça ne marche pas, que se passe-t-il? – jasonh

+0

Il semble être ignoré ... Cela ne fonctionne pas - il ne peut pas être affiché dans le concepteur. public LoacationUserControl() {InitializeComponent(); if (! this.DesignMode) {LoadCountries(); }} Cela fonctionne: private void LoacationUserControl_Load (expéditeur d'objet, EventArgs e) {if (! This.DesignMode) {LoadCountries(); }} Dans les deux cas, le contenu de LoadCountries() est dans if (! This.DesignMode) {} – Lukas

0

Est-ce que GetCountryList() définit une variable membre? Si c'est le cas, déplacez cet appel vers une méthode. La propriété get accesseurs et la méthode ToString() sont supposées pures: l'état du programme avant et après doit être identique. La violation de cette hypothèse peut entraîner toutes sortes de problèmes, en particulier une incohérence de concepteur/débogueur/exécution. Various rants have taken place, mais la meilleure chose à faire est de comprendre l'hypothèse, de la suivre et de la laisser fonctionner à votre avantage lors du débogage.

+0

Oui, il en initialise un. Cela signifie essentiellement qu'avant d'obtenir la propriété, je dois appeler manuellement une méthode remplissant la liste et fournissant les données nécessaires à la propriété. Ai-je raison? – Lukas

Questions connexes