Avatar billede hopir Novice
25. februar 2013 - 09:30 Der er 21 kommentarer

En måde at lave en dataklasse på

Hejsa

Jeg står i en situation hvor jeg skal lave en dataklasse i c#

indhold i data.cs

        private string _server;
        private string _driver;
        private string _comment;
        private string _location;

        public string Server
        {
            get { return _server; }
            set { _server = value; }
        }

        public string Driver
        {
            get { return _driver; }
            set { _driver = value; }
        }

        public string Comment
        {
            get { return _comment; }
            set { _comment = value; }
        }

        public string Location
        {
            get { return _location; }
            set { _location = value; }
        }

når jeg opretter et object af klassen data, så får jeg fint de data der står i, når jeg så opretter et nyt object af klassen så er alle mine felter blevet nulled.

Hvordan får jeg gjort så min data i dataklassen forbliver der, indtil de bliver overskrevet.

Og er der en bedre måde at håndtere temp data på?

:)
Avatar billede lclemens Nybegynder
25. februar 2013 - 09:40 #1
Sådan er det jo. Ny instans af en klasse = nye kasser til dine data.

Er det static, du er ude efter? http://msdn.microsoft.com/en-us/library/79b3xss3%28v=vs.80%29.aspx
Avatar billede Syska Mester
25. februar 2013 - 09:41 #2
Klassen er dit blueprint om man vil til hvordan "klassen" skal bygges.

Hvis du laver 2 nye biler efter samme "blueprint", forventer du så også at det er samme bil? :-)

Har du lidt mere kode vi kan se på ... det vil gøre det nemmere.
Avatar billede Syska Mester
25. februar 2013 - 09:42 #3
#Iclemens

Lad nu være med at foreslå folk static, det er roden til _ALT_ ondt for nye. Hellere lære dem at gøre det rigtigt fra start af.

Der er intet ondt i det, men nye begynder automatisk at "misbruge" static keywordet.
Avatar billede lclemens Nybegynder
25. februar 2013 - 09:43 #4
Det kommer jo an på, hvad man skal lave.
Avatar billede lasserasch Juniormester
25. februar 2013 - 09:47 #5
Forstår ikke helt hvad du mener. Laver du en instans af klassen og sætter værdier i felterne, for derefter at lave en ny instans som så har null værdier i samme felter?

Det gir' jo meget god mening, da vi snakker 2 forskellige instanser.

Hvis du vil have "statiske" data. Eller dvs, default værdier i nogle properties så snart du opretter instansen, så skal du sætte disse værdier ind i din default constructor.

F.eks. :

public Data()
        {
            Server = "Server1";
            Driver = "Driver1";
            Comment = "En Kommentar";
        }



Iøvrigt skriver du alt for meget kode for at lave dine properties. Du kan nøjes med dette :

public class Data
    {
        public Data()
        {
            Server = "Server1";
            Driver = "Driver1";
            Comment = "En Kommentar";
        }
        public string Server { get; set; }
        public string Driver { get; set; }
        public string Location { get; set; }
        public string Comment { get; set; }
    }
Avatar billede lasserasch Juniormester
25. februar 2013 - 09:49 #6
Slap af man skal være hurtig hvis man skal nå at svare før jer drenge :-) Det er jo helt vildt ;-)
Avatar billede Syska Mester
25. februar 2013 - 09:50 #7
#lclemens

Der er få tilfælde hvor static properties er en bedre løsning end at lære manden at programmere med henblik på han måske engang skal ud og lave større løsninger. Når man kan det, så kan man gå tilbage og måske bruge mere static da man så kender alle udfordringerne.
Avatar billede hopir Novice
25. februar 2013 - 09:54 #8
Shit det går stærkt ja.. men dejligt (:

Static har jeg med vilje holdt mig fra, da jeg efterhånden har hørt og læst flere steder, at det netop er roden til alt ondt..

Jeg har default.aspx med et par tekstboxe og en knap på, de data vil jeg godt have over i mine get og set metoder

Men jeg kan jo ikke nå button1 fra data.cs ?
Avatar billede lasserasch Juniormester
25. februar 2013 - 09:56 #9
#buzzzz

Jeg er SÅ ENIG.
Avatar billede Syska Mester
25. februar 2013 - 10:02 #10
#lasserasch

Det var jeg næsten også sikker på :-)

Man skal i hvert fald være klar over hvad man gør, før man tror static løser alle verdens problemer.

Ja, man skal stå tidligt op. Men i det mindste sover Arne_v :-)

#hopir
Vi kan fortsætte i vores bil verden.

Din motor ved ikke om der er dæk på bilen, den arbejder bare. Den kan så måske undre sig over det nogen gange er brug for flere kræfter end andre gange.

Ergo, din Data klasse bør ikke kende til din knap, men din knap bør kende til din data klasse.

