3

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

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

class friend{
  string name;
  string address;
}

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

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

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

我用谷歌搜索了很多,但似乎没有一个例子能真正涵盖这种情况。

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

更新:

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

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

该表应该有每个朋友的列,行是人。如果一个人有朋友,则需要在网格中放置一个十字架(或其他)。

friend1 friend2
   x              peter
   x       x      adam

目前拦截了 RowDataBound 事件,并且由于绑定只创建带有名称的行而不是列,因为我的 person 对象上的唯一属性是名称。有没有办法强制绑定查看人员对象中的列表属性并为每个对象创建一列。

4

4 回答 4

4

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

基本思想是,您将逐步遍历所有可能的朋友,将他们的名字作为 DataColumn 添加到 DataTable 中,然后为所有人员对象及其各自的朋友填写数据。这可能被编写为在 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     |      |      |     |     |
-------------------------------------------------   
于 2010-01-13T19:25:41.530 回答
1

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

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

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

于 2008-11-17T13:17:50.430 回答
0

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

于 2010-01-08T01:49:17.120 回答
-1

使用以下内容:

DataBinder.Eval(Container.DataItem,"PPP.PPP")

于 2009-02-28T07:31:48.703 回答