Несколько дней назад я написал о проблемах с реализацией 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
s были выбраны. Затем отображаются выбранные Foo
, и пользователь может изменить Bar
в DropDownList
, нажать Сохранить, и эти изменения распространяются.
Обновление
Как оказалось, моя проблема заключалась в том, что сказал 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
из моего предыдущего поста , чтобы определить, на какого Foo смотрят.
Любая критика этого подхода, а также методы его совершенствования приветствуются.