Fetstil Fetstil Kursiv Understrykning linje färgläggning tabellverk Punktlista Nummerlista Vänster Centrerat högerställt Utfyllt Länk Bild htmlmode
  • Forum & Blog
    • Forum - översikt
      • .Net
        • asp.net generellt
        • c#
        • vb.net
        • f#
        • silverlight
        • microsoft surface
        • visual studio .net
      • databaser
        • sql-server
        • databaser
        • access
        • mysql
      • mjukvara klient
        • datorer och komponenter
        • nätverk, lan/wan
        • operativsystem
        • programvaror
        • säkerhet, inställningar
        • windows server
        • allmänt
        • crystal reports
        • exchange/outlook
        • microsoft office
      • mjukvara server
        • active directory
        • biztalk
        • exchange
        • linux
        • sharepoint
        • webbservers
        • sql server
      • appar (win/mobil)
      • programspråk
        • c++
        • delphi
        • java
        • quick basic
        • visual basic
      • scripting
        • asp 3.0
        • flash actionscript
        • html css
        • javascript
        • php
        • regular expresssion
        • xml
      • spel och grafik
        • DirectX
        • Spel och grafik
      • ledning
        • Arkitektur
        • Systemutveckling
        • krav och test
        • projektledning
        • ledningsfrågor
      • vb-sektioner
        • activeX
        • windows api
        • elektronik
        • internet
        • komponenter
        • nätverk
        • operativsystem
      • övriga forum
        • arbete karriär
        • erbjuda uppdrag och tjänster
        • juridiska frågor
        • köp och sälj
        • matematik och fysik
        • intern information
        • skrivklåda
        • webb-operatörer
    • Posta inlägg i forumet
    • Chatta med andra
  • Konto
    • Medlemssida
    • Byta lösenord
    • Bli bonsumedlem
    • iMail
  • Material
    • Tips & tricks
    • Artiklar
    • Programarkiv
  • JOBB
  • Student
    • Studentlicenser
  • KONTAKT
    • Om pellesoft
    • Grundare
    • Kontakta oss
    • Annonsering
    • Partners
    • Felanmälan
  • Logga in

Hem / Forum översikt / inlägg

Posta nytt inlägg


anropa metoder mellan en form och en separat klass

Postades av 2009-02-17 05:32:29 - Torbjörn Karlsson, i forum c# (c-sharp), Tråden har 5 Kommentarer och lästs av 2294 personer

I ett försök att anropa metoder mellan en form och en separat klass (objekt) så skapade jag en enkel
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;
}
}
}


Svara

Sv: anropa metoder mellan en form och en separat klass

Postades av 2009-02-17 08:46:19 - Cecilia Wirén

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 (?).

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)






Svara

Sv:anropa metoder mellan en form och en separat klass

Postades av 2009-02-17 18:21:14 - Torbjörn Karlsson

Tack Cecilia

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;
}

}
}


Svara

Sv: anropa metoder mellan en form och en separat klass

Postades av 2009-02-18 08:40:44 - Cecilia Wirén

        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(); 
        } 


Svara

Sv:anropa metoder mellan en form och en separat klass

Postades av 2009-03-23 12:33:23 - Torbjörn Karlsson

Lika bra att fortsätta den här tråden ett tag till tror jag ...blir inte klok på det här :-[

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;
}
}



}
}


Svara

Sv: anropa metoder mellan en form och en separat klass

Postades av 2009-03-26 11:39:04 - Cecilia Wirén

Om du har en ny fråga så ställ den gärna i en ny tråd.

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; 
            }         
        } 


   
    } 
}


Svara

Nyligen

  • 18:42 Hvor finder man håndlavede lamper
  • 18:41 Hvor finder man håndlavede lamper
  • 16:36 Allt du behöver veta om keramiskt
  • 16:14 Vem anlitar man egentligen när tak
  • 16:14 Vem anlitar man egentligen när tak
  • 16:13 Vem anlitar man egentligen när tak
  • 11:52 Noen erfaring med uttak hos Mostbe
  • 11:51 Noen erfaring med uttak hos Mostbe

Sidor

  • Hem
  • Bli bonusmedlem
  • Läs artiklar
  • Chatta med andra
  • Sök och erbjud jobb
  • Kontakta oss
  • Studentlicenser
  • Skriv en artikel

Statistik

Antal besökare:
Antal medlemmar:
Antal inlägg:
Online:
På chatten:
4 570 699
27 958
271 741
717
0

Kontakta oss

Frågor runt konsultation, rådgivning, uppdrag, rekrytering, annonsering och övriga ärenden. Ring: 0730-88 22 24 | pelle@pellesoft.se

© 1986-2013 PelleSoft AB. Last Build 4.1.7169.18070 (2019-08-18 10:02:21) 4.0.30319.42000
  • Om
  • Kontakta
  • Regler
  • Cookies