Gå til innhold

C#: Flytte en variabel fra ett form til ett annet.


Anbefalte innlegg

Hei

 

Jeg har en tekstboks i en form hvor brukeren skal fylle inn no og så trykke OK. Det jeg da vil skal skje er at det som blir fylt ut der (textbox1.test) skal inn en listbox på ett annet form.

 

Problemet er at jeg ikke finner f.eks listbox1 fra den aktuelle formen. Hva må jeg gjøre for å få til dette?

Lenke til kommentar
Videoannonse
Annonse

Hvis du åpner form2 med: new Form2(this), så har du prinsippkoden i Form2:

 

public partial class Form2 : Form
{
 Form parent

 public Form2(Form p)
 {
 parent = p;
 }

 private void okButton_Click(object sender, EventArgs e)
 {
parent.listBox1.Items.Add(..)
this.Close();
 }
}

 

kindof... :p

Endret av Manfred
Lenke til kommentar

Jeg prøvde å gjøre det du skrev (selv om jeg ikke helt forstår det... newbie :)) men får dette fremdeles ikke til å fungere.

 

parent. gir meg ikke listbox1 som valg. Forsøkte å bare skrive det alikevell og får da såklart:

 

'System.Windows.Forms.Form' does not contain a definition for 'listbox1'

Lenke til kommentar
  • 3 uker senere...

Hvis du bare skal dele en verdi, ville det ikke vært enklest å legge den i en statisk klasse i namespacet?

 

static class Verdier

{

string tekst = "";

}

 

I form1 setter du teksten

Verdier.tekst = txtbox.Text;

 

Og i form2 når du den

listbox1.Items.Add(Verdier.tekst);

 

Mulig dette ikke fungerer :p Jeg gadd ikke teste det. Veit ikke om en kan forandre noe i en statisk klasse eller ikke.

Lenke til kommentar

man kan endre verdien i en statisk klasse så lenge objektet ikke er deklarert readonly

 

public static class Verdier
{
 public static string Hallo1 = "Hello World!"
 public static readonly string Hallo2 = "Hello World!";

 public static int Main()
 { 
Hallo1 = "Hei verden!"; // Går fint
Hallo2 = "Hei Verden!"; // Går ikke, Hallo2 er readonly.
 }
}

 

Men som regel så unngår man å lage statiske felter så mye man kan.

Jeg pleier å ha en static versjon av hovedvinduet i MDI programmer:

 

public static class Program
{
 private static MainForm s_main;
 public static MainForm MainForm { get { return s_main;} }
 public static int main()
 {
s_main = new MainForm();
Application.Run(s_main);
 }
}

 

Utover det, bruker jeg ikke statiske felter.

Lenke til kommentar

Er vel like greit å lage en public variabel/property i form2 som du leser etter at du har fått DialogResult.OK fra form2.

 

Eks:

 

form2

public partial class form2: Form
{
public string myVar;
public form2()
{
	InitializeComponent();
}
}

form1:

if(form2.ShowDialog() == DialogResult.OK)
{
this.textbox1.Text = form2.myVar;
}

 

Sørg for at du setter DialogResult-property'en på OK-knappen din i form2 til "OK".

 

Edit: Hvis du skal gå direkte på form2.textbox1, så må du gå i designer-fila og endre modifier fra private til public.

Endret av Spartakus
Lenke til kommentar

Nei, man skal ikke bruke public variabler, det er dårlig programmeringsskikk, og det er det en veldig god grunn til.

 

Man bruker properties, fordi da er det programmet ditt som styrer innholdet i variabler, og du vet samtidig om variablen blir endret.

 

Derfor bruke man alltid properties istedet for public variabler.

Det som også skjer hvis du bruker property her, er at du programmatisk gjøre variablen read only.

 

Selvom "Det er så mye enklere med public variabler" så er det utrolig dårlig programmeringsskikk å gjøre det.

Lenke til kommentar

Det du kunne gjort i form 1

public string PopUp()
{
this.ShowDialog();

return this.TextBox1.Text;
}

 

så i form 2

textbox1.Text = form1.PopUp();
this.ShowDialog();

 

På denne måten burde du først få opp form 1 så du kan skrive inn en verdi, så få opp form 2 med verdien i seg :)

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...