Как передать объект datagridview в другую вновь созданную форму? - PullRequest
0 голосов
/ 19 марта 2020

Я слежу за этим SO post , чтобы передать DataGridView во вторую форму, чтобы я мог получить доступ к ячейкам, чтобы нарисовать их на основе значений ..

В Form1 я создаю этот DataGridView как показано ниже:

namespace LightnessComparision
{

    public partial class Form1 : Form
    {
        public DataGridView dgv = new DataGridView
        {
            Name = "LightnessGrid",
            Visible = true,
            DataSource = null,
            AutoSize = true,
            RowHeadersVisible = false,
            ColumnHeadersVisible = false,
            ScrollBars = ScrollBars.Both,
            AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.DisplayedCellsExceptHeader,
    };

/* Public Form1 etc */

        public void Button3_Click(object sender, EventArgs e)
        {
 /* SOME LOGIC */

            LightnessTable LightnessForm = new LightnessTable();
            dgv.DataSource = resulTable;
            LightnessForm.dgv = dgv;
            LightnessForm.Controls.Add(dgv);
            LightnessForm.AutoSize = true;
            LightnessForm.Show();     
        }
    }
}

LightnessTable, представляющий собой форму, выглядит следующим образом:

namespace LightnessComparision
{
    public partial class LightnessTable : Form
    {
        public DataGridView dgv { get; set; }
        public LightnessTable()
        {
            InitializeComponent();
            DataGridView_Configuration();
        }
        private void DataGridView_Configuration()
        {
            dgv.VisibleChanged += DgView_VisibleChanged;
        }
        private void DgView_VisibleChanged(object sender, EventArgs e)
        {
            DataGridView_PaintCells();
        }
        private void DataGridView_PaintCells()
        {
            foreach (DataGridViewRow row in dgv.Rows)
            {
                foreach (DataGridViewCell cell in row.Cells)
                {
                    if (Convert.ToInt16(cell.Value) < -5)
                    {
                        cell.Style.BackColor = Color.Yellow;
                    }
                    if (Convert.ToInt16(cell.Value) > 5)
                    {
                        cell.Style.BackColor = Color.Black;
                    }
                }
            }
        }

    }
}

Однако dgv.VisibleChanged + = DgView_VisibleChanged; эта строка выдает ошибку, что dgv имеет значение null.

Что здесь не так?

Ответы [ 2 ]

2 голосов
/ 19 марта 2020

Вы вызываете dgv.VisibleChanged += DgView_VisibleChanged; в конструкторе (до DataGridView_Configuration() вызова), но на данный момент dgv еще не инициализирован.

Рассмотрим передачу DataGridView в качестве параметра конструктора:

    public LightnessTable(DataGridView dgv)
    {
        InitializeComponent();
        this.dgv = dgv; 
        Controls.Add(this.dgv);
        DataGridView_Configuration();
    }

и измените вызов:

    public void Button3_Click(object sender, EventArgs e)
    {
        /* SOME LOGIC */

        dgv.DataSource = resulTable;
        LightnessTable LightnessForm = new LightnessTable(dgv);            
        LightnessForm.AutoSize = true;
        LightnessForm.Show();     
    }

Также я переместил Controls.Add(dgv); в конструктор формы - это не обязательно, но выглядит более логичным.

0 голосов
/ 19 марта 2020

Вы вызываете DataGridView_Configuration () из конструктора LightnessTable, поэтому dgv по-прежнему равен нулю.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...