Несколько дней назад я писал о проблемах с реализацией 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
}
}
DataBinding ListView
Код для привязки списка ListView показан здесь в моем предыдущем вопросе.
Вопрос (ы):
- Почему это происходит, когда я повторяю через
ListViewDataItem
вListview
, что каждый элементnull
? - Как я могу получить
Foo.Id
из Словаря? - Что еще я могу потерять?
- Что бы я использовал, если бы хотел, чтобы этот
Id
программно был основан на том, какие предметы были показаны? Как и сейчас, текущий ListView показан на основе того, что было выбраноFoo
. Затем отображаются теFoo
, и пользователь может изменитьBar
вDropDownList
, нажать "Сохранить", и эти изменения распространяются.
Update
Как выясняется, моя проблема заключалась в том, что сказал 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.
Любые критические замечания по этому подходу, а также методы для его лучшего использования с благодарностью.