Winforms ComboBox-Binding DisplayMember zu Unterobjekt-Eigenschaft
suchte ich für 2 Stunden oder mehr und kann keine Antwort finden. Also versuche ich es hier:
Möchte ich wissen, wie (und ob Sie überhaupt getan werden) kann ich databind eine Liste der Modelle, um eine WinForms-ComboBox-Steuerelement, und verwenden Sie eine Eigenschaft, eine Eigenschaft des Modells (das ist in der Liste), die als DisplayMember ? Siehe Code hier:
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; }
}
Was Sie wollen, um zu sehen, wie ValueMember?
Als ValueMember ich benutze zu Hause selbst. Das funktioniert immer gut, weil der ValueMember = "Home" und nicht ValueMember = "Home.GeoLocationX" z.B.
Als ValueMember ich benutze zu Hause selbst. Das funktioniert immer gut, weil der ValueMember = "Home" und nicht ValueMember = "Home.GeoLocationX" z.B.
InformationsquelleAutor Marcel | 2012-12-05
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nur Hinzugefügt, um den code-Methode (Ereignis), und es funktioniert.
Um diese Methode zu erstellen (event), gehen Sie zu Ihrer form in eine [Design] - Modus, Rechtsklick auf die ComboBox -> Eigenschaften.
In der Spitze des Eigenschaften-Fenster, klicken Sie auf Ereignisse (Blitz-Symbol),
Blick für das Format in der Liste Ereignisse unten (unter Eigenschaft Geändert hat), und geben Sie es einige event-Namen, sagen wir mal: ComboBoxFormat , und drücken Sie die EINGABETASTE.
Das ist es 😉
InformationsquelleAutor Eliran Kuta
Hier ist eine ähnliche Frage. In die markierte Antwort, können Sie sehen, dass Sie die
BindingContext
desForm
auf dieComboBox
und es scheint für Sie zu funktionieren...Hoffe, das hilft...
InformationsquelleAutor Alechandro
Ok, ich habe die DisplayMember-arbeiten. Sie cant verwenden Sie die "Home" als ValueMember wie Ihr ein Objekt, müssen Sie an einem Punkt seiner Eigenschaften(StreetName, GeoLocationX, GeoLocationY).
Entschuldigung, ich werde das wieder.
Das Problem mit dem HomeDataModel. Konnte Sie nicht zählen die drei Eigenschaften, die als Teil der UserDataModel Klasse? Ich denke, das würde das Problem beheben.
Vielen Dank für Ihre freundlichen Bemühungen, Derek ! Klar, ich KANN die Eigenschaften hinzufügen, um die UserDataModel, aber DAS schadet der Basis meiner Frage 🙂 Und ich habe auch viele andere ComboBoxes müssen DisplayMember von Untereigenschaften. Wenn ich die ganzen Klassen in einem, würde Sie nennen das ein "gutes software-design" ? 🙂
Ich hatte keine Vorstellung von dem rest der Anwendung. @Marcel. Seine ein Interessantes problem. Ich werde schauen an es wieder, irgendwann heute.
InformationsquelleAutor Derek
Klären: ComboBox verwendet immer die hosting-Formen BindingContext-pro Standard. Getestet habe ich es mit diesem code:
und die message-box gezeigt hat.
InformationsquelleAutor Marcel