get/set problem

Tags:    c# asp.net

<< < 12 > >>
Hej alle.

Jeg er i gang med en ASP.NET side. Men jeg har et problem med min get/set funktion.
I min WebForm1.aspx.cs klasse en metode som tilføjer en værdi til min get/set metode i min GetAndSetClass.cs klasse. Og disse bliver tilføjet helt fint og uden problemer.

I en anden klasse TableBuildUp.cs når jeg så prøver at "kalde" denne værdi som jeg lige har lagt over i min get/set, så får jeg en forkert værdi. Så får jeg den String værdi som jeg har givet min String som min get/set metode bruger.

Mit spøglsmål er, hvorfor får jeg den forkerte værdi fordi jeg kalder min get/set fra en anden .cs klasse.
Fordi hvis jeg med den samme metode kalder get/set fra WebForm1.aspx.cs så får jeg den rigtige værdi.

f.eks jeg siger GetAndSet.cellOne = "fisk". Når jeg så siger cell1.text = GetAndSet.cellOne så får jeg værdien Removed.

Jeg håber det giver mening, og jeg er ingen C# haj.
Hvis det er nogle informationer som i mangler må i endelig sige til.
Lidt kode.

tilføj værdi WebForm1.aspx.cs
Fold kodeboks ind/udCSharp kode 


Hvordan min get/set metode ser ud GetAndSetClass.cs
Fold kodeboks ind/udCSharp kode 


Kald get/set værdi TableBuildUp.cs
Fold kodeboks ind/udCSharp kode 


Tak på forhånd.



Indlæg senest redigeret d. 05.12.2011 14:47 af Bruger #16700
14 svar postet i denne tråd vises herunder
2 indlæg har modtaget i alt 9 karma
Sorter efter stemmer Sorter efter dato
Hvorfor har du en "public String _CellOne = "Removed";?

Det er den der gør, at du altid får removed tilbage.


Hans property bruger blot _CellOne som backed field. Ergo hvis han sætter værdien for CellOne sætter han egentlig værdien for _CellOne. Så i teorien har det intet med hans problem at gøre.
------------------
Der er 2 ting som kan være gået galt...

1. At du ikke sætter værdien for CellOne, før du tildeler værdien til cell1.Text - og da du bruger et backed field med standard-værdien "Removed", vil den værdi blive vist.

2. At du laver et nyt "GetAndSetClass" objekt for både WebForm1.aspx.cs, og TableBuildUp.cs. Hvilket også forklarer hvorfor ændringer i WebForm1.aspx.cs ikke afspejler sig i TableBuildUp.cs. Kort sagt: de 2 classes bruger 2 forskellige GetAndSetClass objekter.

Et par ændringer du måske skulle overveje:
1. Find på et bedre navn end "GetAndSetClass"
2. Brug en auto-implemented property, i stedet for at lave et backed field.

Eksempel på auto-implemented property:
Fold kodeboks ind/udCSharp kode 




Indlæg senest redigeret d. 05.12.2011 16:41 af Bruger #16594
Hejsa Christian

Er det i samme request du både set'-er og get'-er?
Eller er det på tværs af flere request og response (fx to klik)?
Derudover så har det også noget at sige om din klasse GetAndSetClass.cs
er defineret som static, eller om du laver den som et objekt og kalder metoder på den.

Beklager hvis nedenstående bliver enten for high- eller low-level til det er interessant for dig, så sig endelig til hvis noget af det er tilfældet.

Du skriver selv at du ikke er nogen C# haj, så jeg ved ikke hvor meget du kender til hvordan objekter gemmes sammen med properties.
Hvis din klasse ikke er static så ville du instantiere objektet ved at lave et "new" objekt. For så derefter at kalde metoder/properties på dette objekt og dette objekt sammen med værdier vil blive bevaret så længe de er indenfor scope. Altså at de er gemt et sted og ikke kun indenfor en metode.
Hvis de er lavet som static vil dette være et enkelt objekt som alle vil dele (og kan desværre ikke gennemskue om det er funktionelt og dette du forsøger at opnå), og her behøver du ikke tænke på at gemme dette objekt.

Dette er ikke gældende når det er ASP.NET, da dine objekter ikke bliver gemt efter et response.
brugeren starter med at lave et request til din side (default.aspx) som opbygger alle dine objekter, opbygger din side for til sidst at returnere din side som et response og derefter smider ASP.NET alt væk igen. For at du kan bibeholde noget logik på en "nem" måde hvis man ikke er "en haj" så har ASP.NET indbygget noget der hedder ViewState som skal sørge for at når du fx har valgt noget i en dropdown-box så bliver disse værdier sendt med frem og tilbage.

