# VS c# variable von form1 -> form 2



## stingreydid (21. November 2011)

Hallo Leute habe ein Problem in visual studio.
Ich weiß, dass man dazu bei google viel findet, aber ich verstehe nicht was die da machen.

Ich habe zwei Forms.
FormMain und FormWordlist
in FormWordlist habe ich eine stringlist string[] sArrayWords
diese will ich, sobald buttonApply geklickt wird, in meine formMain übergeben (Variable public string[] sWordlist)

Wie mache ich das? :S
MfG


----------



## Crysis nerd (21. November 2011)

Du hast kein problem mit Visual Studio, sondern ein Verständnis Problem mit der Programmiersprache, die du benutzt, meiner Vermutung nach C#.
Bitte poste mal ein wenig Code hier, ich denke das würde es allen leichter machen.

mfg


----------



## stingreydid (21. November 2011)

FormMain:
        public string[] sWortliste;

        int iGeschlecht;
        int iDrawCount;
        int iCounterMax;
        string sUnknown;
        string sUnknownUpper;
        string sAusgabe;
        string sBuchstabe;
        string sBuchstabeUpper;
        Graphics oGraphics;

der public string[] sWortliste soll gleich sein dem sArrayString von formWordlist

FormWordlis:
        private void buttonApply_Click(object sender, EventArgs e)
        {
            WordlistToWord();                                                                 // Liste von Wörtern wird überprüft und einzelne Wörter werden in ein Array geschrieben
            string[] sArrayWords = aWords.ToArray(typeof(string)) as string[];                // Das Array wird in ein String-Array umgewandelt
            this.Close();
        }

Hoffe das hilft weiter.
Allerdings ist es ein Verständnisproblem, verstehe das ganze mit get und set nicht :S
ging in c einfacher haha


----------



## deckard-cain (21. November 2011)

Vorausgesetzt FormWordlist ist ein ChildWindow von FormMain:

Instanziiere ein neues FormWordList in FormMain und greife direkt auf das Property zu.

(Mal davon abgesehen, dass deine "WordList ein Array und keine List ist.)

Beispiel zur Umsetzung:

ClassMember in FormMain:

private FormWordList frmWL;


Im Event Form.Load des FormMain:

frmWL = new FormWordList();
frmWL.Show();


Im FormWordList:

private List<string> _wordList = new List<string>();
public List<string> wordList
{
    get{ return _wordList;}
    set{ _wordList = value; }
}


Im FormWordList setzt Du normal deine _wordList und im FormMain kannst Du über deine Instanz des FormWordList (frmWL) auf das property und die Werte zugreifen:

List<string> myList = frmWL.wordList;


Properties kapseln dabei immer die internen ClassMember, wobei get für das Auslesen der Werte und set für das Setzen der Werte verantwortlich ist.

Alternativ geht das ganze auch über Events, aber das hier ist der einfachste Ansatz.

Zuweisen von Elementen zu Listen erfolgt dann per Add-Methode ... -> _wordList.Add("neuer string");

Happy coding ...


----------



## fadade (21. November 2011)

€dit: da war jemand schneller


----------



## stingreydid (21. November 2011)

Ich verstehe es immer noch nicht o_O.
        private void buttonWortliste_Click(object sender, EventArgs e)
        {
            new formWordlist().ShowDialog();
        }
Hier wird die formWordlist von der formMain aufgerufen.
Diese Variable würde ich gerne übertragen, sobald buttonApply geklickt wird:
            string[] sArrayWords = aWords.ToArray(typeof(string)) as string[];
im aWords stehen mehrere Wörter. im string[] sArrayWords ist dann z.b. für string[1] = Hallo drinnen und diese stringliste möchte ich in die main übertragen.


----------



## stingreydid (22. November 2011)

keiner eine idee??


----------



## Mayday21 (19. Dezember 2011)

*1. Synchroner Ablauf (einfacher Weg, der aber nicht schön ist)*

```
//Instanziieren
FormWordlist formWordlist = new FormWordlist();

//Alternativ Anzeige mit ShowDialog, dann bleibt das Programm stehen und wartet auf Rückgabewert
DialogResult result = formWordlist.ShowDialog();

//result enthält einen von Dir definierten Wert und gibt an, ob Du den Dialog abgebrochen hast oder ordentlich abgearbeitet hast.
if (result == DialogResult.OK)
{
     //So, und nun greifst Du auf eine Property deines Unterfensters zu, in meinem Beispiel "List"
     var list = formWordlist.List;
}
```
*2. Asynchroner Ablauf (flexibler)*
FormWordlist.cs

```
//Einen EventHandler definieren, der Dir anzeigt, wenn etwas erreicht ist (die delegate Zuweisung soll nur bewirken, daß der Event nicht null sein kann, sonst brauchst Du mehr Code)
public event EventHandler Completed = delegate {};

//Methode definieren, die durch den OkButton ausgelöst wird
public void OkClicked(object sender, EventArgs args)
{
    //Die Methode soll den oben definierten Event aufrufen
    Completed(this, EventArgs.Empty);
}
```
So, dein Aufgerufener paßt, nun zum Aufrufenden

```
public void CallingMethod()
{
    //Instanziieren
    FormWordlist formWordlist = new FormWordlist();

    //Wir klinken uns auf den definierten event ein und horchen, bis der sich meldet
    formWordlist.Completed += FormWordlistCompleted;

    //Anzeige Form mit Show (dann läuft das Programm normal weiter, da Show asynchron aufgerufen wird
    formWordlist.Show();
}

//Unsere Methode, die beim Aufruf des Events gefeuert wird
private void FormWordlistCompleted(object sender, EventArgs e)
{
   //im Sender steckt unsere FormWordlist, das haben wir bei der Event-Definition so definiert ("this" Parameter)
   var formWordlist = sender as FormWordlist;

   //und nun der Zugriff auf die Liste
   var x = formWordlist.List;
}
```


----------