Du må komme med lidt kode. Vi har alle været nye engang :-)
Avatar billede lasserasch Juniormester
25. februar 2013 - 10:02 #11
Du har et click event på din knap. Herfra kan du nå dine tekst bokse.


Eksempel :



using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace WebApplication1
{

    public class Data
    {
        public Data(string val_server, string val_driver, string val_location, string val_comment)
        {
            Server = val_server;
            Driver = val_driver;
            Location = val_location;
            Comment = val_comment;
        }
        public string Server { get; set; }
        public string Driver { get; set; }
        public string Location { get; set; }
        public string Comment { get; set; }
    }

    public partial class WebForm1 : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {

        }

        protected void Button1_Click(object sender, EventArgs e)
        {
            Data data = new Data(tbname.Text, string.Empty, string.Empty, string.Empty);
        }
    }
}
Avatar billede hopir Novice
25. februar 2013 - 10:21 #12
#lasserasch
Lækkert, men hvordan gør jeg så når jeg skal bruge dem igen.

Når jeg opretter et nyt objekt af data klassen igen, så er de data jo igen nulled.. hvordan kommer jeg udover det ?
Avatar billede lasserasch Juniormester
25. februar 2013 - 10:31 #13
Hvad mener du med bruge dem igen?

Fremgangsmåden er vel at :

1. En bruger indtaster nogle værdier og trykker herefter på knappen.

2. Du har dit "Button click" event som fyres af og så kan du opretter en instans af din data klasse som du så kan gemme i din database eller hvad du nu skal med det hele.



Hvis du skal bruge samme instans på et senere tidspunkt, så kan man jo f.eks. gemmer instansen i session eller viewstate, lidt afhængig af hvad opgaven består i.


Jeg tror du bliver nødt til at forklare lidt nærmere omkring hvad det præcist er du ønsker skal ske.
Avatar billede hopir Novice
25. februar 2013 - 11:30 #14
det er fordi på fx default.aspx der er et afkrydsningsfelt, er det markeret, skal man sendes videre til en anden side og den side skal have adgang til de samme data som default havde..

Er det bedste bare at bruge sessions så ?
Avatar billede Syska Mester
25. februar 2013 - 14:45 #15
Det kan løses på X antal måder alt efter om du bruger client state, view state, session storage, client storage, query strings, cookies, you name it ... mange måder der kan løse et problem.

Hvad der er den bedste kommer nok mere an på dine skills og hvordan UX skal være på siden.

Skal det være SEO friendly ... der er mange spørgsmål.

Så ... show us the code ... og fortæl os hvordan du vil have løsningen skal virke.
Avatar billede lasserasch Juniormester
25. februar 2013 - 15:01 #16
Du kan gemme din klasse i session og så hente den ud for hver side ja.

Men som buzzzz skriver. Vis hvad du har af kode og lad os hjælpe dig derfra.
Avatar billede hopir Novice
25. februar 2013 - 15:12 #17
Jeg tror jeg har fået en løsning der kan bruges:

Jeg er gået tilbage til sessions.

i min dataklasse:
        private static string _server;

        public static string Server
        {
            get
            {
                if (HttpContext.Current.Session[sessionWrapper._server] == null)
                { return string.Empty; }
                else
                { return HttpContext.Current.Session[sessionWrapper._server].ToString(); }
            }
            set
            { HttpContext.Current.Session[sessionWrapper._server] = value; }

        }

nu kan jeg få samlet alle mine data i en klasse/wrapper, og kan genbruge de data der står i min session.

Har i nogle indvendiger omkring ovenstående? :)
Avatar billede lasserasch Juniormester
25. februar 2013 - 15:22 #18
Jeg ville ikke lægge hver property derned. Jeg ville derimod lægge selve klassen i session. Så har du kun et objekt hvor du holder styr på alle dine properties.

Så kan du hente instansen af data klassen ud fra session ala :
Og så selvfølgelig huske at gemme i session inden du redirecter til en ny side.


private Data GetSessionObject()
{
  Data d = null;

  if (Session["data"] != null)
    d = (Data)Session["data"];
  else
    d = new Data();

  return d;
}
Avatar billede Syska Mester
25. februar 2013 - 15:30 #19
What he said ... omend det er ikke vildt kønt, men MEGET bedre end stadig variabler.
Avatar billede lasserasch Juniormester
25. februar 2013 - 15:46 #20
:-)

Alternativt skulle du prøve at kigge på en Wizard kontrol.

Der kan du have flere sider og navigere frem og tilbage uden at tænkte på at skulle gemme data mellem siderne.

Og så først til sidst håndtere de indtastede data.
Avatar billede hopir Novice
05. februar 2014 - 19:17 #21
Hold da op... ret tilfreds med den gejst i har drenge ;)

lasse smider du ikke et svar :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester