几天前,我wrote about issues在ASP.NET中实现了ListView。现在,在编写了所有其他代码的情况下,我无法在ListView中保存更改的项目。
注意事项:
GetListViewItems()
方法,后者又调用Save()
方法。Listview.DataBind()
事件<%#Eval("Key.Name") %>
和named DropDownList
使用<%#Eval("Value") %>
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的代码是shown here in my previous question。
ListViewDataItem
Listview
中的每个项目null
时? Foo.Id
? Id
,我会使用什么?就像现在一样,当前ListView基于选择的Foo
来显示。然后会显示所选的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
from my previous post来确定正在查看哪个Foo。
对此方法的任何批评以及使其更好的方法都非常感谢。
答案 0 :(得分:12)
一些快速回答:
您需要使用数据绑定才能工作,换句话说,分配给DataSource
并致电DataBind()
。编辑:似乎你正在这样做。但请记住,它不会在回发之间持续存在,只有DataKey
(见下文)。
如果我没记错,您需要指定DataKeyNames
,然后可以从DataKey
属性中检索它们。
答案 1 :(得分:6)
您也可以使用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
}