ListView DataItem يظهر Null
سؤال
قبل أيام قليلة ، أنا كتب عن القضايا مع تنفيذ 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):
- لماذا هو أنه عندما تكرار خلال
ListViewDataItem
فيListview
أن كل عنصرnull
? - كيف يمكنني استرداد
Foo.Id
من القاموس ؟ - ما آخر قد لا يكون في عداد المفقودين ؟
- ما أود أن استخدام إذا أردت أن تحصل على هذا
Id
برمجيا على أساس ما العناصر التي كانت تظهر ؟ كما هو عليه الآن ، الحالي ListView هو مبين على أساس ماFoo
s تم اختيارها.تلك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
من مشاركتي السابقة لتحديد فو كان يجري النظر فيها.
أي نقد من هذا النهج ، وكذلك طرق يجعلها أفضل هي موضع تقدير كبير.
المحلول
بعض إجابات سريعة:
الخاص بك تحتاج إلى استخدام ربط البيانات لهذا العمل ، وبعبارة أخرى ، تعيين
DataSource
و الاتصالDataBind()
.تحرير:يبدو أنك تفعل ذلك.ولكن تذكر أنها لن تستمر بين postbacks ،DataKey
(انظر أدناه).إذا كنت أتذكر بشكل صحيح, أنت بحاجة إلى تحديد
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
}