ListView DataItem показывает ноль
Вопрос
Несколько дней назад я писал о проблемах с реализацией 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
Код для привязки данных ListView: показано здесь в моем предыдущем вопросе.
Вопросы):
- Почему, когда я перебираю
ListViewDataItem
вListview
что каждый предметnull
? - Как я могу получить
Foo.Id
из словаря? - Что еще мне может не хватать?
- Что бы я использовал, если бы хотел получить это?
Id
Программно на основе того, какие элементы были показаны?Как и сейчас, текущий ListView отображается на основе того, чтоFoo
были выбраны.ТеFoo
затем отображаются выбранные параметры, и пользователь может изменитьBar
вDropDownList
, нажмите «Сохранить», и эти изменения будут применены.
Обновлять
Как выяснилось, моя проблема заключалась в том, что Леппи сказал;и это было то, что мне нужно было указать 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
из моего предыдущего поста чтобы определить, на какой Foo смотрели.
Мы будем очень признательны за любую критику этого подхода, а также методов его улучшения.
Решение
Несколько быстрых ответов:
Чтобы это работало, вам необходимо использовать привязку данных, другими словами, назначить
DataSource
и позвониDataBind()
.РЕДАКТИРОВАТЬ:кажется, ты это делаешь.Но помните, что это не будет сохраняться между обратными передачами, а только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
}