webForumDet fria alternativet

ListView EditItem och Repository Pattern

9 svar · 521 visningar · startad av StefanBergfeldt

StefanBergfeldtMedlem sedan sep. 2004828 inlägg
#1

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();
        }
doggelitoMedlem sedan juni 20003 076 inlägg
#2

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.

StefanBergfeldtMedlem sedan sep. 2004828 inlägg
#3

Jag hänger inte riktigt med på vad du menar...

Vad är det jag måste hämta på nytt i vilken metod?

doggelitoMedlem sedan juni 20003 076 inlägg
#4

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! :)

StefanBergfeldtMedlem sedan sep. 2004828 inlägg
#5

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

doggelitoMedlem sedan juni 20003 076 inlägg
#6

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);
StefanBergfeldtMedlem sedan sep. 2004828 inlägg
#7

Jag hittar då inget som verkar användbart :(

StefanBergfeldtMedlem sedan sep. 2004828 inlägg
#8

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();
        }
doggelitoMedlem sedan juni 20003 076 inlägg
#9

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).

doggelitoMedlem sedan juni 20003 076 inlägg
#10

Kolla denna: :)
http://forums.asp.net/t/1318756.aspx

136 ms totalt · 3 externa anrop · v20260731065814-full.30151723
133 ms — hämta forumlista (db)
0 ms — hämta statistik (cache)
127 ms — hämta tråd, inlägg och bilagor (db)