Listview DataItem Zeigt Null
Frage
Vor ein paar Tagen, ich schrieb über Themen mit einer Listview in ASP.NET implementieren. Nun, mit all dem anderen Code geschrieben, ich habe Probleme beim Speichern geändertene Elemente in einem Listview.
Ein paar Dinge zu erwähnen:
- Die Schaltfläche Speicher ist nicht Teil des Listview ordnungsgemäßen; es ruft die
GetListViewItems()
Methode, die dieSave()
Methode abwechselnd nennen. - Das
Listview.DataBind()
Ereignis aufgerufen wird, wenn eine Taste gedrückt um die Datensätze anfordert aktualisiert werden - Die Listenansicht zeigt Text mit
<%#Eval("Key.Name") %>
und namensDropDownList
mit<%#Eval("Value") %>
Getting die Elemente aus dem 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
}
}
Datenbindung das Listview
Der Code der Listview Databind ist hier in meiner vorherigen Frage gezeigt .
Frage (n):
- Warum ist es, dass, wenn ich durch die
ListViewDataItem
imListview
iterieren, die jedes Elementnull
ist? - Wie kann ich die
Foo.Id
aus dem Wörterbuch abrufen? - Was sonst könnte ich fehlen?
- Was würde ich verwenden, wenn ich das
Id
Programmatically basierend auf welche Elemente wurden gezeigt bekommen wollte? So wie es jetzt ist, wird die aktuelle Listview gezeigt, basierend auf welcherFoo
s ausgewählt wurden. DieseFoo
s ausgewählt werden dann angezeigt, und der Benutzer kann dieBar
imDropDownList
ändern, drücken Sie Speichern, und diese Änderungen propogated werden.
Update
Wie sich herausstellt, war mein Problem, was leppie hatte gesagt; und das war, dass ich brauchte DataKeyNames
zu spezifizieren und nutzen diejenigen, die die Informationen aus dem Listview zu erhalten.
Hier ist der Code, den ich hinzugefügt:
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++;
}
}
}
Und dann in der .ascx
Datei, habe ich DataKeyNames="Key"
, etwa so:
<asp:ListView ID="lvFooList" runat="server" DataKeyNames="Key">
Das erlaubte mir, die Key
von meinem vorherigen Post zu verwenden, um zu bestimmen, welche Foo an wurden aussieht.
Jede Kritik an diesem Ansatz, sowie Verfahren zur Herstellung es besser sehr geschätzt werden.
Lösung
Einige schnelle Antworten:
-
Ihre Notwendigkeit Datenbindung zu verwenden, um daran zu arbeiten, mit anderen Worten, weist
DataSource
DataBind()
und ruft. EDIT: scheint, Sie sind das zu tun. Aber denken Sie daran es anhalten wird nicht zwischen Postbacks, nur dieDataKey
(siehe unten). -
Wenn ich mich richtig erinnere, müssen Sie die
DataKeyNames
angeben, und sie können dann von derDataKey
Eigenschaft abgerufen werden.
Andere Tipps
Sie können auch die ListViewDataItem.DataItemIndex Eigenschaft verwenden, anstatt Ihren eigenen Index zu halten, wie in:
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
}