visual tutorial studio net ejemplo compras carrito asp c# asp.net listview

c# - tutorial - carrito de compras asp net vb



ListView DataItem muestra nulo (2)

Algunas respuestas rápidas:

  1. Su necesidad de utilizar el enlace de datos para que funcione, en otras palabras, asigne a DataSource y llame a DataBind() . EDIT: parece que estás haciendo eso. Pero recuerde que no persistirá entre las devoluciones de datos, solo la DataKey (ver más abajo).

  2. Si recuerdo correctamente, debe especificar los DataKeyNames , y luego se pueden recuperar de la propiedad DataKey .

Hace unos días, escribí sobre problemas con la implementación de un ListView en ASP.NET. Ahora, con todo el resto del código escrito, tengo problemas para guardar los elementos modificados en un ListView.

Algunas cosas de la nota:

  • El botón Guardar no es parte de ListView propiamente dicho; llama al método GetListViewItems() , que a su vez llama al método Save() .
  • El evento Listview.DataBind() se invoca cuando se presiona un botón solicitando que se actualicen los registros
  • La vista de lista muestra el texto usando <%#Eval("Key.Name") %> y un DropDownList nombrado usando <%#Eval("Value") %>

Obtención de los elementos de la vista de lista

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 } }

Enlace de datos al ListView

El código para enlazar el ListView se muestra aquí en mi pregunta anterior .

Pregunta (s):

  1. ¿Por qué es que cuando itero a través de ListViewDataItem en la vista de Listview que cada elemento es null ?
  2. ¿Cómo puedo recuperar el Foo.Id del diccionario?
  3. ¿Qué más podría faltar?
  4. ¿Qué usaría si quisiera obtener esa Id programáticamente en función de los elementos que se muestran? Tal como está ahora, el ListView actual se muestra en función de los Foo fueron seleccionados. Aquellos Foo seleccionados se muestran, y el usuario puede cambiar la Bar en la DropDownList , presionar Guardar, y se promulgan esos cambios.

Actualizar

Resulta que mi problema era lo que había dicho leppie ; y eso era lo que necesitaba para especificar DataKeyNames y usarlos para retener la información de ListView.

Aquí está el código que agregué:

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++; } } }

Y luego en el archivo .ascx , agregué DataKeyNames="Key" , así:

<asp:ListView ID="lvFooList" runat="server" DataKeyNames="Key">

Esto me permitió usar la Key de mi publicación anterior para determinar qué Foo estaba siendo examinado.

Cualquier crítica de este enfoque, así como los métodos para hacerlo mejor, son muy apreciados.


También puede usar la propiedad ListViewDataItem.DataItemIndex en lugar de mantener su propio índice, como en:

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 }