Membre de valeur différent, même contrôle
-
05-07-2019 - |
Question
Modifier 1
Je crois que mon problème découle de ce qui suit. La fonction qui remplit la partie déroulante définit le membre d'affichage sur CountyName. Ensuite, lorsque j'essaie de définir SelectedText ou EditValue, comme cela a été suggéré, cette fonction ne renvoie que le CountyID qu'il tente de faire correspondre à quelque chose de la liste déroulante DisplayMember. J'ai besoin de le faire correspondre à quelque chose dans la liste ValueMember.
En utilisant ce qui suit, je l’ai obtenu au travail, mais c’est un HACK et j’apprécierais beaucoup de trouver une solution réelle.
lkuResidenceCounty.ItemIndex = Convert.ToInt32(row["ResidencyCountyID"].ToString());
Message d'origine
J'ai une boîte de recherche (DevExpress) sur un formulaire membre dans laquelle je remplis les valeurs possibles à partir de la base de données avec ce code - >
lkuResidenceCounty.Properties.DataSource = ConnectBLL.BLL.Person.CountyList();
lkuResidenceCounty.Properties.PopulateColumns();
lkuResidenceCounty.Properties.DisplayMember = "CountyName";
lkuResidenceCounty.Properties.ValueMember = "CountyID";
lkuResidenceCounty.Properties.Columns[0].Visible = false;
lkuResidenceCounty.Properties.Columns[2].Visible = false;
lkuResidenceCounty.Properties.Columns[3].Visible = false;
Cela fonctionne très bien car le CountyName est affiché comme prévu.
Cependant, lorsque j'essaie de charger la valeur d'un membre existant pour ce champ à l'aide de l'option ci-dessous, qui fait partie d'une fonction qui prend une ligne du DataSet - >
lkuResidenceCounty.Properties.ValueMember = row["ResidencyCountyID"].ToString();
Je reçois une case vide. J'ai parcouru le code et l'identifiant correct est renvoyé pour le membre.
Malheureusement, la procédure stockée pour remplir les options de liste déroulante est extraite d'une table de maintenance avec les colonnes " CountyName " & amp; "CountyID". Donc c'est correct. Malheureusement, la procédure stockée permettant de charger le comté actuel d'une personne spécifique est extraite de la table des personnes dans laquelle se trouve une colonne intitulée "ResidencyCountyID". Il est ainsi nommé car il existe également un "ResponsibilityCountyID". colonne.
J'ai besoin d'un moyen de faire coexister les deux, des solutions?
Merci!
La solution
DisplayMember et ValueMember sont utilisés pour renseigner le contrôle avec la liste des valeurs pouvant être sélectionnées. Pour définir la valeur sélectionnée d'un contrôle LookUpEdit peuplé, définissez son ModifierValeur / a> propriété:
lkuResidenceCounty.EditValue = row["ResidencyCountyID"].ToString();
En réponse à votre modification: selon la documentation:
La ligne actuellement sélectionnée détermine les valeurs de la valeur de traitement et du texte d'affichage de l'éditeur. La valeur de BaseEdit.EditValue est obtenue à partir du champ RepositoryItemLookUpEditBase.ValueMember, tandis que le texte à afficher dans la zone d'édition est obtenu à partir du champ RepositoryItemLookUpEditBase.DisplayMember de la ligne sélectionnée.
Lorsque vous modifiez BaseEdit.EditValue, l'éditeur localise et sélectionne la ligne dont RepositoryItemLookUpEditBase.ValueMember Le champ contient la nouvelle valeur. Le texte dans la zone d'édition est modifié pour refléter la nouvelle ligne sélectionnée.
Je n’utilise pas ces commandes, mais il me semble que cela ne devrait pas fonctionner comme vous l’avez décrit. Je pense que ToString () est le problème parce que EditValue accepte un objet, il attend donc probablement un int pour la valeur. Essayez:
lkuResidenceCounty.EditValue = (int)row["ResidencyCountyID"];
Autres conseils
La propriété ValueMember indique à la liste le champ à extraire lors de la définition de la propriété Value. Une fois que vous avez défini ValueMember sur "CountyID", il définira toutes les propriétés de valeur des éléments de liste sur les champs CountyID de leurs objets de respect.
Par conséquent, vous ne devriez pas faire:
lkuResidenceCounty.Properties.ValueMember = row["ResidencyCountyID"].ToString();
mais plutôt
lkuResidenceCounty.Properties.ValueMember = "CountyID";
était parfaitement correct, tant que vous avez correctement identifié le champ que vous essayez de rechercher par la donnée. Une fois que la liste est liée aux données, vous devriez voir les résultats que vous attendez.
Cependant, après avoir examiné votre code, il semble que vous ne correspondiez pas à votre champ. Dans un endroit, vous utilisez ResidencyCountyID et dans un autre, vous utilisez CountyID. C'est probablement votre source de confusion. Déterminez le nom du champ et assurez-vous de définir le ValueMember sur ce nom.
MISE À JOUR
Après avoir lu votre commentaire, vous recherchez la propriété SelectedValue. La propriété SelectedValue indique à la liste de forcer la valeur sélectionnée à l’entrée que vous lui donnez.
En gros, il y a deux choses qui se passent ici. ValueMember indique à la liste ce qu'il faut utiliser comme valeur de votre source de données, et SelectedValue, qui indique à la liste quelle doit être la valeur actuellement sélectionnée.
Pourquoi avez-vous besoin du même LookUpEdit pour avoir deux membres de valeur? Est-il utilisé seul ou dans une grille? Si vous êtes autonome, vous pouvez permuter les deux éditeurs de référentiel en fonction de la ligne en cours. Mais existe-t-il plus de 2 valeurs possibles pour ValueMember? Cela compliquerait aussi les choses.
MISE À JOUR
En regardant votre montage, je pense comprendre un peu plus ce qui se passe. Vous ne souhaitez donc pas modifier votre ValueMember (qui fait référence à une colonne de données), mais plutôt la valeur de l'éditeur? Si tel est le cas, vous devez absolument utiliser EditValue (et non SelectedText, ce qui, à mon avis, n'est pas censé être défini), et l'affecter à la ligne ["quot_ value_field"] comme suit:
lkuResidenceCounty.EditValue = row["ResidencyCountyID"];
Que se passe-t-il quand vous faites cela?