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
DataSourcey 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 unDropDownListnombrado 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
ListViewDataItemen la vista deListviewque cada elemento esnull? - ¿Cómo puedo recuperar el
Foo.Iddel diccionario? - ¿Qué más podría faltar?
- ¿Qué usaría si quisiera obtener esa
Idprogramáticamente en función de los elementos que se muestran? Tal como está ahora, el ListView actual se muestra en función de losFoofueron seleccionados. AquellosFooseleccionados se muestran, y el usuario puede cambiar laBaren 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
}