webForumDet fria alternativet

Beräkningar i grid/textrutor

9 svar · 807 visningar · startad av daniel_ra

daniel_raMedlem sedan jan. 2002381 inlägg
#1

Halloj

Jag har en asp-sida som jag vill göra om i .net. Har än så länge lite dåliga kunskaper i alla dess finesser men ska försöka ta reda på så mycket som möjligt för att resultatet skall bli bra.

jag har en sida med en tabell där varje rad motsvarar ett antal produkter hämtade ur databasen och varje kolumn visar hur olika priser, skatter och avgifter påverkar varandra då man gör förändringar. i dagsläget fungerar det såhär på min asp-sida:

för varje rad så hämtar jag alla kolumnvärden för den aktuella produkten och skriver ut det i textrutor. Alla textrutor har en onchangefunktion som räknar om alla värden för den aktuella produkten utefter en matematisk formel och visar upp resultatet. Det finns även en funktion som gör det möjligt att räkna om alla produkters värden samtidigt. Detta görs genom att sätta en rad som "master" och låta uträkningen utgå från det ändrade fältet på just den raden.
alla textrutor är namngivna med produktID som siffix för att veta vilken rad jag ändrar och det kan i teorin listas hur många produkter som helst.

Finns det något sätt att göra sådana beräkningar i någon form av grid eller kommer jag även fortsättningsvis behöva skapa textrutor dynamiskt och döpa den som tidigare osv..

eftersom jag i dagsläget inte vet vad textrutorna kommer att heta så skickar jag med en sträng i ett hiddenfield till min sida där jag sparar informationen så att jag kan hämta värdena för alla fält. Kanske finns det ett ästt att även göra detta enklare..

alla tips är välkomna!!

inspiroMedlem sedan sep. 2005673 inlägg
#2

Gridview är ett exempel på en asp.net-kontroll som innehåller all den funktionalitet du vill ha. Lite kom-igång:

  1. Lägg till en gridview-kontroll på din aspx-sida och läs på lite om hur kontrollen fungerar, lär dig templates bland annat.
  2. Hämta alla data från databasen och lägg dem i en collection av något slag, förslagsvis en datatable.
  3. Fyll din gridview med din collection och kontrollera att det fungerar så långt...
  4. Nu kan du börja labba med egna templates och använda andra kontroller inne i din gridview, exempelvis textfält. Du behöver inte skapa textfält dynamiskt eller krångla med hiddenfält, allt sådant fixar du med din gridview.

http://quickstarts.asp.net/QuickStartv20/aspnet/doc/ctrlref/data/gridview.aspx

GladhMedlem sedan maj 20012 812 inlägg
#3

Det är inga problem att göra det du vill i ASP.NET det kommer dock bli en ganska stor omställning för dig, då du i ASP.NET inte kommer att "rita ut" dina textrutor på samma sätt som du gör i ASP och dessutom så kommer du inte att "hämta" information på samma sätt som i ASP.

Du kommer med andra ord att stötta på patrull och känner att allt bara är jobbigt och komplicerat (det gjorde jag och det finns en anleding, se nedan). Men när du väl tagit till dig tänket hur man skall göra så kommer din vardag bli så mycket enklare.

Anledningen till att man upplever ASP.NET som mycket mer komplicerat än ASP är att man går i från scriptspråket's flöde och börjar använda ObjectOrientering och events. Dessutom så är det så att för att lära sig ASP, så behöver man lära sig 5 internta object, samt typ VBScript.

För att lära sig ASP, så behöver man lära sig följande.
1. Object orienterad programmering.
2. .NET Framework som innehåller tusentals med klasser som du kommer vilja använda dig av.
3. Något av de olika språkens syntax, rekomendera C# istället för VB.NET för att du verkligen skall börja om på nytt.
4. ASP.NET's olika event och komponenter
5. En betydligt mer avancerat utvecklingsmiljö än de flesta HTML-editor har att erbjuda.

Så det kommer kännas tungt i en månadstid innan du börjar få kläm på det, GE INTE UPP... .NET är framtiden inom MSvärlden och "ingen" är intresserad av gamla ASP-kunskaper om något år....

- M

daniel_raMedlem sedan jan. 2002381 inlägg
#4

