c# - tutorial - carrito de compras asp net vb
ListView DataItem muestra nulo (2)
Algunas respuestas rápidas:
Su necesidad de utilizar el enlace de datos para que funcione, en otras palabras, asigne a
DataSource
y llame aDataBind()
. EDIT: parece que estás haciendo eso. Pero recuerde que no persistirá entre las devoluciones de datos, solo laDataKey
(ver más abajo).Si recuerdo correctamente, debe especificar los
DataKeyNames
, y luego se pueden recuperar de la propiedadDataKey
.
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étodoSave()
. - 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 unDropDownList
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):
- ¿Por qué es que cuando itero a través de
ListViewDataItem
en la vista deListview
que cada elemento esnull
? - ¿Cómo puedo recuperar el
Foo.Id
del diccionario? - ¿Qué más podría faltar?
- ¿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 losFoo
fueron seleccionados. AquellosFoo
seleccionados se muestran, y el usuario puede cambiar laBar
en laDropDownList
, 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
}