I ett försök att anropa metoder mellan en form och en separat klass (objekt) så skapade jag en enkel Problemet är att du i din MyClass skapar nya textboxar som du hämtar värdena ifrån, dessa boxar syns inte för användaren eftersom de inte ligger på formuläret utan bara i MyClass klassen. De textboxar du vill läsa från ligger på MyForm och heter då nåt annat (?). Tack Cecilia Lika bra att fortsätta den här tråden ett tag till tror jag ...blir inte klok på det här :-[ Om du har en ny fråga så ställ den gärna i en ny tråd.anropa metoder mellan en form och en separat klass
applikation.
MyForm:
Har 2 textboxar för input, en label för output, en knapp
MyClass:
Skall ta emot värden från textboxarna och lägga ihop dessa, och sedan skriva ut i label.
Ingen beräkning sker eftersom det är strängar.
Det skapas inga felmeddelanden, ingen hint om varför det inte fungerar.
Jag vet dock att MyClass fungerar, om jag stoppar in den i MyForm, men det vill jag inte.
myForm.cs
---------------------------------------------------------------------
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace TestaMetoder
{
public partial class MyForm : Form
{
// Instans av MyClass
MyClass myResult = new MyClass();
private void Form1_Load(object sender, EventArgs e)
{
}
public MyForm()
{
InitializeComponent();
}
private void btnCalculate_Click(object sender, EventArgs e)
{
// Metodanrop
myResult.MyInput();
myResult.MyCalculation();
myResult.MyResult();
}
}
}
myClass.cs
---------------------------------------------------------------------
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace TestaMetoder
{
public class MyClass
{
// Instanser av textboxar m.m.
TextBox txtBoxOne = new TextBox();
TextBox txtBoxTwo = new TextBox();
Label lblResult = new Label();
Label lblPlus = new Label();
Label lblEqual = new Label();
Button btnCalculate = new Button();
// Deklaration av variabler
public string BoxOne;
public string BoxTwo;
public string Calculation;
public void MyInput() // Input från textboxar
{
BoxOne = txtBoxOne.Text;
BoxTwo = txtBoxTwo.Text;
}
public void MyCalculation() // En addering sker av 2 strängar, inte en beräkning
{
MyInput();
Calculation = BoxOne + BoxTwo;
}
public void MyResult() // Utskrift av resultat
{
MyCalculation();
lblResult.Text = Calculation;
}
}
}Sv: anropa metoder mellan en form och en separat klass
i MyClass skall du ta bort:
TextBox txtBoxOne = new TextBox();
TextBox txtBoxTwo = new TextBox();
Label lblResult = new Label();
Label lblPlus = new Label();
Label lblEqual = new Label();
Button btnCalculate = new Button();
Sen behöver du istället ha en referens till Formuläret. Detta kan du lösa lite olilka
Vet inte riktigt hur du anropar klassen men jag antar att du gör detta i samband med att du trycker på knappen på formuläret?
(alt 1) Antingen kan du skicka med en referens när du skapar klassen dvs till dess konstruktor (i MyClass):
MyForm theForm;
MyClass(MyForm f)
{
theForm = f;
}
istället för (i MyForm)
new MyClass()
skriver du då
new MyClass(this)
this är en referns till objektet som "man är i". och här skickar du med MyForm objektet till MyClass så den kan känna till MyForm och "hitta dit"
Så kan du sedan komma åt textboxarna
BoxOne = theForm.TextBox1.Text;
(alt 2) Ett snyggare sätt är att när du anropar funktionen i MyClass skicka med värderna från textboxarna och låta funktionen returnera svaret
namespace TestaMetoder
{
public class MyClass
{
public static string CalculateResult(string boxOne, string boxTwo) // Utskrift av resultat
{
return boxOne + boxTwo;
}
}
}
Du kan då också låta funktionen vara static (som jag skrev) det betyder att du inte behöver skapa en instans av klassen för att använda den, dvs inget new. Utan bara anropa den enligt (i MyForm och OnClick för knappen)
LabelResult.Text = TestaMetoder.CalculateResult(Textbox1.Text,Textbox2.Text)
Sv:anropa metoder mellan en form och en separat klass
Jag hänger med på att ta bort alla formelement från MyClass, det verkar logiskt.
Men jag hänger inte helt med på resten.
Lite fel på vägen:
Error 1 Keyword 'this' is not available in the current context - MyForm.cs
Error 2 TestaMetoder.MyClass' does not contain a constructor that takes '1' arguments - MyForm.cs
MyForm
-----------------------------------------------------------------------------------------------------
namespace TestaMetoder
{
public partial class MyForm : Form
{
// Instans av MyClass
MyClass getResult = new MyClass(this);
private void Form1_Load(object sender, EventArgs e)
{
}
private enum MyCombo
{
Ett,
Två,
Tre,
Fyra,
}
public MyForm()
{
InitializeComponent();
cmbMyCombo.DataSource = Enum.GetValues(typeof(MyCombo));
}
private void btnCalculate_Click(object sender, EventArgs e)
{
//getResult.BoxOne();
}
}
}
MyClass
------------------------------------------------------------------------------------------------------
namespace TestaMetoder
{
public class MyClass
{
// Deklaration av variabler
public int BoxOne;
public int BoxTwo;
public int Calculation;
MyForm theForm;
MyClass(MyForm f)
{
theForm = f;
}
public void MyInput()
{
BoxOne = Convert.ToInt32(theForm.txtBoxOne.Text);
BoxTwo = Convert.ToInt32(theForm.txtBoxTwo.Text);
}
public void MyCalculation(int BoxOne, int BoxTwo)
{
this.Calculation = BoxOne + BoxTwo;
}
}
}Sv: anropa metoder mellan en form och en separat klass
MyClass getResult;
private void Form1_Load(object sender, EventArgs e)
{
getResult = new MyClass(this);
}
Du får skapa MyClass instansen när MyForm Objektet är "färdigt" istället. Som du skrev så görs det när variablarna för klassen håller på att skapas och då är objektet inte "färdigt" och this finns inte än.
ELLER så kan du lägga den i konstruktorn för MyFormklassen istället
public MyForm()
{
InitializeComponent();
getResult = new MyClass(this);
cmbMyCombo.DataSource = Enum.GetValues(typeof(MyCombo));
}
Fel nummer två ser lite skumt ut, kanske ett följdfel bara.
Du fick två möjliga vägar att gå ser ut som du började med alt 1 och sen vävde in alt 2. om vi bortser från alt 2, så skall din kod se ut såhär istället:
public void MyCalculation()
{
theForm.lblResult.Text = BoxOne + BoxTwo;
}
private void btnCalculate_Click(object sender, EventArgs e)
{
getResult.MyCalculation();
}
Sv:anropa metoder mellan en form och en separat klass
Kan någon förklare varför ett statiskt strängvärde fungerar att skicka från en klass till en annan, men inte en sträng från en textbox.
Den ickefungerande varianten med textboxen är bortkommenterad nedan i get|set och ersatt med en statisk sträng. (Textboxen existerar i Form klassen och har rätt namn och allt sådant.)
Koden är för min egen learningbydoing. Strängen skickas från form-klassen till den andra klassen och sedan tillbaka för att visas i en label. Har provat att mixtra med datatyper också men det gillade inte kompilatorn, så nu kör jag plain strings.
---------------------------------------------------------
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace myNameSpace
{
public partial class myFormClass : Form
{
private string firstValue;
public myFormClass()
{
InitializeComponent();
}
public string First
{
//get { return this.first = txtDeposition.Text; }
get { return this.firstValue = "en sträng"; }
set { this.firstValue = value; }
}
private void button1_Click(object sender, EventArgs e)
{
PrintResult();
}
public void PrintResult()
{
mySecondClass getValue = new mySecondClass();
label1.Text = getValue.Second.ToString();
}
}
public class mySecondClass
{
myFormClass getForm = new myFormClass();
//Private field
private string secondValue;
//Constructor
public mySecondClass()
{
}
public string Second
{
get
{
return this.secondValue = getForm.First.ToString();
}
set
{
this.secondValue = value;
}
}
}
}Sv: anropa metoder mellan en form och en separat klass
Problemet är att du i din mySecondClass skapar en ny instans av myFormClass vilket du inte vill du vill ju att den jobbar mot den formulär som du redan har öppet. Anledningen till att du inte ser det andra är att du inte har tagit fram det med tex getForm.Show()
Om du skickar med en referens till formläret till mySecondClass när du skapar det objektet (vid new mySecondClass) kan du fånga den kopplingen istället.
Nedanstående kod borde fungera bättre:
namespace myNameSpace
{
public partial class myFormClass : Form
{
private string firstValue;
public myFormClass()
{
InitializeComponent();
}
public string First
{
get { return this.first = txtDeposition.Text; }
set { this.firstValue = value; }
}
private void button1_Click(object sender, EventArgs e)
{
PrintResult();
}
public void PrintResult()
{
mySecondClass getValue = new mySecondClass(this);
label1.Text = getValue.Second.ToString();
}
}
public class mySecondClass
{
myFormClass getForm;
//Private field
private string secondValue;
//Constructor
public mySecondClass(myFormClass f)
{
getForm = f;
}
public string Second
{
get
{
return this.secondValue = getForm.First.ToString();
}
set
{
this.secondValue = value;
}
}
}
}