none
Visualizzare stesso DataGridView su due Form differenti RRS feed

  • Domanda

  • Ho la necessità di visualizzare lo stesso DataGridView su due form differenti.

    Il DataSource ed il DataMember sono gli stessi: dsReport (DataSource) e Report (DataMember) per entrambi i Form.

    Il primo Form (FrmMain) ha il seguente codice per il passaggio del DataSet all'altro Form (FrmReport):

    private void button5_Click(object sender, EventArgs e)

    {

         // invio dei DataSet al Form di destinazione (FrmReport)

         FrmReport Report = new FrmReport(this.dsReport);

         Report.ShowDialog();

    }

    Il secondo Form (FrmReport) ha il seguente codice per la ricezione del DataSet:

    namespace Mario

    {

        public partial class FrmReport : Form

        {       

            public FrmReport(DataSetReport dsReport)       

            {

                InitializeComponent();

                // Importa il dataBase


                this.dsReport = dsReport;

            }

        }

    . . . . . . . . . . . . .

    . . .   codice  . . .

    . . . . . . . . . . . . .

    }

    Il DataSet viene trasferito regolarmente e vengono effettuate correttamente alcune elaborazioni.

    Nel FrmMain il DataGriView mostra regolarmente quanto memorizzato nel  dsReport, mentre nel FrmReport il DataGridView con le stesse caratteristiche non mostra alcun dato, solo le intestazioni delle colonne (comunque corrette).

    Cosa posso fare per risolvere il problema ?

    venerdì 17 aprile 2015 13:16

Risposte

  • Capisco quello che mi dici, ma non riesco ad immaginare come faccio ad aggiornare la Grid con il DataSet passato fa Form1. Mi puoi fare un esempio ?

    Grazie

    L'esempio sta anche nel codice generato dal designer:

    dataGridView1.DataMember = "Report";
    dataGridView1.DataSource = dsReport;

    domenica 19 aprile 2015 15:51

