Risolto C# Modifica controlli tra form diversi C#

minotaurus7

Utente Silver
30 Gennaio 2013
44
19
2
64
Salve a tutti...

Premetto che sono all'inizio di questo linguaggio e ne so veramente poco, anzi pochissimo...
Uso visual studio 2019 e sto cercando di creare un mio primo programmino con due Form (formpadre & formfiglio) e sono arrivato ad un punto che mi serve richiamare dal formfiglio una funzione(penso), del formpadre. Sul formfiglio voglio richiamare una funzione scritta sul formpadre, oppure simulare il Click di un pulsante inserito sempre sul formpadre.
Spero di essermi spiegato.

Ringrazio fin da ora tutti.
 
Se ho capito bene stai sperimentando con C# per fare un'applicazione Windows Forms classica e vuoi accedere alle risorse del form principale da un altro form. Per comprendere bene l'approccio da prendere devi essere a conoscenza delle basi della OOP, nel caso di app WinForms ogni "finestra" è in realtà una classe parziale che discende dalla classe Form; una metà è il codice che ti viene mostrato e che scrivi tu (NomeClasse.cs), l'altra è nel file NomeClasse.Designer.cs e contiene il codice generato da Visual Studio per impostare i controlli grafici come li hai disegnati tu con l'interfaccia guidata. Di default i controlli grafici hanno la proprietà Modifiers impostata a Private, il che significa che non puoi agire su di essi in modo diretto da fuori il contesto della classe, poiché nel codice generato del designer gli oggetti avranno la keyword private.

Questo è giusto per darti un background sul funzionamento di WinForms, non dovresti infatti impostare Modifiers a Public in casi normali. Per risolvere il problema considera queste possibilità: la prima è l'ideale se è codice comune che non agisce su controlli del form, in questo caso dovresti aggiungere una nuova classe (non form) al progetto e implementare lì la funzione in modo che sia facilmente raggiungibile da tutti i form (infatti anche se rendi il controllo public devi passare un oggetto del form padre al form figlio quando lo apri). Esempio:

C#:
// Esempio con classe statica

internal static class Common
{
    public static int FunzioneCondivisa(int a, int b)
    {
        return a + b;
    }
}

// In uno qualunque dei form:
int somma = Common.FunzioneCondivisa(2, 3);

Se invece ti serve agire proprio sui controlli del form potresti fare:
C#:
// Dentro Form1.cs

    //...
    public void FunzionePubblica(string text)
    {
        this.textBox1.Text = text;
    }

    private void button1_click(sender s, EventArgs e)
    {
        var otherForm = new Form2();
        otherForm.mainForm = this;
        otherForm.Show();
    }

// Dentro Form2.cs

    //...
    public Form1 mainForm;
    private void prova()
    {
        // Scrive abc nella textBox1 del form padre
        mainForm.FunzionePubblica("abc");
    }
 
Ultima modifica:
Grazie mille Junk... domani provo, con la speranza di riuscire.
Grazie mille soprattutto per la spiegazione ed il tempo che mi hai dedicato.
di nuovo grazie e buonanotte.
Messaggio unito automaticamente:

Ho usato la seconda soluzione e funziona benissimo dopo averla adattata al mio uso.
Grazie ancora Junk.
un saluto a te e a tutto il forum.