none
Applicazione MDI Form RRS feed

  • Domanda

  • Salve a tutti,

    sto cimentandomi per la prima volta nella creazione di un applicazione con MDI Form (lo so sono un novellino), ho creato il form, il mio bel menù, un db navigator e un bellissimo form figlio. Mi sono domandato all'improvviso, e ora come faccio a gestire per bene il db navigator tra le varie form figlie? Qual'è la strada più corretta da utilizzare?

    Accetto suggerimenti.

    Grazie in anticipo per le risposte.

    Cristian

    sabato 9 maggio 2015 06:18

Risposte

  • Con il sistema suggerito, ho notato dopo l'apertura di 4-5 form un rallentamento nelle prestazioni...

    E' chiaro che non vuoi condividere il binding source, ma i tuoi form child avranno pure un nome di classe, no?

    Ok, non si chiamano FormA. Diciamo che li hai chiamati FormInnominato1, FormInnominato2, FormInnominato3, FormInnominato4, FormInnominato5.

    ActiveMdiChild se pure si riferisse, ad esempio, al FormInnominato3, ti resituirebbe un oggetto di tipo Form, anche se è sempre FormInnominato3. Ma essendo "visto" come Form, ti nasconde il fatto che continene il metodo Metodo(), che invece appartiene a FormInnominato3. Se da ActiveMdiChild vuoi farti restituire il Form completo di metodo Metodo(), devi fare il cast alla sua vera classe "FormInnominato3".

    Riproviamo:

                FormInnominato3 attiva = this.ActiveMdiChild as FormInnominato3;
                if (attiva != null)
                {
                    attiva.metodo();
                }

    • Contrassegnato come risposta CrysisZone venerdì 29 maggio 2015 23:13
    lunedì 11 maggio 2015 13:23

