سؤال

ولدي قائمة من كائن مخصص، والتي تتكون من قائمة مخصصة.

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

class friend{
  string name;
  string address;
}

وI'trying لربط قائمة من هذه الكائنات إلى GridView ويجب على الشبكة إنشاء لكل صديق عمود وكتابة الاسم في ذلك. إذا كان لدى بعض الناس frined ونفس يجب أن الشبكة لم تخلق عمود منفصل، ولكن استخدام واحد موجود. انت تعرف ما اقصده. (الطبقات هي فقط بعض فئات عينة لتبسيط حالتي)

هل هناك طريقة لتخصيص ملزمة حيوي؟

ويمكنني تغيير تعريفات فئة وهلم جرا، إذا كانت بحاجة إلى ترث من بعض واجهات أو غير ذلك.

وأنا googled الكثير، ولكن لا سبيل المثال حقا يبدو لتغطية هذه القضية.

ويمكن استخدام objectSourceControl حل مشكلتي في بعض الطريق؟

تحديث:

لإعطاء بعض مزيد من المعلومات: في النهاية لدي قائمة من الأشخاص، في حين أن كل شخص في القائمة لديه قائمة من الأصدقاء.

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

ويجب أن يكون الجدول الأعمدة لكل صديق والصفوف هي شخص. حيث كان الشخص لديه صديق الصليب (أو أيا كان) يجب أن توضع في الشبكة.

friend1 friend2
   x              peter
   x       x      adam

وفي لحظة اعتراض الحدث RowDataBound ومنذ الربط يخلق فقط الصفوف مع أسماء وليس الأعمدة، لأن الخاصية الوحيدة على بلدي الكائن الشخص هو اسم. هل هناك طريقة لإجبار ملزمة لننظر من خلال قائمة العقار في الكائنات شخص وإنشاء عمود لكل منهما.

هل كانت مفيدة؟

المحلول

وكنت قادرا على حل هذه باستخدام DataTable وكما مصدر بيانات للحصول على الشبكة. أنا لا أحب فكرة الانتقال من كائن لطيفة نظيفة إلى DataTable، ولكنه يوفر الدعم لديناميكية ملزم التي تحتاج إليها. I تعديل الكائن صديقك لديها عدد قليل من الصانعين. وهذا ما سمح لي لتنظيف إعلان كود ثابت ولكن قد لا يكون من الضروري في implmentation الخاص بك.

والفكرة الأساسية هي أنك سوف الخطوة من خلال كل أصدقائي ممكن، إضافة اسمهم كما DataColumn في DataTable و، ثم ملء البيانات لكافة الكائنات شخص وأصدقاء كل منهما. ربما يمكن أن يكتب هذا العمل في التكرار واحد من وجوه allPerson لكن فضلت اثنين من التكرار لجعل رمز أسهل للقراءة.

ويتم كتابة حل لج # 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.

إذا يجب أن تعمل مع الكائنات في شكلها الحالي، إنشاء قائمة المدمجة من الأصدقاء قبل البدء يمكن أن تساعد أيضا من خلال توفير قائمة العمود. هل يمكن بعد ذلك ربط كل عمود لاستدعاء دالة التي يمكن محاولة للعثور على الشخص عمود في صفوف صديق القائمة.

وليست جميلة، ولكن يمكن أن تعمل ...

وإلقاء نظرة على جوابي على سؤال مماثل "متداخلة ملزمة '<لأ href =" https://stackoverflow.com/questions/276126/best-way-to-databind-a-list-with-sub- ذات الصلة المحتوى مقابل سبيل المثال-SOS-الأسئلة # 276240 "> هنا .

ويمكنك أيضا أن مجرد استخدام معالج الحدث RowDataBound للقيام الارتباطات المعقدة.

واستخدم ما يلي:

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

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top