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 metodo Save().
  • 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 <= > utilizzando DropDownList

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):

  1. Perché quando eseguo l'iterazione tra <%#Eval("Value") %> nel ListViewDataItem ogni elemento è Listview?
  2. Come posso recuperare null dal Dizionario?
  3. Cos'altro potrei perdere?
  4. 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 quali Id sono stati selezionati. Quei Foo selezionati vengono quindi visualizzati e l'utente può cambiare Bar in DataKeyNames, 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.

È stato utile?

Soluzione

Alcune risposte rapide:

  1. La tua necessità di utilizzare il database per farlo funzionare, in altre parole, assegnare a DataSource e chiamare DataBind(). EDIT: sembra che tu lo stia facendo. Ma ricorda che non persisterà tra i postback, solo il DataKey (vedi sotto).

  2. 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
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top