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 die Save() 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 namens DropDownList 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):

  1. Warum ist es, dass, wenn ich durch die ListViewDataItem im Listview iterieren, die jedes Element null ist?
  2. Wie kann ich die Foo.Id aus dem Wörterbuch abrufen?
  3. Was sonst könnte ich fehlen?
  4. 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 welcher Foos ausgewählt wurden. Diese Foos ausgewählt werden dann angezeigt, und der Benutzer kann die Bar im DropDownList ä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.

War es hilfreich?

Lösung

Einige schnelle Antworten:

  1. 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 die DataKey (siehe unten).

  2. Wenn ich mich richtig erinnere, müssen Sie die DataKeyNames angeben, und sie können dann von der DataKey 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
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top