10

2時間以上検索しましたが、答えが見つかりません。だから私はここでそれを試します:

モデルのリストを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; }
}
4

4 に答える 4

7

コードに 1 つのメソッド (実際にはイベント) を追加しただけで、機能しています。

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 -> プロパティを右クリックします。

[プロパティ] ウィンドウの上部で、[イベント] (稲妻アイコン) をクリックします。

下のイベント リスト (Property Changed の下) で Format を探し、そこにイベント名を入力します。たとえば、 ComboBoxFormat と入力し、Enter キーを押します。それでおしまい ;)

于 2013-09-15T22:01:14.990 に答える
0

OK、DisplayMemberが機能しています。「Home」をそのオブジェクトとしてのValueMemberとして使用することはできません。そのプロパティのいずれか(StreetName、GeoLocationX、GeoLocationY)をポイントする必要があります。

public partial class Form1 : Form
    {

        private List<UserDataModel> userData = new List<UserDataModel>();

        public Form1()
        {
            InitializeComponent();
            MyInit();
        }

        public void MyInit()
    {
        var mymodel = new UserDataModel("Derek", "999-999", new HomeDataModel("Sesame Street", 111, 222));

        var mymodel1 = new UserDataModel("John", "999-999", new HomeDataModel("Tin Can Alley", 333, 444));

        userData.Add(mymodel);
        userData.Add(mymodel1);

        BindingSource bs = new BindingSource();
        bs.DataSource = userData;

        comboBox1.DataSource = bs;
        comboBox1.DisplayMember = "Home.StreetName";

    }
}

internal sealed class UserDataModel
{
    public string Name { get; set; }
    public string Phone { get; set; }
    public HomeDataModel Home { get; set; }

    public UserDataModel()
    {

    }

    public UserDataModel(string name, string phone, HomeDataModel home)
    {
        this.Name = name;
        this.Phone = phone;
        this.Home = home;
    }
}

internal sealed class HomeDataModel
{
    public string StreetName { get; set; }
    public int GeoLocationX { get; set; }
    public int GeoLocationY { get; set; }

    public HomeDataModel()
    {

    }

    public HomeDataModel(string streetname, int x, int y)
    {
        this.StreetName = streetname;
        this.GeoLocationX = x;
        this.GeoLocationY = y;

    }
}
于 2012-12-05T14:57:52.260 に答える
0

明確にするために: ComboBox は、デフォルトで常にホスティング フォーム BindingContext を使用します。私はそのコードでそれをテストしました:

            var bc = comboBox1.BindingContext;
        if (bc == this.BindingContext)
        {
            if (bc.Equals(this.BindingContext))
            {
                MessageBox.Show("combobox always use same binding context as his hosting form");
            }
        }

メッセージボックスが表示されました。

于 2012-12-05T16:54:10.283 に答える
0

ここに同様の質問があります。BindingContextマークされた回答では、彼らがのを に設定FormしていることがわかりComboBoxます。

//...
comboBox1.BindingContext = this.BindingContext;

それが役立つことを願っています...

于 2012-12-05T14:37:48.057 に答える