Har kommit så långt att jag listat data i gridview och gjort template fields i vissa kolumner vilket medför att jag kan se resultatet i textrutor.. en bra början.. Det jag nu vill göra är att göra onchange-event på textrutorna så att jag kan göra beräkningar till en början på radnivå.. Jag behöver alltså veta vilken rad jag ändrat ett värde, göra en matematisk beräkning och sedan uppdatera resultatet i de respektive textrutorna på aktuell rad.. hur vet jag vilken rads värde som är förändrat??

såhär kan man kanske göra för att trigga onchange-eventet men hur skall jag göra i
price_TextChanged??

<asp:TemplateField HeaderText="pris" SortExpression="pris">
<ItemTemplate>
<asp:TextBox ID="textbox1" runat="server" Text='<%# Bind("pris") %>' AutoPostBack="True" OnTextChanged="price_TextChanged"></asp:TextBox>
</ItemTemplate>
</asp:TemplateField>

inspiroMedlem sedan sep. 2005673 inlägg
#5

Du ska inte ha en knapp för att trigga eventet? Varje gång du lämnar textfältet så kommer price_TextChanged att köras... I vilket fall som helst, här är en lösning:

I en gridview så finns det en egenskap som heter DataKeyNames. Med hjälp av den så kan du koppla innehållet från en (eller flera) kolumner i din databas till respektive rad i din gridview genom att skriva i namnet/namnen på respektive kolumner. Normalt kopplar man bara på en id-kolumn:

DataKeyNames="id" //namnet på id-kolumnen i din db

Nästa steg är att ta reda på vilken rad i din gridview som innehåller den textbox som triggade funktionen "price_TextChanged". Din textbox ligger i en annan kontroll (en TableCell i din gridview), som i sin tur ligger i en annan kontroll (DataGridItem) som har egenskapen ItemIndex. Vi får alltså backa oss tillbaka en bit för att få fram raden som innehåller textboxen som du nyss skrivit något i:

int Index = ((DataGridItem)((TextBox)sender).Parent.Parent).ItemIndex;

Nu kan vi använda DataKeyNames för att hämta ut vilket id den aktuella raden har i din db:

int Id = MyGridView.DataKeys[Index]["id"];
daniel_raMedlem sedan jan. 2002381 inlägg
#6

okay.. hänger ungefär med =) jag förstår alltså nu hur jag tar reda på vilken rad i gridview som är ändrad men hur gör jag för att skriva till textrutan på denna rad?

låt säga att jag för enkelhetens skull bara vill ändra värdet i textrutan, multiplicera detta värde med 10 för att sedan skriva det nya resultatet i textrutan igen. hur skulle jag göra det.. I verkligheten är det i andra textrutor (andra kolumner som jag vill skriva värden men vi kan börja såhär.). När jag är klar med mina olika ändringar så skall jag spara innehållet men det kan vi ta senare =)

inspiroMedlem sedan sep. 2005673 inlägg
#7

När du hämtat ut värdet och räknat med det så kan du använda metoden FindControl() för att hitta den kontroll som ska få den framräknade värdet, typ nåt sånt här:

((TextBox)MyGridView.Items[Index].FindControl("textboxens id")).Text = Value;
daniel_raMedlem sedan jan. 2002381 inlägg
#8

Kanon!! Om jag har förstått det rätt så ligger alltså alla textboxar i Gridview.Items med ett speciellt index, jag kommer nämligen att behöva förändra värden på en rad alternativt alla rader så jag måste på något sätt kunna gå igenom alla rader i min gridview och göra beräkningar på varje rad utifrån den textbox som är förändrad

inspiroMedlem sedan sep. 2005673 inlägg
#9

Ja, varje rad (items) i din gridview innehåller en eller flera tablecells (som också är en slags asp.net-kontroller) som i sin tur innehåller de kontroller du har lagt in i dina templates. Normalt behöver man inte hålla på och rota så här, det blev lite extra komplicerat eftersom du valt att använda textboxens onchange-event. Det finns en massa inbyggda events i din gridview som du kan använda för att fånga upp knapptryckningar och liknande och de är enklare att använda.

daniel_raMedlem sedan jan. 2002381 inlägg
#10

okay, ja jag är helt ny på det här och onchange är ett event som jag känner till så det kändes fint att använda. men finns det bättre alternativ så är jag verkligen öppen för förslag! Det är lika bra att göra rätt från början då man skall lära sig.

132 ms totalt · 3 externa anrop · v20260731065814-full.7de19299
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
129 ms — hämta tråd, inlägg och bilagor (db)