Interazione tra moduli: come modificare un controllo di un modulo da un altro modulo?

Aug 04 2016

Vorrei impostare comboBox.SelectedValue quando seleziono la riga nel mio dataGridView sul primo modulo per popolare comboBox con quel valore su un altro modulo,

Sulla seconda forma nel mio caso in carico ho comboBox.DataSource, DisplayMember, ValueMemberimpostare in modo corretto, ma non succede niente quando ho creato SelectedValue al primo. Tutto funziona alla grande quando lo faccio su un modulo

Risposte

15 RezaAghaei Aug 04 2016 at 20:48

Formin Windows Forms è una classe come altre classi C #. Il modo di comunicare tra le forme è lo stesso delle classi. Puoi considerare queste opzioni quando comunichi tra le classi:

Manipola la seconda forma dalla prima

  • È possibile aggiungere parametri adatti al costruttore del secondo modulo. Quindi puoi passare valori al costruttore durante la creazione di un'istanza della seconda forma. Nel secondo modulo memorizzare i parametri nei campi dei membri e usarli quando ne hai bisogno.

  • È possibile creare una proprietà o un metodo pubblico nel secondo modulo e impostare tali proprietà dopo aver creato un'istanza del secondo modulo. In questo modo puoi usarli quando ne hai bisogno nella seconda forma. Questa opzione non è limitata al passaggio di valori durante la creazione del secondo modulo. Puoi anche usare quella proprietà durante l'esecuzione di second Form. Inoltre è utile per ottenere un valore da esso.

  • Come altra opzione puoi rendere pubblico il controllo che vuoi manipolare e in questo modo puoi accedervi da un'altra forma. L'uso di un metodo è un modo più consigliato per farlo.

Manipola la prima forma dalla seconda

  • È possibile creare un metodo o una proprietà pubblici nella prima forma e passare un'istanza della prima forma alla seconda. Quindi usando quel metodo / proprietà sull'istanza passata, puoi manipolare il primo modulo.

  • Puoi creare un evento nella seconda forma e dopo aver creato un'istanza della seconda forma iscriverti alla prima forma e inserire il codice per cambiare la forma nel gestore. Quindi è sufficiente sollevare l'evento in seconda forma.

  • È possibile definire una proprietà pubblica di tipo Actiono un altro tipo di delegato nel secondo modulo e quindi, dopo aver creato un'istanza del secondo modulo, assegnare la proprietà utilizzando un'azione personalizzata. Quindi, nella seconda forma, è sufficiente richiamare l'azione quando è necessario manipolare la prima forma.

  • Anche qui puoi rendere pubblico un controllo del primo modulo e quindi se passi un'istanza del primo modulo al secondo modulo, puoi manipolare il controllo. Si consiglia di utilizzare altre soluzioni. È come creare una proprietà o un metodo pubblico, ma un metodo che esegue un'attività specifica sul controllo è meglio che esporre l'intero controllo. Ma potresti aver bisogno di questa soluzione alcune volte.

Ecco alcuni esempi utili sulle soluzioni di cui sopra.

Manipola la seconda forma dalla prima

Esempio 1: utilizzo del costruttore della seconda forma

Usa questo esempio quando devi passare alcuni dati al secondo modulo, quando crei il secondo modulo.

public partial class Form2 : Form
{
    int selectedValue;
    public Form2(int value)
    {
        InitializeComponent();
        selectedValue = value;
    }
    private void Form2_Load(object sender, EventArgs e)
    {
        //Load data
        this.comboBox1.DataSource = new MyDbContext().Categories.ToList();
        this.comboBox1.DisplayMember = "Name";
        this.comboBox1.ValueMember = "Id";
        this.comboBox1.SelectedValue = selectedValue;
    }
}

Quindi nella tua prima forma, è sufficiente passare il valore a Form2quando ne crei una nuova istanza:

var value = 2; // Or get it from grid
var f = new Form2(value);
f.ShowDialog();

Esempio 2: utilizzo della proprietà pubblica o del metodo della seconda forma

Utilizzare questo esempio quando è necessario passare alcuni dati al secondo modulo, durante la creazione o anche dopo la creazione del secondo modulo.

public partial class Form2 : Form
{
    public Form2()
    {
        InitializeComponent();
    }
    public string SomeValue
    {
        get { return textBox1.Text;}
        set { textBox1.Text = value;}
    }
}

Quindi nella tua prima forma, è sufficiente passare il valore a Form2quando necessario, dopo la creazione Form2o ogni volta che devi impostare il valore textBox1su Form2:

var f = new Form2(); //value is not needed here
f.SomeValue = "some value";
f.Show();
//...
f.SomeValue = "some other value";

Esempio 3 - Rendere pubblico un controllo della seconda forma

Utilizzare questo esempio quando è necessario modificare una proprietà di un controllo sulla seconda maschera, durante la creazione o anche dopo la creazione della seconda maschera. È meglio usare proprietà o metodi pubblici invece di esporre le proprietà dell'intero controllo.

Nella Formfinestra di progettazione, seleziona il controllo e nella finestra Proprietà imposta la Modifiersproprietà su Public. Assicurati anche che la GenerateMemberproprietà sia true. Quindi puoi semplicemente accedere a questo controllo usando il suo nome dall'esterno del file Form.

var f = new Form2();
f.textBox1= "some value";

Manipola la prima forma dalla seconda

Esempio 4: creare un metodo o una proprietà pubblici nel primo form e passare un'istanza di First Form al costruttore del secondo form

Usa questo esempio quando devi cambiare prima Formdalla seconda forma.

Nel tuo Form1, crea una proprietà di un metodo che accetti alcuni parametri e inseriscici la logica:

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

Quindi crea un costruttore in Form2cui accetti un parametro di tipo Form1e mantieni il valore passato in un campo membro e usalo quando ti serve:

Form1 form1;
public Form2 (Form1 f)
{
    InitializeComponent();
    form1 = f; 
}
private void button1_Click(object sender, EventArgs e)
{
    form1.ChangeTextBox1Text("Some Value");
}

Ora durante la creazione Form2dovresti passare un'istanza di Form1ad esso:

var f = new Form2(this);
f.Show();

Esempio 5: utilizzo dell'evento del secondo modulo nel primo modulo

Dai un'occhiata a questo post . Riguarda la comunicazione tra la forma e un controllo, ma è applicabile anche alla comunicazione tra le forme.

Esempio 6 - Iniezione di un'azione nella seconda forma

Dai un'occhiata a questo post . Riguarda la comunicazione tra la forma e un controllo, ma è applicabile anche alla comunicazione tra le forme.

Esempio 7 - Rendere pubblico un controllo della prima forma

In questa soluzione è necessario rendere pubblico un controllo nella prima forma, come l'esempio 3. Quindi, come nell'esempio 4, passare un'istanza del primo modulo alla seconda maschera e tenerla in un campo e usarla quando necessario. È preferibile utilizzare un metodo o una proprietà pubblici.

Form1 form1;
public Form2 (Form1 f)
{
    InitializeComponent();
    form1 = f; 
}
private void button1_Click(object sender, EventArgs e)
{
    form1.textBox1.Text = "Some Value";
}

durante la creazione Form2dovresti passare un'istanza di Form1ad esso:

var f = new Form2(this);
f.Show();