A few days ago, I wrote about issues with implementing a ListView in ASP.NET. Now, with all of the other code written, I'm having trouble saving changed items in a ListView.
A few things of note:
GetListViewItems()
method, which in turns call the Save()
method.Listview.DataBind()
event is invoked when a button is pressed requesting the records to be updated<%#Eval("Key.Name") %>
and a named DropDownList
using <%#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
}
}
The code to databind the ListView is shown here in my previous question.
ListViewDataItem
in the Listview
that each item is null
?Foo.Id
from the Dictionary?Id
Programmatically based on what items were shown? As it is now, the current ListView is shown based on what Foo
s were selected. Those Foo
s selected are then displayed, and the user can change the Bar
in the DropDownList
, hit Save, and those changes are propogated.As it turns out, my problem was what leppie had said; and that was that I needed to specify DataKeyNames
and use those to retain the information from the ListView.
Here's the code I added:
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++;
}
}
}
And then in the .ascx
file, I added DataKeyNames="Key"
, like so:
<asp:ListView ID="lvFooList" runat="server" DataKeyNames="Key">
This allowed me to use the Key
from my previous post to determine which Foo was being looked at.
Any critiques of this approach, as well as methods for making it better are greatly appreciated.
Some quick answers:
Your need to use databinding for that to work, in other words, assign to DataSource
and call DataBind()
. EDIT: seems you are doing that. But remember it wont persist between postbacks, just the DataKey
(see below).
If I recall correctly, you need to specify the DataKeyNames
, and they can be retrieved from the DataKey
property then.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With