2017-02-06 1 views
2

Ich habe zwei Formulare, die miteinander interagieren müssen. Das übergeordnete Formular verfügt über 4 Felder und eine Schaltfläche zum Hinzufügen, die Daten aus jedem Feld in einer Instanz eines Klassenobjekts speichert. Nach dem Speichern in einem Objekt wird das Objekt in einer Listbox gespeichert, die das untergeordnete Formular enthält. Ich habe ein benutzerdefiniertes Ereignis erstellt, um mit diesem Zeug umzugehen, aber ich mache sicherlich etwas falsch.Die wichtigsten Formularfelder zeigen nur die Daten des ersten in der Listbox ausgewählten Elements an.

Wenn beide Fenster geöffnet sind und sich Daten in der Listbox befinden, wird das Element, das aus der untergeordneten Formularliste ausgewählt wird, die übergeordneten Formularfelder mit den Daten aus diesem Objekt gefüllt. Wenn ich meinen Code ausprobiere, sind nur die ersten Daten korrekt in die richtigen Felder eingetragen. Wenn ich nach der ersten Auswahl auf ein anderes Element klicke, werden die Hauptformularfelder überhaupt nicht aktualisiert.

Spezifisch für mein Problem des Kind Form hat die folgenden Codes:

public EventHandler ListBoxItemClicked; 
private void pPotionList_SelectedIndexChanged(object sender, EventArgs e) 
{ 
    PotionForm tempMain = new PotionForm(); //this was a test, nothing changed 
    pPotionList.SelectionMode = SelectionMode.One; 
    if (ListBoxItemClicked != null) 
    { 
     ListBoxItemClicked(this, new EventArgs()); 
    } 
    tempMain.Refresh();  // this too 
} 

Die Mutter Form hat diesen Codes

private void pListDisplay_Click(object sender, EventArgs e) 
{ 
    PotionList secForm = new PotionList(); 

    secForm.secFormBox.DataSource = potionBindList; 

    PotionListChanged += secForm.HandlePotionListChanged; 

    secForm.ChildPotionListChanged += HandleChildPotionListChanged; 

    secForm.ListBoxItemClicked += HandleListBoxItemClicked; //this line 

    secForm.Show(); 
} 

public void HandleListBoxItemClicked(object sender, EventArgs e) 
{ 
    pTypeInput.SelectedItem = aPotion._type; 
    pMagInput.Value = aPotion._magnitude; 
    pNameInput.Text = aPotion._name; 
    pBonusInput.Checked = aPotion._bonus; 
} 

Ich bin derzeit mit Visual Studio Gemeinschaft 2015, wenn diese relevant ist.

+0

Benötigen Sie weitere Informationen !: Was ist 'PotionForm tempMain'? Wie lautet der Name der übergeordneten 'ListBox'? Was ist 'secForm.secFormBox'? Von welcher Art ist 'trankBindList'? –

+0

Wo wird 'aPotion' initialisiert? –

+0

'PotionForm tempMain' Dies ist eine Instanz des übergeordneten Formulars, das ich versuchte, das Hauptformular zu aktualisieren, sodass das ausgewählte Element mit den neuen Informationen aktualisiert werden konnte. 'secForm.secFormBox' Dies ist eine Instanz des untergeordneten Formulars und des Listenfelds des untergeordneten Formulars. 'potionBindList' Dies ist eine' BindingList ' – NerveSinge

Antwort

0

Ok, nachdem ich den ganzen notwendigen Code gesehen habe, würde ich sagen, dass das Problem darin besteht, dass Sie niemals die Werte von der Child-Form an die Parent übergeben. Immer wenn das Ereignis HandleListBoxItemClicked ausgelöst wird, werden nur die Anfangswerte von aPotion in die Steuerelemente geschrieben.

Als Lösung würde ich vorschlagen, die SelectedItem als Absender zu übergeben, wenn Sie die ListBoxItemClicked Ereignis in der Child Feuer:

CHILD

public EventHandler ListBoxItemClicked; 
private void pPotionList_SelectedIndexChanged(object sender, EventArgs e) 
{ 
    Potion p = pPotionList.SelectedItem as Potion; 

    pPotionList.SelectionMode = SelectionMode.One; 
    if (p != null) 
    {     
     if (ListBoxItemClicked != null) 
     { 
      ListBoxItemClicked(p, new EventArgs()); 
     }  
    } 
} 

Nicht Sie diese Informationen in der Mutter verwenden können Formular und verteilen Sie die Informationen wie Sie möchten:

PARENT

public void HandleListBoxItemClicked(object sender, EventArgs e) 
{ 
    Potion p_parent = sender as Potion; 

    if(p_parent != null) 
    {  
     pTypeInput.SelectedItem = p_parent._type; 
     pMagInput.Value = p_parent._magnitude; 
     pNameInput.Text = p_parent._name; 
     pBonusInput.Checked = p_parent._bonus; 
    } 
} 

Keine Aktualisierung oder irgendetwas anderes sollte jetzt notwendig sein. Hoffe es hilft

+0

Das hat funktioniert, danke! Ich musste das p mit p_parent in der 'HandleListBoxItemClicked' Methode ersetzen. Ich nehme an, das war ein kleiner Tippfehler? – NerveSinge

+0

@NerveSinge Ja, das war ein Typ. Ich dachte in der letzten Minute, dass es verwirrend sein könnte, wenn ich die Variable in beiden Methoden 'p' aufrufen würde, also änderte ich es, aber anscheinend nur in der Deklaration. Freut mich zu hören, dass es geholfen hat –

Verwandte Themen