Tutte le risposte

  • Salve a tutti,

    sto cimentandomi per la prima volta nella creazione di un applicazione con MDI Form (lo so sono un novellino), ho creato il form, il mio bel menù, un db navigator e un bellissimo form figlio. Mi sono domandato all'improvviso, e ora come faccio a gestire per bene il db navigator tra le varie form figlie? Qual'è la strada più corretta da utilizzare?

    Accetto suggerimenti.

    Grazie in anticipo per le risposte.

    Cristian

    In linea generale, se tutti i form child operano sulla stessa tabella o c'è una tabella principale, il navigator con relativo binding source, potrebbe stare sul parent MDI. I form child attingerebbero dal suo binding source. Se poi qualche child visualizzasse qualche altra tabella, userebbe un navigator e binding source propri. Se inoltre qualche form utilizza la stessa tabella principale, ma deve farne un uso parallelo e quindi non sincronizzato col cursore principale, allora anche questo necessiterebbe di navigator personale.


    • Modificato BlueLed sabato 9 maggio 2015 11:31
    sabato 9 maggio 2015 11:31
  • Grazie per la risposta BlueLed, in effetti io ho già creato, il db Navigator, che si trova sulla form parent, il mio intento sarebbe questo, utilizzare lo stesso db navigator per tutte le form, quindi ad esempio, in qualsiasi form figlia mi trovi, cliccando sul pulsante nuovo del db navigator presente sul form partent, mi sblocchi i campi sulla form figlia, in modo da poterli cosi compilare, conclusa l'immissione dei dati sulla form figlia, clicco sul salva del db navigator della form parent mi salvi i dati. La mia idea era questa, e cioè, tutti i vari metodi e classi, si trovano all'interno del form figlio, quindi i pulsanti sul form parent, non fanno null'altro che chiamare le funzioni all'interno dei vari form figlio. Il problema è come fare per dire ai pulsanti quali funzioni e di quale form deve richiamare.

    Grazie ancora per le risposte.

    Cristian

    sabato 9 maggio 2015 11:43
  • Grazie per la risposta BlueLed, in effetti io ho già creato, il db Navigator, che si trova sulla form parent, il mio intento sarebbe questo, utilizzare lo stesso db navigator per tutte le form, quindi ad esempio, in qualsiasi form figlia mi trovi, cliccando sul pulsante nuovo del db navigator presente sul form partent, mi sblocchi i campi sulla form figlia, in modo da poterli cosi compilare, conclusa l'immissione dei dati sulla form figlia, clicco sul salva del db navigator della form parent mi salvi i dati. La mia idea era questa, e cioè, tutti i vari metodi e classi, si trovano all'interno del form figlio, quindi i pulsanti sul form parent, non fanno null'altro che chiamare le funzioni all'interno dei vari form figlio. Il problema è come fare per dire ai pulsanti quali funzioni e di quale form deve richiamare.

    Grazie ancora per le risposte.

    Cristian

    Di quali pulsanti parli? Quelli del navigator gestiscono le operazioni in modo autonomo.

    sabato 9 maggio 2015 11:59
  • Questo è il db navigator che ho creato io, si trova sulla form parent..

    sabato 9 maggio 2015 12:43
  • Questo è il db navigator che ho creato io, si trova sulla form parent..

    Ma lo hai già usato o stai cercando di capire come funziona? Lo hai creato da codice o con una procedura automatizzata?

    Al navigator associ un BindingSource, al BindingSource associ la sorgente dei dati. Tramite il BindingSource colleghi i controlli alla sorgente dei dati. Quindi, ai form child devi fornire soltanto il BindingSource del navigator ed usarlo per associare i dati ai vari controlli presenti sui form.




    • Modificato BlueLed sabato 9 maggio 2015 12:58
    sabato 9 maggio 2015 12:56
  • Scusami BlueLed, mi sono spiegato io male, cerco di essere il più dettagliato possibile.

    Al momento quel "dbNavigator" non è null'altro che un ToolStrip con dei pulsanti, ad esso non è associato ancora nulla, ne un codice ne null'altro, sono solo pulsanti. Il mio intento è quello di creare qualcosa che mi permetta di navigare, salvare, eliminare e modificare dei record all'interno di varie form figlie. Ad esempio in una form "Gestione Utenti", lancio una query, questa query mi restituisce un datatable con n righe, io vorrei scorrere le varie righe di questo datatable. Per evitare di creare dei pulsanti che svolgano queste funzione per N form figlie, vorrei utilizzare un  unico "dbNavigator", (o toolstrip),  che mi permetta di fare questo. Ora la mia perplessità è soprattutto come fare a indirizzare le varie funzione dei pulsanti, per la finestra al momento attiva.

    Grazie

    domenica 10 maggio 2015 08:18
  • Scusami BlueLed, mi sono spiegato io male, cerco di essere il più dettagliato possibile.

    Al momento quel "dbNavigator" non è null'altro che un ToolStrip con dei pulsanti, ad esso non è associato ancora nulla, ne un codice ne null'altro, sono solo pulsanti. Il mio intento è quello di creare qualcosa che mi permetta di navigare, salvare, eliminare e modificare dei record all'interno di varie form figlie. Ad esempio in una form "Gestione Utenti", lancio una query, questa query mi restituisce un datatable con n righe, io vorrei scorrere le varie righe di questo datatable. Per evitare di creare dei pulsanti che svolgano queste funzione per N form figlie, vorrei utilizzare un  unico "dbNavigator", (o toolstrip),  che mi permetta di fare questo. Ora la mia perplessità è soprattutto come fare a indirizzare le varie funzione dei pulsanti, per la finestra al momento attiva.

    Grazie

    Esiste il controllo BindingNavigator che fa tutto questo.

    Nel form MDI aggiungi un BindingNavigator ed un BindingSource. Il BindingSource lo rendi pubblico.

    Ed imposti le cose in maniera simile a questa:

            private void MDIForm_Load(object sender, EventArgs e)
            {
    
                ...
    
    
      
                bindingSource1.DataSource = prodotti;
                bindingNavigator1.BindingSource = bindingSource1;
    
                FormA fa = new FormA();
                fa.MdiParent = this;
                fa.Show();
    
                FormB fb = new FormB();
                fb.MdiParent = this;
                fb.Show(); 
    
            }

    Per quanto riguarda i form child:

            private void FormA_Load(object sender, EventArgs e)
            {
                MDIForm f = Application.OpenForms["MDIForm"] as MDIForm;
                textBox1.DataBindings.Add("Text", f.bindingSource1, "Nome");
                textBox2.DataBindings.Add("Text", f.bindingSource1, "Prezzo");
            }

    domenica 10 maggio 2015 09:21
  • Ho provato la soluzione postata da te, potrebbe andare bene, ma non è proprio quello che cercavo, provando un po ho scritto un po di codice.. 
    private void btnNavAdd_Click(object sender, EventArgs e)
            
            {
                Form attiva = this.ActiveMdiChild;
                if (attiva != null)
                {
                    attiva.Invoke(attiva.metodo());
                }
               
            }
    Il problema però giustamente è questo, io vorrei invocare il metodo "metodo()", per ogni form il metodo ha sempre lo stesso nome, il problema però che non riesco a richiamarlo anche se è pubblico.....
    domenica 10 maggio 2015 22:13
  • Ho provato la soluzione postata da te, potrebbe andare bene, ma non è proprio quello che cercavo, provando un po ho scritto un po di codice.. 
    private void btnNavAdd_Click(object sender, EventArgs e)
            
            {
                Form attiva = this.ActiveMdiChild;
                if (attiva != null)
                {
                    attiva.Invoke(attiva.metodo());
                }
               
            }
    Il problema però giustamente è questo, io vorrei invocare il metodo "metodo()", per ogni form il metodo ha sempre lo stesso nome, il problema però che non riesco a richiamarlo anche se è pubblico.....

    Perchè metodo() non appartiente alla class Form, appartiene alla classe cha hai derivato da Form.

    Se fosse sul mio FormA:

        FormA fa = ActiveMdiChild as FormA;
        fa.Medoto(); 
    

    lunedì 11 maggio 2015 07:13
  • Con il sistema suggerito, ho notato dopo l'apertura di 4-5 form un rallentamento nelle prestazioni...
    lunedì 11 maggio 2015 12:49
  • Con il sistema suggerito, ho notato dopo l'apertura di 4-5 form un rallentamento nelle prestazioni...

    E' chiaro che non vuoi condividere il binding source, ma i tuoi form child avranno pure un nome di classe, no?

    Ok, non si chiamano FormA. Diciamo che li hai chiamati FormInnominato1, FormInnominato2, FormInnominato3, FormInnominato4, FormInnominato5.

    ActiveMdiChild se pure si riferisse, ad esempio, al FormInnominato3, ti resituirebbe un oggetto di tipo Form, anche se è sempre FormInnominato3. Ma essendo "visto" come Form, ti nasconde il fatto che continene il metodo Metodo(), che invece appartiene a FormInnominato3. Se da ActiveMdiChild vuoi farti restituire il Form completo di metodo Metodo(), devi fare il cast alla sua vera classe "FormInnominato3".

    Riproviamo:

                FormInnominato3 attiva = this.ActiveMdiChild as FormInnominato3;
                if (attiva != null)
                {
                    attiva.metodo();
                }

    • Contrassegnato come risposta CrysisZone venerdì 29 maggio 2015 23:13
    lunedì 11 maggio 2015 13:23