Gå til innhold

C#: [Løst] Skrive til en textbox i en form fra en Class


Anbefalte innlegg

Heisann!

 

Holder på med et lite prosjekt, og kom til et lite stop her. Prøver å få skrevet til en textbox som er i frmMain fra en Class.

 

Classen er definert slik:

public static classAI AI = new classAI();

 

Jeg prøvde meg på å lage en public void i frmMain som skriver rett til textboksen, men de får jeg ikke opp i classAI om jeg forsøker frmMain.Skrivtiltext..

 

Noen som kan hjelpe meg her?

Lenke til kommentar
Videoannonse
Annonse

Problemet er at classAI ikke har noen referanse til noen instanser av frmMain. Jeg ville brukt en event og en closure for å få dette til, fordi det gjør at koden kan lett brukes i mange andre sammenhenger. Her er et eksempel på hvordan dette gjøres:

 

public class WriteTextEventArgs : EventArgs
{
 public string Text { get; set; }
}
public class ClassAi
{
 public event EventHandler<WriteTextEventArgs> WriteText;

 public void SomeFunction()
 {
   if(WriteText != null)
     WriteText(this, new WriteTextEventArgs { Text = "Hello World!" });
 }
}

public class frmMain : Form
{
 public frmMain()
 {
   var MyTextBox = new TextBox() { Name = "MyTextBox" };
   Controls.Add(MyTextBox);
   var ai = new ClassAi();
   // Gi AI klassen en funksjon som skriver til MyTextBox dersom ai sin WriteText event blir kalt
   ai.WriteText += (sender, e) => MyTextBox.Text = e.Text;

   // Kall ai.WriteText event med "Hello World!"
   ai.SomeFunction();
 } 
}

 

Dette er derimot normalt ikke noe av det første en lærer, men jeg klarer ikke få meg til å skrive en løsning med statiske instanser av frmMain eller som lagrer frmMain i ClassAi, fordi det er dårlige løsninger.

Endret av GeirGrusom
Lenke til kommentar

Eller noe i denne duren dersom referansen til classAI ligger i frmMain:

 

   public class frmMain : Form {
       public static classAI AI = null;
       public frmMain() {
           if (AI == null) AI = new classAI(this); //Oppretter ny statisk instans av AI med referanse til frmMain
           AI.DoSomething();
       }
       public void UpdateTextBox(string text) {
           textBox1.AppendText(text);
       }
   }

   public class classAI {
       private frmMain FRM = null;
       public classAI(frmMain form) {
           this.FRM = form;
       }
       public void DoSomething() {
           FRM.UpdateTextBox("Hei hå");
       }
   }

 

Ingenting gale med statiske objekter, men man lærer fort at det kan være smart å ikke overdrive bruken. Synes det er helt greit dersom objektet/klassen logisk kun skal være en instans av i hele prosjektet. Feks en felles logge klasse.

 

Annen variant med callback metoder:

 

   public class frmMain : Form {
       public static classAI AI = null;
       public frmMain() {
           if (AI == null) AI = new classAI(UpdateTextBox); //Oppretter ny statisk instans av AI med referanse til metoden
           AI.DoSomething();
       }
       public void UpdateTextBox(string text) {
           textBox1.AppendText(text);
       }
   }

   public class classAI {
       private Action<string> callback = null;
       public classAI(Action<string> CallbackTextboks) {
           this.callback = CallbackTextboks;
       }
       public void DoSomething() {
           callback("Hei hå");
       }
   }

Lenke til kommentar

 

 

Ingenting gale med statiske objekter, men man lærer fort at det kan være smart å ikke overdrive bruken. Synes det er helt greit dersom objektet/klassen logisk kun skal være en instans av i hele prosjektet. Feks en felles logge klasse.

 

 

Hva er en bedre måte og lage objektet på? har flere objekter jeg genererer flere instanser av i prosjektet også.

Endret av Stig Jøran
Lenke til kommentar

Tja. Mange måter å gjøre ting på. Kommer jo helt an på hvordan ditt prosjekt er bygget opp.

 

Du kan ha en kontroller klasse som holder rede på de forskjellige instansene. Denne kan være statisk, eller du kan la den lage en singleton property på denne (slå opp singleton om du lurer på hva det er).

 

Så kan du sørge for at du tilgjengeliggjør alle mulige metoder på denne som kaller inn i det respektive instansene.

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å
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...