webForumDet fria alternativet

skicka data mellan usercontrols

.NETur .NET

12 svar · 638 visningar · startad av aleborg

Medlem sedan jan. 20013 341 inlägg
Frågan#1

Jag har en sida där jag har placerat flera usercontrols, samtliga(utom en) är dolda när man går in på nsidan, i varje usercontrol finns en datagrid + lite kontroller.

Sidan är ett beställningsformulär som är uppbyggd som en guide och tanken är att man ska lägga till saker i varje usercontrol som döljer sig själv och visar nästa kontroll när man klickar "nästa", men frågan är hur ska jag kunna spara informationen mellan varje usercontrol och uppdatera datagriden med infon? Jag har försökt med ett dataset men det går ju inte.

Kan man inte på nått sätt placera ett dataset på aspx-sidan och i varje usercontrol updatera datasetet? (verkar inte gå att hitta ett dataset med Findcontrol)

Medlem sedan sep. 20026 425 inlägg
#2

Nånting säger mig att man kan spinna vidare på ViewState. :)

Medlem sedan maj 20012 812 inlägg
#3

Den riktigt snygga lösningen är följande:

1. Du skapar olika classer som motsvarar den datan som skall skrivas in i varje userkontroll, givetviss så skall dessa classer delas upp och innehålla data som är relevant för klassen, så det betyder att du kan ha flera klasser som skall fyllas med data i en usercontroll och inte bara en klass.

2. Varje usercontroll har sedan ett Update/finsished event vars argument kan hålla de klasser som är fyllda i usercontrollen.

3. Din ASPX sida lyssnar sedan på dessa event och tar emot datan och behandlar den så som du önskar.

Snygg aritektur och inga hårda kopplingar mellan usercontrol och aspx-sidan.

Den snabba fula lösningen är att du har ditt dataset och skickar med det till varje userkontrol/alternativt lägger det i en session variabel, och sedan så låter du varje usercontrol lägga sin data i datasetet. Snabbt, enkelt men extrem ful programmering :)

- M

Medlem sedan jan. 20013 341 inlägg
#4

Gladh -> Har du nått exempel på den snygga lösningen? Låt oss säga på datan ProductID och Price.
Tyvärr kan jag inte låta datagriden ligga på huvudsidan utan måste placera en på varje kontroll, använder nämligen WebTab från https://www.infragistics.com

Medlem sedan maj 20012 812 inlägg
#5

Gladh -> Har du nått exempel på den snygga lösningen? Låt oss säga på datan ProductID och Price.

Inte lite du kräver :)

Klassen som fylls i en av dina kontroller.

//-- Klassen som håller data om en product
public class Product{
 public int _ProductId;
 public decimal _Price;
 .
 .
 .
}

EventArgumentet för ditt event

//-- Klassen som håller data för ditt event
public class MyUpdateEventArgument : EventArgs{
 public Product _Product;

 public MyUpdateEventArgument (Product product){
  _Product = product;
 }
}

I din usercontrol så skapar du sedan ett event som du kan låta sidan lyssan på. Methoden OnUpdate kallar du på när du vill aktivera eventet, alltså innan du stänger din usercontrol

.
.
.
//-- skapar en delegate för eventetn
public delegate void UpdateEventHandler(object sender,  MyUpdateEventArgument updateEventArgument);

//-- skapar ett event som aspx-sidan kan lyssna på
public event UpdateEventHandler Update;
.
.
.
//-- Methoden som skall anropas när du vill att eventetn skall aktiveras
public void OnUpdate(Product product){
 //-- kollar så att någon lyssanar på eventet
 if(Update != null)
  //-- aktivera eventet
  Update(this, new MyUpdateEventArgument(product));
}

På din ASPX sida så lyssnar du på eventet och tar hand om resultatet.

.
.
.
 //-- declarear din usercontrol
 private MyUserControl userControl;
 //-- lysnar på event från din usercontrol
 userControl.Update += new UpdateEventHandler(MyUserControl_Update);
.
.
.
//-- Method som anropas när aspx-sidan får ett event från usercontrollen
private void MyUserControl_Update(object sender, MyUpdateEventArgument updateEventArgument){
 //-- hämtar ut producten
 Product p = updateEventArgument.Product;
 //-- Du kan sedan göra vad du vill med producte, kanske skicka den vidare till andra usercontrols så de kan använda den och visa datan i en datagrid :)
}

Något sånt borde fungerar...

- M

Medlem sedan dec. 19996 522 inlägg
#6

Har jag hajjat det rätt, du håller alltså en klass för varje user controls EventArgumentet, i detta fall public class MyUpdateEventArgument ?

Medlem sedan maj 20012 812 inlägg
#7

Har jag hajjat det rätt, du håller alltså en klass för varje user controls EventArgumentet, i detta fall public class MyUpdateEventArgument ?

Jag håller en eventargument klass för varje eventHandler som jag skapar. Gör man den tillräckligt generell (använder object istället för Produkt) så kan man återanvända den för alla usercontroller. Om man vill ha mer säker och strukturerar kod, så blir det olika events för de olika usercontroller eftersom de kommer att skicka tillbaka olika klasser. Eller så har man en övergirpande klass som heter typ: AllInfo som sedan innehåller alla de andra klasser som skall fyllas i de olika userkontroller. Då får du åter endast eventargument klass som du kan fylla på med data efterhand.

Allt beroende på hur specifika du vill ha dina olika events.

- Magnus

Medlem sedan dec. 19996 522 inlägg
#8

Tack för förslaget på lösning, har själv funderat på hur man ska kunna lösa en liknande sak, på ett snyggt sätt. Problemet är väll att man har för mycket skador i skallen sen alla år procedurellprogrammering ;)

Medlem sedan dec. 19996 522 inlägg
#9

Funderat vidare lite på din lösning glad, vad exakt menar du och hur med "lyssnar".

På din ASPX sida så lyssnar du på eventet och tar hand om resultatet.

Medlem sedan maj 20012 812 inlägg
#10

userControl.Update += new UpdateEventHandler(MyUserControl_Update);

usercontrollen har ett event (Update) som man kan koppla upp sig mot (lyssna). Det gör man genom att skriva koden ovan. Det betyder att så fort usercontrollen aktiverar eventet så får din ASPX sida reda på detta och exekverar det methoden: MyUserControl_Update. Och där i skriver du den kod som du vill skall exekveras när eventet aktiveras...

- M

Medlem sedan dec. 19996 522 inlägg
#11

Tack men vet inte om jag bara är morgontrött men jag har fortfarande inte förstått till 100%, hur triggar man eventet från aspx sidan, alltså aktiverar eventen från aspxsidan. Det är den biten jag inte riktigt har greppat, det är nog för jag inte har 100% koll på events,ännu ;) Hur känner usercontrollen av att den har uppdaterats så att säga

Tack för du tar dig tid

Medlem sedan maj 20012 812 inlägg
#12

Du triggar inte eventet från ASPX sidan, sidan lyssnar på event som triggas från Usercontrollen.

Event triggas genom att man kallar på det.

//-- kollar så att någon lyssanar på eventet
if(Update != null)
//-- aktivera eventet
Update(this, new MyUpdateEventArgument(product));

Först kollar man så någon lyssnar. sedan så triggar du eventet med Update(.....); Då kommer ASPX-sidan att känna av att det är triggat och exekvera sin kod.

- Magnus

Medlem sedan dec. 19996 522 inlägg
#13

Ahh nu är det glasklart, visste inte om det fungerade så smidigt, tack otroligt mycket för förklaringen :)

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