Derfor kan det være grunden til at dine data ser ud som de gør.
Da du har sat _CellOne = "Removed" kan det være fordi at når du første gang åbner siden så er _CellOne = "Removed" som den også ganske rigtigt skal.
Hvis du så har brugeren til at rette denne celle til "MyNewValue" (at du reagerer på cellen er rettet og skriver dette tilbage i klassens property, og næste gang ikke læser værdien du har skrevet ud i sidens celle så bygges dette objekt op på ny uden at kende noget som helst til den værdi som det havde i forrige request. Det vil være fordi at ved hvert request vil standart værdien sættes til "Removed" da dette objekt skal opbygges hver gang der skal laves noget på din backend, og hvis du ikke indlæser en anden værdi hver gang vil den ha standart værdi næste gang du kommer til din backend.

Jeg vil foreslå dig at bruge i dette tilfælde, men på et tidspunkt kan dette godt effektificeres lidt mere så du ikke skal skrive så meget kode og det er nemmere at få de data ud du ønsker også.
Fold kodeboks ind/udCSharp kode 


Hvis jeg skal komme med yderligere foreslag eller kunne forsøge at hjælpe yderligere vil jeg gerne høre nærmere om hvad dette skal bruges til? Så man forstår hvad dette skal gøre? Og skal dette foregå i samme request eller imellem flere af dem?
Så er det måske nemmere at vejlede i hvordan du kan gemme dine data imellem dine requests, hvis det er nødvendigt?



Indlæg senest redigeret d. 06.12.2011 22:19 af Bruger #16651
Hej Ebb.

Tak for dit forslag. Men hvordan kan jeg vide, om min WebForm1.aspx.cs bruger en anden get/set objekt end TableBuildUp.cs.

Kan man ikke gøre så hvis en klasse f.eks TableBuildUp.cs ikke bruger det samme get/set objekt som WebForm1.aspx.cs, så kan man få den til det?

Udover syntakst, hvad er så forskellen på den get/set jeg bruger og den du viser? :p

Tak på forhånd

Edit.
Jeg kom i tanke om noget. Hvordan kan mine to klasser bruge hver sin get/set metode, når jeg i min TableBuildUp.cs siger klasse-navn/metode-navn

GetAndSet.CellOne = noget;
Burde de så ikke bruge den samme get/set? I dont get it.



Indlæg senest redigeret d. 05.12.2011 20:21 af Bruger #16700
Udover syntakst, hvad er så forskellen på den get/set jeg bruger og den du viser?


Forskellen er blot at du ikke behøver at skrive:

Fold kodeboks ind/udCSharp kode 


men blot kan nøjes med:

Fold kodeboks ind/udCSharp kode 

compileren vil da selv generer _backedField.

Jeg kom i tanke om noget. Hvordan kan mine to klasser bruge hver sin get/set metode, når jeg i min TableBuildUp.cs siger klasse-navn/metode-navn


Det står mig stadig uklart, om du bruger samme GetAndSetClass objekt i begge dine classes, eller om du definere et nyt i henholdsvis WebForm1.aspx.cs, og TableBuildUp.cs.

Ville være en del nemmere at gennemskue, hvis du pastede det relevante fra WebForm1.aspx.cs og TableBuildUp.cs.




Indlæg senest redigeret d. 05.12.2011 20:55 af Bruger #16594
Hej Ebb.
I min WebForm1.aspx.cs og i min TableBuildUp.cs bruger jeg i begge tilfælde GetAndSetClass.cs.
Også, oprindeligt så den metode jeg har lagt over i TableBuildUp.cs lå i WebForm1.aspx.cs klassen. Hvor jeg ikke har ændret i get/set. Se bunden af metoden nedenfor.

Metoden.
Fold kodeboks ind/udCSharp kode 

Det skal også lige siges at dette virkede fint da det lå i WebForm1.aspx.cs, og fik først problemet da jeg rykkede det til TableBuildUp.cs.

compileren vil da selv generer _backedField.
Smart :p



Indlæg senest redigeret d. 06.12.2011 09:48 af Bruger #16700
Har du mulighed for at beskrive hvad det egenligt er du forsøger at opnå, jeg tror du er lidt på afveje mht til opbygningen af dit klassebibliotek vs frontenden.

Så har vi i hvert fald mulighed for at give et bedre løsningsforslag.

Desuden er det lidt at skyde sig selv i foden at benytte codebehind til css.

/J



Har du mulighed for at beskrive hvad det egenligt er du forsøger at opnå


Hvis du mener med hvorfor jeg vælger at ligge min metode i TableBuildUp.cs, så er det fordi jeg ikke kan se (ud fra hvad metoden gør) hvorfor den skulle ligge i WebForm1.aspx.cs. Og det for mig giver mere mening at splitte det op og ligge den i en klasse for sig selv.

Jeg skal dog ikke sige om dette er god kode skik. Da dette er et "learn by doing" projekt.

Hvis du mener ASP.NET siden. Så er det en række tabeller, med 10 celler i hver. Hvor brugere skal kunne editere den tekst som er i hver celle.

Desuden er det lidt at skyde sig selv i foden at benytte codebehind til css.


Man er nød til at bruge det man kender. Og jeg kender ingenting til CSS endnu.

Men ved siden af dette. Så prøver jeg stadig at finde ud af hvorfor min get/set retunere den forkerte værdi. Er der noget jeg kan tjekke for at finde ud af dette?



Indlæg senest redigeret d. 06.12.2011 20:34 af Bruger #16700
Hej Laurits.
Mange tak for dit indlæg. Det er godt læsestof.
For at prøve at beskrive hvordan dette spiller sammen.

"problemet" opstår når jeg indlæser siden. Dvs når jeg går til http://ip
og selve siden bliver requestet første gang uden at trykke på noget.

request
Fold kodeboks ind/udCSharp kode 


tbu.TableCreationOne() Dette virker helt fint, det er bare så i kan se metoden.
Fold kodeboks ind/udCSharp kode 


TableCreationAction()
Fold kodeboks ind/udCSharp kode 


Problemet opstår i tbu.TableCreationTwo(); inde i TableCreationAction()
hvor i get/set giver den forkerte værdi.
Fold kodeboks ind/udCSharp kode 


Og her ville jeg gerne vise at hvis jeg udkommentere tbu.TableCreationTwo(); i TableBuildUp.cs og sætter metoden over i WebForm1.aspx.cs, og retter TableCreationAction
fra
//TableCreationTwo();
tbu.TableCreationTwo();
til
TableCreationTwo();
//tbu.TableCreationTwo();

Så virker det alt sammen helt fint og get/set får de rigtige værdier, som ikke er teksten/værdien "Removed"

Det er ærgeligt at man ikke kan upload billeder her, da billeder siger mere end 1000 ord. Men dette er ikke meget andet end en masse tabeller med 10 celler hver. Hvor en celle kan editeres af en bruger. Og hvor indholdet/værdierne af tabellerne / cellenerne indlæses fra en tekst fil (nej ikke en database) separeret af # mellem hver celle.
f.eks
celle1Værdi#celle2Værdi#celle3Værdi#o.s.v#

Og inden nogle flamer eller sukker. Så husk en database er en tekstfil, her har nogle andre bare lavet en masse arbejde for dig, som du benytter dig af.

Tak på forhånd.



Hejsa Christian

Håber du lærte lidt, og vil gerne fortælle mere som du vil kunne gøre din kode nemmere at vedligeholde og mere effektiv, men dette kan vi måske tage over nogle mails.

Jeg lagde mærke til dette:

request
Fold kodeboks ind/udCSharp kode 


Her har du et objekt kaldet "tbu" som jeg ikke kan se hvor er defineret. Men kunne være en variabel der er sat. Men hvis du kan huske jeg fortalte at dine objekter forsvinder så snart at de er ude af scope.
Altså fx i din metode TableCreationTwo der laver du en tabel kaldet tb2 og denne værdi forsvinder så snart der ikke er noget der peger på dette objekt hvilket i dette tilfælde er når metoden er slut (selvom du har tilføjet resultatet af denne tabel til din liste.
Ved at du har tbu-objektet holder du en udgave af getAndSet i live, men ved ikke at bruge denne så laver du blot en anden instans af getAndSet som dermed får standart værdien da det ikke er denne der bruges i den første metode.
Og hvis du tænker over det så bruger du tbu-objektet i den første linie i page_load, så hvis du ændrer brugen længere nede bør du vel også ændre den her?

Derudover har jeg lidt svært ved at se hvorfor du tilføjer tabellen til sidens controller før du har udført action?

Og til sidst hvor holder du dit getAndSet-objekt i live? Er det static eller har du en variabel sat et sted der holder det i live?

Hvis vi ser lidt på hvordan vi kan effektificicere din kode og gøre den nemmere at vedligeholde, så ville jeg sige at du kan se lidt på Cascading Style Sheet (CSS). Dette er en måde at beskrive hvordan dine data skal styles/præsenteres og det gode er dette kan defineres et sted og dermed vil du kunne rette din farve olign. for alle steder nødvendigt med en rettelse istedet for 4-5 stykker.
Her tænker jeg specifikt på
Fold kodeboks ind/udCSharp kode 

vil du kunne ændre til
Fold kodeboks ind/udCSharp kode 

og ved at lave en CSS fil med følgende tekst:
Fold kodeboks ind/udCSS kode 

Er ikke sikker på om baggrundsfarven vil virke, men ellers vil du kunne tage et screenshot af din side, gå ind i paint, trykke Ctrl+V, vælge farven med pincetten og trykke på den. Her kan du se Red-, Green-, Blue-værdier som er RGB. Så går du på Google og søger efter "RGB to HEX", hvor du vil kunne indtaste disse farvekoder som vil give en samlet kode.
Denne kopierer du og vil kunne indsætte istedet for PaleGoldenrod med "#".
Derved vil du kunne ændre alle de celler til en anden farve ved at ændre farvekoden et enkelt sted.

Jeg sender dig en mail ang. lidt forslag til forbedring af din kodestruktur, og håber ikke jeg virker for belærende da jeg blot ønsker at hjælpe.



Hej Laurits.

Mange tak for endnu en god forklaring.
håber ikke jeg virker for belærende da jeg blot ønsker at hjælpe.

Overhoved ikke. Kan godt lide forklaringerne, og det er jo mig der spøger om hjælp :p

Jeg lagde mærke til dette:

Fold kodeboks ind/udCSharp kode 

Her har du et objekt kaldet "tbu" som jeg ikke kan se hvor er defineret.


i WebForm1.aspx.cs
Fold kodeboks ind/udCSharp kode 


Derudover har jeg lidt svært ved at se hvorfor du tilføjer tabellen til sidens controller før du har udført action?

Ja den kan jeg godt se at jeg ikke fik forklaret.

TableCreationOne() og TableCreationTwo er 90% ens. Den eneste forskel er at TableCreationOne() har static indhold. Og TableCreationTwo har dynamisk indhold (som ændres af brugeren).

form1.Controls.Add(tbu.TableCreationOne());
laver en tabel som de andre tabeller kommer under, så f.eks.

form1.Controls.Add(tbu.TableCreationOne()); laver
Navn|Vejnavn|Skole|Mad|Bil (nogle random navne)

og TableCreationAction(); henter/læser så min tekst fil med informationer og oprettet tabeller under den første. Så jeg får

Navn |Vejnavn |Skole|Mad |Bil = tbu.TablecreationOne()
lasse|kioskVej|ja |pålæg|Nej = TableCreationAction()
Hans |xxxVej |nej |ost |ja = TableCreationAction()

And so on and on.
Dog står mit lige i min aspx side :p det var svært her.

Samtidig så har tbu.TableCreationOne og TableCreationAction()
hver sine get/set værdier.

tbu.TableCreationOne. Som jeg kun getter fordi de skal altid være det samme. Da det er den første tabel.
Fold kodeboks ind/udCSharp kode 


og TableCreationAction har så _CellOne -> _CellTeen med get og set. Da disse værdier ikke altid er de samme.

Og til sidst hvor holder du dit getAndSet-objekt i live? Er det static eller har du en variabel sat et sted der holder det i live?

Bygger dette spøglsmål på
Derudover har jeg lidt svært ved at se hvorfor du tilføjer tabellen til sidens controller før du har udført action?


Ellers tror jeg ikke at jeg forstår det rigtigt. (shoot from the hip) Men jeg ville mene at min metode TableCreationAction() holder get/set i live?

Og igen mange tak for hjælpen (alle). Det er sku lækkert når der er nogle der gider tage sig tid til et problem som man har.

Edit.
Nogen der har mod på at hjælpe mig?



Indlæg senest redigeret d. 10.12.2011 22:24 af Bruger #16700
<< < 12 > >>
t