Jag har blivit påtvingad att lära mig använda Repository Pattern, och det verkar ju smidigt på sitt sätt, även om jag är ovan än så länge.
Nu har jag dock kört fast i kombinationen Repository Pattern, ListView när jag försöker uppdatera information. Att hämta och lägga till nytt är inga problem (även om jag fick ge upp ItemInsert och lägga det formuläret bredvid)
Jag har beskrivit problemet, och i viss mån fått hjälp här: http://www.aspsidan.se/default.asp?page=forum&fp=showPost&fId=52&pId=600756
Just nu är det stora problemet att jag inte lyckas hämta den DataItem jag har redigerat, något jag försöker göra så här:
Sizeandprice editItem = (Sizeandprice)listProducts.Items[e.ItemIndex].DataItem;
Hela mitt försök ser ut så här:
protected void listProducts_ItemUpdating(object sender, ListViewUpdateEventArgs e)
{
IRepository<Sizeandprice> _sizeandprice = new EntityRepository<Sizeandprice>();
Sizeandprice editItem = (Sizeandprice)listProducts.Items[e.ItemIndex].DataItem;
Sizeandprice sp = _sizeandprice.First(p => p.id == editItem.id);
sp.name = editItem.name;
sp.batch = editItem.batch;
sp.pixels = editItem.pixels;
sp.price = editItem.price;
sp.surface = editItem.surface;
_sizeandprice.Save();
listProducts.EditIndex = -1;
FillList();
}
Kommer inte ihåg hur ListViewn är uppbyggd nu men kan det inte vara så att den redan är bunden till datat innan ItemUpdating körs?
I så fall måste du hämta din SizeAndPrice på nytt inne i metoden.
Däremot i t.ex. eventet ItemDataBound så går det bra att hämta via e.DataItem.
Jag hänger inte riktigt med på vad du menar...
Vad är det jag måste hämta på nytt i vilken metod?
Raden du anger:
Sizeandprice editItem = (Sizeandprice)listProducts.Items[e.ItemIndex].DataItem;
Du kan inte hämta DataItem som en Sizeandprice för DataItem är null vid tillfället.
Du måste hämta ut värdena var för sig:
Sizeandprice sp = _sizeandprice.First(p => p.id == editItem.id);
sp.name = e.Item.FindControl("foo");
Men det är som sagt bara en gissning! :)
Sure, vi säger så då.
Men eftersom jag inte kan hämta DataItem så är editItem null, vilket gör att jag inte vet vilken post som ska redigeras. Om editItem är null så är editItem.id också null
Helt rätt!
Du måste hämta ut aktuellt editid från ListViewn.
Jag är helt lost på vilka properties det finns att tillgå men du borde kunna ange Sizeandprice.id som datakey i ListViewn som du sedan hämtar upp i ItemUpdating, typ:
int id = (int)e.Item.nånting;
eller
int id = (int)listProducts.Items[e.ItemIndex].nånting;
Sizeandprice sp = _sizeandprice.First(p => p.id == id);
Jag hittar då inget som verkar användbart :(
Verkar ju helt sjukt om det ska behöva lösas såhär, men det fungerar iallafall:
protected void listProducts_ItemUpdating(object sender, ListViewUpdateEventArgs e)
{
IRepository<Sizeandprice> _sizeandprice = new EntityRepository<Sizeandprice>();
ListViewItem editItem = listProducts.Items[e.ItemIndex];
Sizeandprice sp = _sizeandprice.GetAll().OrderBy(p => p.name).ElementAt(e.ItemIndex);
sp.name = ((TextBox)editItem.FindControl("tbName")).Text;
//sp.batch = ((TextBox)editItem.FindControl("tbBatch")).Text;
sp.pixels = int.Parse(((TextBox)editItem.FindControl("tbPixels")).Text);
sp.price = int.Parse(((TextBox)editItem.FindControl("tbPrice")).Text);
sp.surface = ((TextBox)editItem.FindControl("tbSurface")).Text;
_sizeandprice.Save();
listProducts.EditIndex = -1;
FillList();
}
Mm, det där ser farligt ut.
Jag skulle inte hämta via en OrderBy och ElementAt, du måste kunna få tillbaka det exakta id:t som motsvarar databasen.
Annars är det så där man normalt fyller en klass i ASP.NET Webforms. Vill du ha enklare och smidigare lösningar så är det ASP.NET MVC som gäller (och som jag kan rekommendera).