gpt4 book ai didi

c# - Winforms ComboBox DataBinding DisplayMember 到 SubObject 属性

转载 作者:可可西里 更新时间:2023-11-01 09:11:57 25 4
gpt4 key购买 nike

我搜索了 2 小时或更长时间,但找不到答案。所以我在这里试试:

我想知道如何(如果可以的话)我可以将模型列表数据绑定(bind)到 WinForms ComboBox,并将模型属性(在列表中)的属性用作 DisplayMember 吗?请参阅此处的代码:

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; }
}

最佳答案

只需将一个方法(实际上是事件)添加到您的代码中,它就可以正常工作。

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.
*/
}

// To add this method - follow to my instructions below
private void ComboBoxFormat(object sender, ListControlConvertEventArgs e)
{
e.Value = ((UserDataModel)e.ListItem).Home.StreetName;
}
}

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; }
}

要创建此方法(事件),请在 [设计] 模式下转到您的表单,右键单击 ComboBox -> Properties。

在“属性”窗口的顶部,单击“事件”(闪电图标),

在下面的事件列表中查找 Format(在 Property Changed 下)并在其中键入一些事件名称,比方说:ComboBoxFormat,然后按 Enter。就是这样;)

关于c# - Winforms ComboBox DataBinding DisplayMember 到 SubObject 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13724565/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com