Member 10261487 Ответов: 3

Как добавить строки в datagridview из разных форм datagridview


мой код:
private Form1 mainForm = null;
        public Form2(Form callingForm)
        {
            mainForm = callingForm as Form1;
            InitializeComponent();
        }

 private void btnAddEvent_Click(object sender, EventArgs e)
        {
            int count = 1;
            DataTable dt = new DataTable();
            dt.Columns.Add("Sl", typeof(string));
            dt.Columns.Add("Device", typeof(string));
            dt.Columns.Add("Event Name", typeof(string));
            dt.Columns.Add("frame", typeof(string));
            dt.Columns.Add("frame_rate", typeof(string));
            dt.Columns.Add("event_duration", typeof(string));



            foreach (DataGridViewRow row in dtgrid_event_list.Rows)
            {
                DataGridViewCheckBoxCell chk = (DataGridViewCheckBoxCell)row.Cells[0];
                dt.Rows.Add();
                if (chk.Value.ToString() == "True")
                {

                    
                    foreach (DataGridViewCell cell in row.Cells)
                    {
                        int j = 0;
                        
                            dt.Rows[row.Index][j] = cell.Value.ToString();
                        j++;
                    }


                }
                

            }

            this.mainForm.DataGrid_Data = dt;
        }


В Моем Коде Main_Form:
public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void btn_AddEvents_Click(object sender, EventArgs e)
        {
            Form2 object_EventList = new Form2();
            object_EventList.Show();

        }

        public DataTable DataGrid_Data
        {
            
            set { dataGridView1.DataSource = value; }
        }
    }

Теперь я хочу установить dataGridView1.DataSource из другой формы.

Что я уже пробовал:

В моей Main_Form у меня есть код.
общественные объект DataTable DataGrid_Data
{

набор { dataGridView1.Источник данных = значение; }
}
А другую форму я называю Main_Form вот так:

частная форма 1 mainForm = null;
public Form2(форма вызова формы)
{
форму mainform = callingForm в форму form1;
метод InitializeComponent();
}

Теперь получаем исключение в строке: this.mainForm. DataGrid_Data = dt;
Пожалуйста, помогите мне добавить строки в DataGridView из выбранных строк DataGridView другой формы.
Заранее спасибо.

3 Ответов

Рейтинг:
21

Member 12599256

Неправильный:

Form2 object_EventList = new Form2();

Правильно:
Form2 object_EventList = new Form2(this);


Member 10261487

Спасибо, брат. Теперь он работает. Можете ли вы подсказать мне, как я могу добавить строки в DataGridView из разных выбранных строк Froms DataGridView ?

[no name]

Просто передайте данные из выбранных строк в другую форму. datagridview. Лучший способ-скопировать данные из datatable и передать их в datatable в другой форме.

Рейтинг:
16

Sergey Alexandrovich Kryukov

Вам просто нужно проверить под отладчиком, что происходит на этой линии. В this.mainForm.DataGrid_Data, this.mainForm может быть null в момент выполнения (если это не null, но this.mainForm.DataGrid_Data является нулевым, это не имеет значения, потому что оператор является присваиванием). Тогда вы разыменовываете this.mainForm будьте обращены к своему члену и получите это исключение.

Вам действительно нужно научиться справляться с такими случаями самостоятельно; вы не можете задавать такие вопросы каждый раз, когда это происходит.

Не беспокоиться. Это один из самых простых случаев для обнаружения и исправления. Это просто означает, что некоторый член / переменная некоторого ссылочного типа разыменовывается с помощью и своих экземпляров (нестатических) членов, что требует, чтобы этот член / переменная не была нулевой, но на самом деле она кажется нулевой. Просто запустите его в отладчике, он остановит выполнение, при котором возникает исключение. Поставьте точку останова на этой строке, перезапустите приложение и снова перейдите к этой точке. Оцените все ссылки, включенные в следующую строку, и посмотрите, какая из них пустая, хотя она не должна быть нулевой. После того, как вы это выясните, исправьте код: либо убедитесь, что член / переменная правильно инициализирована ненулевой ссылкой, либо проверьте ее на null и, в случае null, сделайте что-нибудь еще.

Пожалуйста, смотрите также: хотите отобразить следующую запись при нажатии кнопки. но получил ошибку в том случае, если условие следующей функции записи "ссылка на объект не установлена на экземпляр объекта".

Иногда вы не можете сделать это под отладчиком по той или иной причине. Один действительно неприятный случай - это когда проблема проявляется только в том случае, если программное обеспечение построено, когда отладочная информация недоступна. В этом случае вам придется использовать более сложный способ. Во-первых, вам нужно убедиться, что вы никогда не блокируете распространение исключений, обрабатывая их молча (это преступление разработчиков против самих себя, но очень обычное). Вам нужно поймать абсолютно все исключения на самом верхнем кадре стека каждого потока. Вы можете сделать это, если будете обрабатывать исключения этого типа System.Exception В обработчике вам нужно записать всю информацию об исключениях, особенно System.Exception.StackTrace:
http://msdn.microsoft.com/en-us/library/system.exception.aspx,
http://msdn.microsoft.com/en-us/library/system.exception.stacktrace.aspx.

Трассировка стека - это просто строка, показывающая полный путь распространения исключения от оператора throw к обработчику. Читая его, всегда можно найти концы. Для ведения журнала лучше всего (в большинстве случаев) использовать класс System.Diagnostics.EventLog:
http://msdn.microsoft.com/en-us/library/system.diagnostics.eventlog.aspx.



Теперь нехорошо организовывать сотрудничество между формами таким небрежным образом: напрямую выставлять членов формы друг другу, напрямую используя поля. Вот откуда берется ваша ошибка, ее первопричина. Это оказалось распространенной проблемой, поэтому я написал статью на эту тему. Пожалуйста, смотрите: На многие вопросы ответили сразу — сотрудничество между Windows Forms или WPF Windows.

Удачи,
—СА


Member 10261487

Спасибо.

Sergey Alexandrovich Kryukov

Добро пожаловать.
—СА

Рейтинг:
12

OriginalGriff

Это довольно просто: вы устанавливаете только экземпляр Form1 mainform в параметризованным конструктором:

public Form2(Form callingForm)
{
    mainForm = callingForm as Form1;
    InitializeComponent();
}
Но когда вы создаете экземпляр Form2:
Form2 object_EventList = new Form2();

Вы вызываете конструктор без параметров.
Поэтому, когда вы пытаетесь использовать mainForm позже он становится нулевым, и вы получаете ошибку.
Передайте экземпляр Form1 конструктору, и все должно быть хорошо:
Form2 object_EventList = new Form2(this);


Но вы не должны так поступать!
Вместо этого Form2 вообще не должен знать о Form1 - это противоречит "правилам" OOPs, если это так, потому что эти две формы не являются независимыми.
Вместо этого вы должны создать событие в Form2, которое обрабатывает Form1, и позволить Form1 получить данные, если он этого хочет, через свойство Form2, и установить источник данных из него.
Звучит сложно? Да, это так! Но на самом деле это не так - все довольно просто.
Видеть здесь: Передача информации между двумя формами, Часть 2: Ребенок-Родитель[^]
Форма 1 - это "родитель", форма 2 - это" ребенок", и это не имеет ничего общего с формальными отношениями MDI!