سؤال

قبل أيام قليلة ، أنا كتب عن القضايا مع تنفيذ ListView في ASP.NET.الآن, مع كل قانون مكتوب, أواجه مشكلة في توفير العناصر التي تم تغييرها في ListView.

عدد قليل من الأشياء من ملاحظة:

  • زر حفظ ليس جزءا من ListView ؛ ويدعو GetListViewItems() الأسلوب الذي يتحول الاتصال Save() الأسلوب.
  • على Listview.DataBind() الحدث هو الاحتجاج عند الضغط على زر طلب السجلات إلى تحديث
  • Listview يظهر النص باستخدام <%#Eval("Key.Name") %> و اسمه DropDownList باستخدام <%#Eval("Value") %>

الحصول على العناصر من ListView

public void GetListViewItems()
{
 List<Foo> Result = FooManager.CreateFooList();
 DropDownList ddl = null;
 ListViewItem Item = null;
    try
      {
       foreach (ListViewDataItem item in lvFooList.Items)
         {
          Item = item;
          ddl = ((DropDownList) (Item.FindControl("ddlListOfBars")));
          if (//something is there)
           {
            Foo foo = FooManager.CreateFoo();
            foo.Id = item.DataItemIndex; //shows null
            int barId = int.Parse(ddl.SelectedItem.Value); //works just fine
            foo.barId = barId;
            Result.Add(foo);
           }
         }
      }
   catch (Exception ex)
     {
             //Irrelevant for our purposes
     }
}

ربط البيانات ListView

رمز databind في ListView يظهر هنا في سؤالي السابق.

السؤال(s):

  1. لماذا هو أنه عندما تكرار خلال ListViewDataItem في Listview أن كل عنصر null?
  2. كيف يمكنني استرداد Foo.Id من القاموس ؟
  3. ما آخر قد لا يكون في عداد المفقودين ؟
  4. ما أود أن استخدام إذا أردت أن تحصل على هذا Id برمجيا على أساس ما العناصر التي كانت تظهر ؟ كما هو عليه الآن ، الحالي ListView هو مبين على أساس ما Foos تم اختيارها.تلك Fooالصورة المختارة ثم يتم عرضها, و يمكن للمستخدم تغيير Bar في DropDownList, وضرب حفظ تلك التغييرات هي propogated.

التحديث

كما اتضح, مشكلتي ما leppie قد قال ؛ و هذا هو أن كنت بحاجة إلى تحديد DataKeyNames واستخدام تلك الإبقاء على المعلومات من ListView.

هنا هو رمز أضفت:

try
{
   int DataKeyArrayIndex = 0;
   foreach (ListViewDataItem item in lvFooList.Items)
     {
      Item = item;
      ddl = ((DropDownList) (Item.FindControl("ddlListOfBars")));
      if (//something is there)
       {
        Foo foo = FooManager.CreateFoo();
        Foo tempFoo = FooManager.CreateFoo();
        if (lvFooList != null)
        {
             tempFoo = ((Foo)(lvFooList.DataKeys[DataKeyArrayIndex].Value));
        }

        foo.Id = tempFoo.Id;
        int barId = int.Parse(ddl.SelectedItem.Value); //works just fine
        foo.barId = barId;
        Result.Add(foo);
        DataKeyArrayIndex++;
     }
   }
}

ثم في .ascx ملف أضفت DataKeyNames="Key", مثل:

<asp:ListView ID="lvFooList" runat="server" DataKeyNames="Key">

هذا سمح لي أن استخدام Key من مشاركتي السابقة لتحديد فو كان يجري النظر فيها.

أي نقد من هذا النهج ، وكذلك طرق يجعلها أفضل هي موضع تقدير كبير.

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

المحلول

بعض إجابات سريعة:

  1. الخاص بك تحتاج إلى استخدام ربط البيانات لهذا العمل ، وبعبارة أخرى ، تعيين DataSource و الاتصال DataBind().تحرير:يبدو أنك تفعل ذلك.ولكن تذكر أنها لن تستمر بين postbacks ، DataKey (انظر أدناه).

  2. إذا كنت أتذكر بشكل صحيح, أنت بحاجة إلى تحديد DataKeyNames, و يمكن استرجاعه من DataKey الملكية ثم.

نصائح أخرى

يمكنك أيضا استخدام ListViewDataItem.DataItemIndex الملكية بدلا من الحفاظ على الفهرس الخاص بك ، كما في:

foreach (ListViewDataItem item in MyListView.Items)
{
    // in this example key is a string value
    Foo foo = new Foo(MyListView.DataKeys[item.DataItemIndex].Value as string);

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