asp.Net GridView使用嵌套List绑定自定义对象

时间:2008-11-17 09:05:37

标签: asp.net data-binding gridview gridviewcolumn custom-object

我有一个自定义对象列表,它包含一个自定义列表。

class person{
  string name;
  int age;
  List<friend> allMyFriends;
}

class friend{
  string name;
  string address;
}

我试图将这些对象的列表绑定到GridView,并且Grid应该为每个朋友创建一个列并在其中写入名称。如果某些人具有相同的frined,则网格不应创建单独的列,而是使用现有的列。你知道我的意思。 (这些类只是一些示例类来简化我的情况)

有没有办法动态自定义绑定?

我可以更改类定义等,如果它们需要从某些接口继承等等。

我搜索了很多,但似乎没有任何例子可以覆盖这种情况。

使用objectSourceControl可以以某种方式解决我的问题吗?

更新

提供更多信息: 最后,我有一个人员列表,而列表中的每个人都有一个朋友列表。

List<person> allPerson = new List<person>();
// fill the list
Grid.DataSource = allPerson;
Grid.DataBind()

该表应该包含每个朋友的列,而行是人。如果某人有朋友,则需要将十字架(或其他任何东西)放置在网格中。

friend1 friend2
   x              peter
   x       x      adam

此时拦截RowDataBound事件并且由于绑定仅创建具有名称而不是列的行,因为我的person对象上的唯一属性是名称。有没有办法强制绑定查看person对象中的List属性,并为每个对象创建一个列。

5 个答案:

答案 0 :(得分:4)

我能够使用DataTable作为Grid的数据源来解决这个问题。我不喜欢从一个漂亮的干净对象转移到DataTable的想法,但它提供了对所需动态绑定的支持。我修改了你的朋友对象以拥有一些构造函数。这允许我清理静态代码声明,但在你的实现中可能没有必要。

基本思想是,您将逐步浏览所有可能的朋友,在DataTable中将其名称添加为DataColumn,然后填写所有人物对象及其各自朋友的数据。这可能是在allPerson对象的单次迭代中编写的,但我更喜欢两次迭代以使代码更容易阅读。

该解决方案是针对c#3.5编写的,但可以通过更改静态数据声明来转换为旧版本。我希望这会有所帮助。

public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        // setup your person object with static data for testing
        List<person> allPerson = new List<person>()
        {
            new person() 
            { 
                name = "Dan", 
                age = 21, 
                allMyFriends = new List<friend>() { new friend("James"), new friend("John"), new friend("Matt") } 
            }, 
            new person() 
            { 
                name = "James", 
                age = 21, 
                allMyFriends = new List<friend>() { new friend("Dan"), new friend("Matt"), new friend("Tom") } 
            }, 
            new person() 
            { 
                name = "John", 
                age = 21, 
                allMyFriends = new List<friend>() { new friend("Dan") } 
            }, 
            new person() 
            { 
                name = "Matt", 
                age = 21, 
                allMyFriends = new List<friend>() { new friend("Dan"), new friend("James") } 
            }, 
            new person() 
            { 
                name = "Tom", 
                age = 21, 
                allMyFriends = new List<friend>() { new friend("James") } 
            }
        };

        System.Data.DataTable dt = new System.Data.DataTable();
        dt.Columns.Add("Name");
        dt.Columns.Add("Age");

        foreach (person p in allPerson)
        {
            // step through each person and look at their friends
            foreach (friend f in p.allMyFriends)
            {
                // look to see if this friend has a column already
                if (!dt.Columns.Contains(f.name))
                {
                    dt.Columns.Add(f.name);
                }
            }
        }

        foreach (person p in allPerson)
        {
            // create the datarow that represents the person
            System.Data.DataRow dr = dt.NewRow();
            dr["Name"] = p.name;
            dr["Age"] = p.age;

            // find the friends and mark them
            foreach (friend f in p.allMyFriends)
            {
                dr[f.name] = "X";
            }

            dt.Rows.Add(dr);
        }

        // fill the list
        this.Grid.DataSource = dt;
        this.Grid.DataBind();

    }
}

public class person
{
    public string name;
    public int age;
    public List<friend> allMyFriends = new List<friend>();
}

public class friend
{
    public string name;
    public string address;

    public friend()
    {

    }

    public friend(string name)
    {
        this.name = name;
    }

    public friend(string name, string address)
    {
        this.name = name;
        this.address = address;
    }
}

编辑: 我忘了添加渲染方式。

-------------------------------------------------
| Name  | Age | James | John | Matt | Dan | Tom |
-------------------------------------------------
| Dan   | 21  | X     | X    | X    |     |     |
| James | 21  |       |      | X    | X   | X   |
| John  | 21  |       |      |      | X   |     |
| Matt  | 21  | X     |      |      | X   |     |
| Tom   | 21  | X     |      |      |     |     |
-------------------------------------------------   

答案 1 :(得分:1)

听起来你正试图在GridView中显示矩阵/交叉表。您可能会发现以更加兼容的格式获取数据更容易。如果您使用的是SQL服务器,可以考虑编写交叉表查询。

如果您必须使用当前表单中的对象,则在启动之前创建合并的朋友列表也可以通过提供列列表来提供帮助。然后,您可以将每个列绑定到函数调用,该函数调用可能会尝试在行朋友列表中查找列人。

不漂亮,但可以工作......

答案 2 :(得分:0)

查看我对类似'嵌套绑定'问题here的答案。

答案 3 :(得分:0)

您也可以使用RowDataBound事件处理程序来执行复杂绑定。

答案 4 :(得分:-1)

使用以下内容:

的DataBinder.Eval(的Container.DataItem, “PPP.PPP”)