Tutte le risposte

  • Ho la necessità di visualizzare lo stesso DataGridView su due form differenti.

    Il DataSource ed il DataMember sono gli stessi: dsReport (DataSource) e Report (DataMember) per entrambi i Form.

    Il primo Form (FrmMain) ha il seguente codice per il passaggio del DataSet all'altro Form (FrmReport):

    private void button5_Click(object sender, EventArgs e)

    {

         // invio dei DataSet al Form di destinazione (FrmReport)

         FrmReport Report = new FrmReport(this.dsReport);

         Report.ShowDialog();

    }

    Il secondo Form (FrmReport) ha il seguente codice per la ricezione del DataSet:

    namespace Mario

    {

        public partial class FrmReport : Form

        {       

            public FrmReport(DataSetReport dsReport)       

            {

                InitializeComponent();

                // Importa il dataBase


                this.dsReport = dsReport;

            }

        }

    . . . . . . . . . . . . .

    . . .   codice  . . .

    . . . . . . . . . . . . .

    }

    Il DataSet viene trasferito regolarmente e vengono effettuate correttamente alcune elaborazioni.

    Nel FrmMain il DataGriView mostra regolarmente quanto memorizzato nel  dsReport, mentre nel FrmReport il DataGridView con le stesse caratteristiche non mostra alcun dato, solo le intestazioni delle colonne (comunque corrette).

    Cosa posso fare per risolvere il problema ?

    Simulando la tua situazione: due Form con DataGridView che condividono il DataSet ed il DataMember, pare che la cosa funzioni. Ci sarà qualche altra parte del codice che non hai mostrato che causa il problema.

    sabato 18 aprile 2015 08:49
  • Ho fatto un programmino semplice per controllare il funzionamento, ma non riesco a vedere il DataGridView sul secondo Form (Form2). Mi appare solo la tabella con la corretta intestazione delle colonne, ma le colonne rimangono vuote. Il programma fatto per la prova è realizzato con un Form1 dove c'è un Button per Richiamare il Form2 ed un pezzettino di codice per riempire una riga del DataSet:

    namespace Mario
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();

                try
                {
                    System.Data.DataRow dd = dsReport.Tables["Report"].NewRow();

                    dd["Domanda"] = "Risposte ottenute alla domada  1";
                    dd["Risp_1"] = 1;
                    dd["Risp_2"] = 2;
                    dd["Risp_3"] = 3;
                    dd["Risp_4"] = 4;
                    dd["Percentuale"] = 75;

                    // Aggiunge il nuovo record alla tabella
                    dsReport.Tables["Report"].Rows.Add(dd);
                }
                catch
                { }
            }

            private void button1_Click(object sender, EventArgs e)
            {
                Form2 Report = new Form2(this.dsReport);

                if (Report.ShowDialog() == DialogResult.OK)
                {
                    Report.Close();
                }
            }
        }
    }

    ed il Form 2 dove c'è solo il codice per l'importazione del DataSet:

    namespace Mario
    {
        public partial class Form2 : Form
        {
            public Form2(DataSetReport dsReport)
            {
                InitializeComponent();

                // Importa il dataBase 

                this.dsReport = dsReport;
            }

        }
    }

    Non riesco a capire dove sto sbagliando. 

    domenica 19 aprile 2015 08:49
  • Ho fatto un programmino semplice per controllare il funzionamento, ma non riesco a vedere il DataGridView sul secondo Form (Form2). Mi appare solo la tabella con la corretta intestazione delle colonne, ma le colonne rimangono vuote. Il programma fatto per la prova è realizzato con un Form1 dove c'è un Button per Richiamare il Form2 ed un pezzettino di codice per riempire una riga del DataSet:

    namespace Mario
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();

                try
                {
                    System.Data.DataRow dd = dsReport.Tables["Report"].NewRow();

                    dd["Domanda"] = "Risposte ottenute alla domada  1";
                    dd["Risp_1"] = 1;
                    dd["Risp_2"] = 2;
                    dd["Risp_3"] = 3;
                    dd["Risp_4"] = 4;
                    dd["Percentuale"] = 75;

                    // Aggiunge il nuovo record alla tabella
                    dsReport.Tables["Report"].Rows.Add(dd);
                }
                catch
                { }
            }

            private void button1_Click(object sender, EventArgs e)
            {
                Form2 Report = new Form2(this.dsReport);

                if (Report.ShowDialog() == DialogResult.OK)
                {
                    Report.Close();
                }
            }
        }
    }

    ed il Form 2 dove c'è solo il codice per l'importazione del DataSet:

    namespace Mario
    {
        public partial class Form2 : Form
        {
            public Form2(DataSetReport dsReport)
            {
                InitializeComponent();

                // Importa il dataBase 

                this.dsReport = dsReport;
            }

        }
    }

    Non riesco a capire dove sto sbagliando. 

    Nel tuo codice non vedo alcuna riga dove colleghi il DataSet alla DataGridView.

    domenica 19 aprile 2015 09:30
  • Nella finestra Form2.cs [progettazione], dalla casella degli strumenti  importo il DataGridView e, nelle proprietà, imposto il DataSource "dsReport" ed il DataMember "Report". Questo non si vede nel codice di progettazione, si vede solo nel Form2.Designer (codice generato da Windows) che riporto qui sotto:

    namespace Mario
    {
        partial class Form2
        {
            /// <summary>
            /// Required designer variable.
            /// </summary>
            private System.ComponentModel.IContainer components = null;

            /// <summary>
            /// Clean up any resources being used.
            /// </summary>
            /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
            protected override void Dispose(bool disposing)
            {
                if (disposing && (components != null))
                {
                    components.Dispose();
                }
                base.Dispose(disposing);
            }

            #region Windows Form Designer generated code

            /// <summary>
            /// Required method for Designer support - do not modify
            /// the contents of this method with the code editor.
            /// </summary>
            private void InitializeComponent()
            {
                this.dsReport = new Mario.DataSetReport();
                this.dataGridView1 = new System.Windows.Forms.DataGridView();
                this.iDDATADataGridViewTextBoxColumn = new System.Windows.Forms.DataGridViewTextBoxColumn();
                this.domandaDataGridViewTextBoxColumn = new System.Windows.Forms.DataGridViewTextBoxColumn();
                this.risp1DataGridViewTextBoxColumn = new System.Windows.Forms.DataGridViewTextBoxColumn();
                this.risp2DataGridViewTextBoxColumn = new System.Windows.Forms.DataGridViewTextBoxColumn();
                this.risp3DataGridViewTextBoxColumn = new System.Windows.Forms.DataGridViewTextBoxColumn();
                this.risp4DataGridViewTextBoxColumn = new System.Windows.Forms.DataGridViewTextBoxColumn();
                this.percentualeDataGridViewTextBoxColumn = new System.Windows.Forms.DataGridViewTextBoxColumn();
                ((System.ComponentModel.ISupportInitialize)(this.dsReport)).BeginInit();
                ((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).BeginInit();
                this.SuspendLayout();
                // 
                // dsReport
                // 
                this.dsReport.DataSetName = "DataSetReport";
                this.dsReport.SchemaSerializationMode = System.Data.SchemaSerializationMode.IncludeSchema;
                // 
                // dataGridView1
                // 
                this.dataGridView1.AutoGenerateColumns = false;
                this.dataGridView1.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
                this.dataGridView1.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] {
                this.iDDATADataGridViewTextBoxColumn,
                this.domandaDataGridViewTextBoxColumn,
                this.risp1DataGridViewTextBoxColumn,
                this.risp2DataGridViewTextBoxColumn,
                this.risp3DataGridViewTextBoxColumn,
                this.risp4DataGridViewTextBoxColumn,
                this.percentualeDataGridViewTextBoxColumn});
                this.dataGridView1.DataMember = "Report";
                this.dataGridView1.DataSource = this.dsReport;
                this.dataGridView1.Location = new System.Drawing.Point(0, 54);
                this.dataGridView1.Name = "dataGridView1";
                this.dataGridView1.Size = new System.Drawing.Size(683, 150);
                this.dataGridView1.TabIndex = 0;
                // 
                // iDDATADataGridViewTextBoxColumn
                // 
                this.iDDATADataGridViewTextBoxColumn.DataPropertyName = "ID_DATA";
                this.iDDATADataGridViewTextBoxColumn.HeaderText = "ID_DATA";
                this.iDDATADataGridViewTextBoxColumn.Name = "iDDATADataGridViewTextBoxColumn";
                // 
                // domandaDataGridViewTextBoxColumn
                // 
                this.domandaDataGridViewTextBoxColumn.DataPropertyName = "Domanda";
                this.domandaDataGridViewTextBoxColumn.HeaderText = "Domanda";
                this.domandaDataGridViewTextBoxColumn.Name = "domandaDataGridViewTextBoxColumn";
                // 
                // risp1DataGridViewTextBoxColumn
                // 
                this.risp1DataGridViewTextBoxColumn.DataPropertyName = "Risp_1";
                this.risp1DataGridViewTextBoxColumn.HeaderText = "Risp_1";
                this.risp1DataGridViewTextBoxColumn.Name = "risp1DataGridViewTextBoxColumn";
                // 
                // risp2DataGridViewTextBoxColumn
                // 
                this.risp2DataGridViewTextBoxColumn.DataPropertyName = "Risp_2";
                this.risp2DataGridViewTextBoxColumn.HeaderText = "Risp_2";
                this.risp2DataGridViewTextBoxColumn.Name = "risp2DataGridViewTextBoxColumn";
                // 
                // risp3DataGridViewTextBoxColumn
                // 
                this.risp3DataGridViewTextBoxColumn.DataPropertyName = "Risp_3";
                this.risp3DataGridViewTextBoxColumn.HeaderText = "Risp_3";
                this.risp3DataGridViewTextBoxColumn.Name = "risp3DataGridViewTextBoxColumn";
                // 
                // risp4DataGridViewTextBoxColumn
                // 
                this.risp4DataGridViewTextBoxColumn.DataPropertyName = "Risp_4";
                this.risp4DataGridViewTextBoxColumn.HeaderText = "Risp_4";
                this.risp4DataGridViewTextBoxColumn.Name = "risp4DataGridViewTextBoxColumn";
                // 
                // percentualeDataGridViewTextBoxColumn
                // 
                this.percentualeDataGridViewTextBoxColumn.DataPropertyName = "Percentuale";
                this.percentualeDataGridViewTextBoxColumn.HeaderText = "Percentuale";
                this.percentualeDataGridViewTextBoxColumn.Name = "percentualeDataGridViewTextBoxColumn";
                // 
                // Form2
                // 
                this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
                this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
                this.ClientSize = new System.Drawing.Size(681, 273);
                this.Controls.Add(this.dataGridView1);
                this.Name = "Form2";
                this.Text = "Form2";
                ((System.ComponentModel.ISupportInitialize)(this.dsReport)).EndInit();
                ((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).EndInit();
                this.ResumeLayout(false);

            }

            #endregion

            private DataSetReport dsReport;
            private System.Windows.Forms.DataGridView dataGridView1;
            private System.Windows.Forms.DataGridViewTextBoxColumn iDDATADataGridViewTextBoxColumn;
            private System.Windows.Forms.DataGridViewTextBoxColumn domandaDataGridViewTextBoxColumn;
            private System.Windows.Forms.DataGridViewTextBoxColumn risp1DataGridViewTextBoxColumn;
            private System.Windows.Forms.DataGridViewTextBoxColumn risp2DataGridViewTextBoxColumn;
            private System.Windows.Forms.DataGridViewTextBoxColumn risp3DataGridViewTextBoxColumn;
            private System.Windows.Forms.DataGridViewTextBoxColumn risp4DataGridViewTextBoxColumn;
            private System.Windows.Forms.DataGridViewTextBoxColumn percentualeDataGridViewTextBoxColumn;
        }
    }

    domenica 19 aprile 2015 13:59
  • Nella finestra Form2.cs [progettazione], dalla casella degli strumenti  importo il DataGridView e, nelle proprietà, imposto il DataSource "dsReport" ed il DataMember "Report". Questo non si vede nel codice di progettazione, si vede solo nel Form2.Designer (codice generato da Windows) che riporto qui sotto:


    Quindi il Form2 ha già un DataSet (A) associato alla Grid, tenuto in "dsReport ". Quando il Form1 passa al Form2 il suo DataSet (B), tu lo associ alla variabile dsReport che da ora non conterrà più il valore (A), ma il valore (B). Ma... il DataSource della Grid del Form2 contiene ancora il valore (A) perchè non è che se cambi il valore di dsReport, automaticamente il DataSource si aggiorna.


    • Modificato BlueLed domenica 19 aprile 2015 14:39
    domenica 19 aprile 2015 14:38
  • Quindi, cosa devo fare per risolvere il problema ?
    domenica 19 aprile 2015 14:42
  • Quindi, cosa devo fare per risolvere il problema ?

    Nel costruttore del Form2, dopo aver assegnato il nuovo valore a dsReport, assegni al DataSource della Grid dsReport stesso e al DataMember il valore che sai tu. In teoria, il DataSet che hai creato da designer nel Form2 non ti serve se hai intenzione di usare quello passato dal Form1.

    • Proposto come risposta Paolo Pranzo domenica 19 aprile 2015 16:19
    domenica 19 aprile 2015 14:51
  • Capisco quello che mi dici, ma non riesco ad immaginare come faccio ad aggiornare la Grid con il DataSet passato fa Form1. Mi puoi fare un esempio ?

    Grazie

    domenica 19 aprile 2015 15:21
  • Capisco quello che mi dici, ma non riesco ad immaginare come faccio ad aggiornare la Grid con il DataSet passato fa Form1. Mi puoi fare un esempio ?

    Grazie

    L'esempio sta anche nel codice generato dal designer:

    dataGridView1.DataMember = "Report";
    dataGridView1.DataSource = dsReport;

    domenica 19 aprile 2015 15:51
  • Problema risolto !!!

    Grazie per l'aiuto

    domenica 19 aprile 2015 17:48