Frage

Ich habe eine Liste der benutzerdefinierten Objekt, das aus einer benutzerdefinierten Liste bestehen.

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

class friend{
  string name;
  string address;
}

I'trying eine Liste dieser Objekte zu einem Gridview zu binden und das Gitter sollte für jeden Freund eine Spalte erstellen und den Namen in ihm schreiben. Wenn einige Leute die gleiche haben frined das Gitter nicht eine separate Spalte erstellen sollte, sondern die bestehende verwenden. Du weißt was ich meine. (Die Klassen sind nur einige Beispielklassen meinem Fall zu vereinfachen)

Gibt es eine Möglichkeit, um dynamisch die Bindung anpassen?

kann ich die Klassendefinitionen ändern und so weiter, wenn sie von einigen Schnittstellen oder so weiter erben müssen.

gegoogelt ich viel, aber kein Beispiel wirklich schien, diesen Fall zu decken.

Könnte die Verwendung eines objectSourceControl mein Problem in irgendeiner Weise lösen?

Update:

Um mehr Informationen zu geben: Am Ende habe ich eine Liste von Personen, während jede Person in der Liste eine Liste von Freunden hat.

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

sollten Die Tabellenspalten haben für jeden Freund und die Reihen sind die Person. Hat eine Person einen Freund ein Kreuz hat (oder was auch immer) muss in dem Netz gestellt werden.

friend1 friend2
   x              peter
   x       x      adam

Im Moment ein Schnittpunkt des RowDataBound Ereignis und da die Bindung schafft nur die Zeilen mit den Namen und die Spalten nicht, weil die einzige Eigenschaft auf meiner Person Objekt ist der Name. Gibt es einen Weg, um die Bindung zu zwingen, die List-Eigenschaft in der Person Objekten zu schauen und eine Spalte für jeden von ihnen erstellen.

War es hilfreich?

Lösung

Ich war in der Lage zu lösen dieses eine Datatable als Datenquelle für das Grid verwenden. Ich mag die Idee nicht auf eine Datentabelle von einem schönen, sauberen Objekt bewegt, aber es bietet Unterstützung für die dynamische Bindung Sie benötigen. Ich veränderte Freundes Objekt einige Konstrukteure zu haben. Das erlaubte mir, die statische Code-Erklärung zu bereinigen, aber vielleicht in Ihrem implmentation nicht notwendig sein.

Die Grundidee ist, dass Sie durch alle möglichen Freunde Schritt wird, fügen Sie ihre Namen als Datacolumn in einem Datatable, dann in den Daten für alle Personen Objekte und ihre jeweiligen Freunde füllen. Dies ist wahrscheinlich geschrieben werden könnte in einer einzigen Iteration des allperson Objekts zu arbeiten, aber ich lieber zwei Iterationen den Code leichter lesbar zu machen.

Die Lösung wird für c # 3.5 geschrieben, sondern durch Änderung der statische Datendeklaration für ältere Versionen umgewandelt werden könnte. Ich hoffe, das hilft.

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;
    }
}

Edit: Ich habe vergessen, hinzuzufügen, wie das gemacht wird.

-------------------------------------------------
| 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     |      |      |     |     |
-------------------------------------------------   

Andere Tipps

Es klingt wie Sie versuchen, eine Matrix / Kreuztabelle in Gridview angezeigt werden soll. Sie finden es einfacher, Ihre Daten in einem Format, mehr kompatibel zu diesem abrufen greifen. Sie könnte in Erwägung ziehen eine Kreuztabellenabfrage zu schreiben, wenn Sie SQL Server verwenden.

Wenn Sie mit den Objekten in ihrer derzeitigen Form arbeiten müssen, eine vereinigte Liste von Freunden erstellen, bevor auch durch die Bereitstellung der Spaltenliste helfen könnte. Sie könnten dann zu jeder Spalte zu einem Funktionsaufruf binden, die versuchen könnten die Spalte Person in der Reihen der Freundesliste zu finden.

Nicht schön, aber könnte ...

Haben Sie einen Blick auf meine Antwort auf eine ähnliche ‚verschachtelt Bindung‘ Frage hier .

Sie können auch einfach die RowDataBound Event-Handler komplexe Bindungen zu tun.

Verwenden Sie die folgende:

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top