문제

사용자 정의 목록으로 구성된 사용자 정의 객체 목록이 있습니다.

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

class friend{
  string name;
  string address;
}

나는이 객체의 목록을 그리드 뷰에 바인딩하고 그리드가 각 친구에 대해 열을 만들고 그 안에 이름을 작성해야합니다. 어떤 사람들은 동일한 쇄골을 가지고 있다면 그리드는 별도의 열을 만들지 않지만 기존 열을 사용해야합니다. 당신은 내가 무슨 뜻인지 알고 있습니다. (수업은 내 케이스를 단순화하기위한 샘플 클래스 일뿐입니다)

바인딩을 동적으로 사용자 정의하는 방법이 있습니까?

일부 인터페이스 등에서 상속 해야하는 경우 클래스 정의 등을 변경할 수 있습니다.

나는 많이 구글을 get 다. 그러나 실제로이 사건을 다루는 예제는 없었습니다.

ObjectSourceControl을 사용하면 어떤 식 으로든 내 문제를 해결할 수 있습니까?

업데이트:

더 많은 정보를 제공하기 위해 : 결국에는 사람 목록이 있고, 목록의 각 사람은 친구 목록이 있습니다.

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

테이블에는 각 친구에 대한 열이 있어야하며 행은 사람입니다. 사람이 친구가있는 경우 십자가 (또는 무엇이든)를 그리드에 넣어야합니다.

friend1 friend2
   x              peter
   x       x      adam

현재 RowDatabound 이벤트를 가로 채고 바인딩은 열이 아닌 이름으로 만 행을 생성하기 때문에 내 사람 객체의 유일한 속성이 이름이기 때문입니다. 바인딩이 사람 객체의 목록 속성을 살펴보고 각각의 열을 만들도록 강요하는 방법이 있습니까?

도움이 되었습니까?

해결책

그리드의 데이터 소스로 데이터 가능을 사용하여 이것을 해결할 수있었습니다. 나는 멋진 깨끗한 물체에서 데이터 가능으로 이동한다는 아이디어가 마음에 들지 않지만 필요한 동적 바인딩을 지원합니다. 나는 당신의 친구 객체를 수정하여 몇 개의 생성자가 있습니다. 이를 통해 정적 코드 선언을 정리할 수 있었지만 이행에는 필요하지 않을 수 있습니다.

기본 아이디어는 가능한 모든 친구들을 밟고 데이터 가능한 데 데이터 컬럼으로 이름을 추가 한 다음 모든 사람 객체와 해당 친구의 데이터를 작성한다는 것입니다. 이것은 아마도 Allperson Object의 단일 반복으로 작동하도록 작성 될 수 있지만 코드를 쉽게 읽을 수 있도록 두 가지 반복을 선호했습니다.

이 솔루션은 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     |      |      |     |     |
-------------------------------------------------   

다른 팁

GridView에 행렬 / 크로스 타브를 표시하려고하는 것처럼 들립니다. 이와 호환되는 형식으로 데이터를 검색하는 것이 더 쉬울 수 있습니다. SQL Server를 사용하는 경우 CrosStab 쿼리 작성을 고려할 수 있습니다.

현재 양식의 객체와 함께 작업 해야하는 경우 시작하기 전에 병합 된 친구 목록을 작성하면 열 목록을 제공하여 도움이 될 수 있습니다. 그런 다음 각 열에 각 열로 결합하여 행 친구 목록에서 열 사람을 찾으려고 시도 할 수 있습니다.

아름답 지 않지만 작동 할 수 있습니다 ...

비슷한 '중첩 된 바인딩'질문에 대한 내 대답을 살펴보십시오. 여기.

RowDatabound 이벤트 핸들러를 사용하여 복잡한 바인딩을 수행 할 수도 있습니다.

다음을 사용하십시오.

Databinder.eval (Container.dataitem, "ppp.ppp")

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top