Avatar billede annsofie85 Nybegynder
08. marts 2012 - 14:26 Der er 9 kommentarer og
1 løsning

Overføre variabel mellem en form og en klasse

Hej

Jeg har problemer med at overføre en variabel fra en form og benytte den i en klasse. Jeg har prøvet forskellige ting men jeg får kun overført en tom string. Jeg har en textbox i klassen Form1 hvor jeg gemmer det indtastede i en variabel (vardi). Det virker fint.
Problemet er når jeg vil bruge denne variabel i klassen ConnectionNF så er variablen et tomt felt. (jeg skal bruge variablen til at hente data ud fra en database)


public class Form1
{
    public string vardi;
    public void button1_Click(object sender, EventArgs e)
        {
            try
            {
                this.Text = textBox1.Text;
                vardi = textBox1.Text.ToString();
               
                ConnectionNF conNF = new ConnectionNF();

                // Call ConnectionNF class' method
                conNF.createConNF();
            }
}

public class ConnectionNF
{
  Form1 frm = new Form1();
    public void getDataNF()
    {
      try
      {
        //Henter data ud af en tabel og viser det i konsollen
       
        string queryString = "select * from WHERE CPR='" + 
        frm.vardi + "'";
       
        using (SqlCommand myCommandtwo = new SqlCommand
              (queryString, myConnection))
        {
            using (SqlDataReader myReader =
                  myCommandtwo.ExecuteReader())
            {
              while (myReader.Read())
              {
                  string cpr = myReader.GetString(0);
                  string fornavn = myReader.GetString(1);
                  string efternavn = myReader.GetString(2);
                                                   
                  Console.WriteLine("CPR = {0}, Fornavn = {1},
                                    Efternavn = {2}", cpr,
                                    fornavn, efternavn);
                  Console.ReadLine();
                  myReader.Close();
              }
            }
        }
    }
    catch (Exception e)
    {
      Console.WriteLine(e.ToString());
    }
}

Jeg har også prøvet at lægge det i en ny variabel i klassen ConnectionNF:

string value;
value = frm.textBox1.Text.ToString();

Men ligelidt hjælper det.
Jeg har også forsøgt med:

public string getVardi
  {           
    get { return vardi;}
    set { vardi = value;}
  }
i Form1 og så kalde den i ConnectionNF, men heller intet held her.

Nogen der kan hjælpe?
Avatar billede Syska Mester
08. marts 2012 - 15:12 #1
Du kan ikke bare oprette et ny Form1 og tilgå den variable som om det var en andens.

Form1 form1 = new Form1();

Form1 form2 = new Form1();

form1.Text = "super"; <- Den værdi du gerne vil læse.

men du prøver at tilgå den via en anden instance "form2" som du oprette i din "ConnectionNF" class.

Du kan sende en Form1 med til din connection class ala dette:

public class ConnectionNF
{
    public void getDataNF(Form1 form1)
    {
this.frm = form1;
      try
      {
        //Henter data ud af en tabel og viser det i konsollen
       
        string queryString = "select * from WHERE CPR='" + 
        frm.vardi + "'";
       
        using (SqlCommand myCommandtwo = new SqlCommand
              (queryString, myConnection))
        {
            using (SqlDataReader myReader =
                  myCommandtwo.ExecuteReader())
            {
              while (myReader.Read())
              {
                  string cpr = myReader.GetString(0);
                  string fornavn = myReader.GetString(1);
                  string efternavn = myReader.GetString(2);
                                                   
                  Console.WriteLine("CPR = {0}, Fornavn = {1},
                                    Efternavn = {2}", cpr,
                                    fornavn, efternavn);
                  Console.ReadLine();
                  myReader.Close();
              }
            }
        }
    }
    catch (Exception e)
    {
      Console.WriteLine(e.ToString());
    }
}

og

public void button1_Click(object sender, EventArgs e)
        {
            try
            {
                this.Text = textBox1.Text;
                vardi = textBox1.Text.ToString();
               
                ConnectionNF conNF = new ConnectionNF(this);

                // Call ConnectionNF class' method
                conNF.createConNF();
            }
}
Avatar billede Syska Mester
08. marts 2012 - 15:13 #2
Du kunne også bare sende din string med til din ConnectionNF class, enten som constructor parameter eller method argument.

mvh
Avatar billede kloge Nybegynder
08. marts 2012 - 15:14 #3
prøv at anvende

string queryString = "select * from WHERE CPR='" + 
        Form1.Edit1.text + "'";

istedet
Avatar billede kloge Nybegynder
08. marts 2012 - 15:34 #4
Undskyld textBox1.Text, ikke Edit1.text
Avatar billede annsofie85 Nybegynder
12. marts 2012 - 09:59 #5
@kloge: de´t har jeg prøvet og det virker ikke

Jeg har problemer med at få sendt værdien over til klassen ConnectionNF. Jeg får fejlen: 'NFtoKP.ConnectionNF' does not contain a constructor that takes 1 arguments' når jeg prøver at sende this videre til ConnectionNF

public void button1_Click(object sender, EventArgs e)
        {
            try
            {
                this.Text = textBox1.Text;
                vardi = textBox1.Text.ToString();
               
                ConnectionNF conNF = new ConnectionNF(this);

                // Call ConnectionNF class' method
                conNF.createConNF();
            }
}

Hvad skal jeg gøre for ikke at få den fejl?
Avatar billede Syska Mester
12. marts 2012 - 10:03 #6
Hvordan ser din "ConnectionNF" klasse ud?

Tager den et constructor argument af typen "Form1" som du sender med?
Avatar billede annsofie85 Nybegynder
12. marts 2012 - 10:17 #7
Klassen ser således ud: Hvor jeg kalder getDataNF()(som er den metode der skal bruge værdien fra Form1) i createConNF()

public class ConnectionNF
    {     
        Form1 frm1 = new Form1();
               
