none
DataGridView怎样绑定内嵌有对象的对象列表? RRS feed

  • 问题

  • 试过了几种方法都解决不了这个问题:让DataGridView的某一列绑定到对象的内嵌对象的某个
    属性(如Person.Contacts.AddressLine1),因为DataGridView默认显示为调用绑定对象的属性的ToString()方法的返回结果(如Person.Name.ToString()),也就是说它不会进一步深入到一个属性对象的属性去(即Contacts.AddressLine1)调用其ToString()方法(即AddressLine1.ToString())。
          而对于TextBox, 这样绑定:
                              this.txtAddressLine1.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.bindingSourceCollection, "Contacts.AddressLine1", true));
          上面的语句可以正确地显示Person.Contacts.AddressLine1的内容。
          请问有什么替代方法可以使DataGridView也达到这样的效果?
    2008年6月4日 9:52

答案

  • DataGriew 好像不支持这样的功能.

    具体请看:http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=834204&SiteID=1

     

     

    2008年6月4日 12:52
  • 谢谢楼上的朋友!

    自己找了一个方法,参考了下面这篇文章:
    http://www.informit.com/articles/article.aspx?p=446453&seqNum=5

    添加一个DataGridViewColumn "UserIDColumn", 但是设置其Visible属性为false, 并增加如下事件处理,搞定了!!
           
    Code Snippet

    private void dataGridView1_RowsAdded(object sender, DataGridViewRowsAddedEventArgs e)
            {
                for (int i = 0; i < e.RowCount; i++)
                {
                    DataGridViewRow row = dataGridView1.Rows[e.RowIndex + i];

                    // 获得各行的主键,到BindingSource所关联的对象列表中搜索该行绑定对象。
                    if (row.Cells["UserIDColumn"].Value != null)
                    {
                        string key = row.Cells["UserIDColumn"].Value.ToString();
                        List<Person> group = (List<Person>)bindingCollection.DataSource;
                        Person p = Person.FindFromPersonList(group, key);

                        if (p != null)
                        {
                            row.Cells["ContactColumn"].Value = string.Format("{0} : {1} : {2}",
                                p.Contact.AddressLine1,
                                p.Contact.AddressLine2,
                                p.Contact.PhoneNumber);
                        }
                    }
                }
            }





    2008年6月5日 4:00

全部回复

  • DataGriew 好像不支持这样的功能.

    具体请看:http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=834204&SiteID=1

     

     

    2008年6月4日 12:52
  • 谢谢楼上的朋友!

    自己找了一个方法,参考了下面这篇文章:
    http://www.informit.com/articles/article.aspx?p=446453&seqNum=5

    添加一个DataGridViewColumn "UserIDColumn", 但是设置其Visible属性为false, 并增加如下事件处理,搞定了!!
           
    Code Snippet

    private void dataGridView1_RowsAdded(object sender, DataGridViewRowsAddedEventArgs e)
            {
                for (int i = 0; i < e.RowCount; i++)
                {
                    DataGridViewRow row = dataGridView1.Rows[e.RowIndex + i];

                    // 获得各行的主键,到BindingSource所关联的对象列表中搜索该行绑定对象。
                    if (row.Cells["UserIDColumn"].Value != null)
                    {
                        string key = row.Cells["UserIDColumn"].Value.ToString();
                        List<Person> group = (List<Person>)bindingCollection.DataSource;
                        Person p = Person.FindFromPersonList(group, key);

                        if (p != null)
                        {
                            row.Cells["ContactColumn"].Value = string.Format("{0} : {1} : {2}",
                                p.Contact.AddressLine1,
                                p.Contact.AddressLine2,
                                p.Contact.PhoneNumber);
                        }
                    }
                }
            }





    2008年6月5日 4:00