ListView DataItem Mostra Null
Domanda
Qualche giorno fa, ho scritto su problemi con l'implementazione di un ListView in ASP.NET. Ora, con tutto l'altro codice scritto, ho problemi a salvare gli elementi modificati in un ListView.
Alcune cose da notare:
- Il pulsante Salva non fa parte del ListView corretto; chiama il metodo
GetListViewItems()
, che a sua volta chiama il metodoSave()
. - L'evento
Listview.DataBind()
viene invocato quando viene premuto un pulsante per richiedere l'aggiornamento dei record - La visualizzazione elenco mostra il testo utilizzando
<%#Eval("Key.Name") %>
e un denominato <= > utilizzandoDropDownList
Ottenere gli elementi da 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
Il codice per l'individuazione del database di ListView è mostrato qui nella mia domanda precedente .
Question (s):
- Perché quando eseguo l'iterazione tra
<%#Eval("Value") %>
nelListViewDataItem
ogni elemento èListview
? - Come posso recuperare
null
dal Dizionario? - Cos'altro potrei perdere?
- Cosa userei se volessi ottenerlo
Foo.Id
Programmaticamente in base a quali elementi sono stati mostrati? Allo stato attuale, l'attuale ListView viene mostrato in base a qualiId
sono stati selezionati. QueiFoo
selezionati vengono quindi visualizzati e l'utente può cambiareBar
inDataKeyNames
, premere Salva e tali modifiche vengono propagate.
Aggiornamento
A quanto pare, il mio problema era quello che leppie ; ed era quello che dovevo specificare .ascx
e usarli per conservare le informazioni da ListView.
Ecco il codice che ho aggiunto:
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++;
}
}
}
E poi nel file DataKeyNames="Key"
, ho aggiunto Key
, in questo modo:
<asp:ListView ID="lvFooList" runat="server" DataKeyNames="Key">
Questo mi ha permesso di utilizzare <=> dal mio post precedente per determinare quale Foo veniva esaminato.
Ogni critica di questo approccio, così come i metodi per renderlo migliore, sono molto apprezzati.
Soluzione
Alcune risposte rapide:
-
La tua necessità di utilizzare il database per farlo funzionare, in altre parole, assegnare a
DataSource
e chiamareDataBind()
. EDIT: sembra che tu lo stia facendo. Ma ricorda che non persisterà tra i postback, solo ilDataKey
(vedi sotto). -
Se ricordo bene, è necessario specificare
DataKeyNames
e possono essere recuperati dalla proprietà <=> quindi.
Altri suggerimenti
puoi anche usare la proprietà ListViewDataItem.DataItemIndex invece di mantenere il tuo indice, come 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
}