        public void createConNF()
        {
            //...Opretter forbindelse til SQLServer...
            getDataNF(frm1);
        }       

        public void getDataNF(Form1 form1)
        {
            this.frm1 = form1;
            try
            {
            //Henter data ud af en tabel og viser det i 
            konsollen
            string queryString = "select * from
                    fmwo\\sqlexpress].nfsql1.dbo.tblPersondata
                    WHERE CPR='" + frm1.vardi + "'";
                               
            using (SqlCommand myCommandtwo = new SqlCommand
                  (queryString, myConnection))
                {
                using (SqlDataReader myReader =
                        myCommandtwo.ExecuteReader())
                    {
                      while (myReader.Read())
                        {
                        string cpr = myReader.GetString(0);
                        string fornavn = myReader.GetString(1);
                        string efternavn = myReader.GetString(2);
                        // Write the values read from the
                        //database to the screen.
                       
                        Console.WriteLine("CPR = {0}, Fornavn =
                                {1}, Efternavn = {2}", cpr,
                                fornavn, efternavn);
                        Console.ReadLine();
                        myReader.Close();
                        }
                    }
                }
            }
            catch (Exception e)
            {
                Console.WriteLine(e.ToString());
            }
        }
Avatar billede Syska Mester
12. marts 2012 - 10:30 #8
public class ConnectionNF
    {     
        private readonly Form1 frm1;

public ConnectionNF(Form1 form1)
{
this.frm1 = form1;
}                 

        public void getDataNF()
        {
            try
            {
            //Henter data ud af en tabel og viser det i 
            konsollen
            string queryString = "select * from
                    fmwo\\sqlexpress].nfsql1.dbo.tblPersondata
                    WHERE CPR='" + frm1.vardi + "'";
                               
            using (SqlCommand myCommandtwo = new SqlCommand
                  (queryString, myConnection))
                {
                using (SqlDataReader myReader =
                        myCommandtwo.ExecuteReader())
                    {
                      while (myReader.Read())
                        {
                        string cpr = myReader.GetString(0);
                        string fornavn = myReader.GetString(1);
                        string efternavn = myReader.GetString(2);
                        // Write the values read from the
                        //database to the screen.
                       
                        Console.WriteLine("CPR = {0}, Fornavn =
                                {1}, Efternavn = {2}", cpr,
                                fornavn, efternavn);
                        Console.ReadLine();
                        myReader.Close();
                        }
                    }
                }
            }
            catch (Exception e)
            {
                Console.WriteLine(e.ToString());
            }
        }

I din form skal du så sende "this" med din dennes constructor.

var connection = new ConnectionNF(this);
connection.getDataNF();

Igen fra mit tidligere svar ...

Form1 form1 = new Form1();
Form1 form2 = new Form1();

Overstående 2 instances er ikke ens ... og derfor virekr det ikke som du har gjort tidligere ... der har du allerede en instance af Form1 hvor du har intastet data i ... og i din ConnectionNF klasse opretter du en ny instance, og den indeholder ikke de data. Derfor det ikke virker.

Og som en lille analogi ... fordi ford laver 1000 biler ud fra samme blue print, så er det jo ikke samme bil. De opfører sig kun på samme måde.

Håber det giver mening ...
Avatar billede annsofie85 Nybegynder
12. marts 2012 - 10:33 #9
Ja jeg fandt selv lige ud af at jeg selvfølgelig manglede en konstruktør af klassen ConnectionNF. Flot. Men det virker og tak for hjælpen buzzzz. Smid et svar så får du point :)
Avatar billede Syska Mester
12. marts 2012 - 12:28 #10
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
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

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