Winforms zone de liste déroulante de la liaison de données DisplayMember de sous-objet de Propriété
j'ai cherché pendant 2 heures ou plus et ne pouvez pas trouver une réponse. J'ai donc essayer ici:
Je veux savoir comment (et si elle peut être effectuée à tous) puis-je databind une Liste de Modèles à un WinForms zone de liste déroulante, et d'utiliser une propriété d'une Propriété du Modèle (c'est dans la Liste) comme DisplayMember ? Voir le Code ici:
public partial class Form1 : Form
{
private List<UserDataModel> userData = new List<UserDataModel>();
public Form1()
{
InitializeComponent();
MyInit();
}
public void MyInit()
{
var userDataModel1 = new UserDataModel();
userDataModel1.Name = "Mike";
userDataModel1.Phone = "555-666";
userDataModel1.Home = new HomeDataModel();
userDataModel1.Home.StreetName = "MikeStreet";
userDataModel1.Home.GeoLocationX = 111;
userDataModel1.Home.GeoLocationY = 222;
var userDataModel2 = new UserDataModel();
userDataModel2.Name = "Jonathan";
userDataModel2.Phone = "777-888";
userDataModel2.Home = new HomeDataModel();
userDataModel2.Home.StreetName = "JonathanStreet";
userDataModel2.Home.GeoLocationX = 333;
userDataModel2.Home.GeoLocationY = 444;
userData.Add(userDataModel1);
userData.Add(userDataModel2);
//This works as usually:
/*
comboBox1.DisplayMember = "Name";
comboBox1.ValueMember = "Home";
comboBox1.DataSource = userData;
*/
//But this works not (either with comboBox1.DataBindings.Add() nor with BindingSource):
comboBox1.DisplayMember = "Home.StreetName";
comboBox1.ValueMember = "Home";
comboBox1.DataSource = userData;
//To drive me crazy, THAT shit works:
textBox1.DataBindings.Add("Text", userData, "Home.StreetName");
/*
So how can i use a String-Property of a SubObject as ComboBox-DisplayMember ???
BTW: To rebuild the sample, you only need a normal Forms Application and
then drop a ComboBox and a TextBox on it. Copy that code here, and run it.
*/
}
}
internal sealed class UserDataModel
{
public string Name { get; set; }
public string Phone { get; set; }
public HomeDataModel Home { get; set; }
}
internal sealed class HomeDataModel
{
public string StreetName { get; set; }
public int GeoLocationX { get; set; }
public int GeoLocationY { get; set; }
}
- Ce que vous voulez voir comme ValueMember?
- Comme ValueMember-je utiliser à la Maison elle-même. Qui fonctionne toujours très bien, parce que de ValueMember = "Home" et pas ValueMember = "la Maison.GeoLocationX" par exemple
Vous devez vous connecter pour publier un commentaire.
Venez d'ajouter à votre code d'une méthode (cas en fait), et ça fonctionne.
Pour créer cette méthode (de l'événement), allez à votre formulaire dans une [Design] mode, cliquez du bouton droit sur la zone de liste déroulante -> Propriétés.
Dans le haut de la fenêtre Propriétés, cliquez sur les Événements (icône de foudre),
look pour le Format dans la liste des événements ci-dessous (en vertu de la Propriété a Changé) et le type il y a quelques nom de l'événement, disons: ComboBoxFormat , et appuyez sur Enter.
C'est ça 😉
Ici est une question semblable. Dans le marqué réponse, vous pouvez voir qu'ils ont mis le
BindingContext
de laForm
sur leComboBox
et il semble fonctionner pour eux...Espère que ça aide...
Ok, j'ai la DisplayMember de travail. Vous ne pouvez pas utiliser "la Maison" comme un ValueMember comme un objet, vous aurez à point à l'une de ses propriétés(StreetName, GeoLocationX, GeoLocationY).
À préciser: zone de liste déroulante utilise toujours l'hébergement formes BindingContext par défaut. Je l'ai testé avec ce code:
et la boîte de message a montré.