ramy nemer Ответов: 3

Передача datatable из одной формы в другую


Цитата:

у меня есть form1 и form2 . form2 открывается из form1, у него есть dgv после его заполнения, он копируется в datatable по кнопке щелчка, и form2 закрывается или виден = false, я передал datatable в form1, но он дает мне нулевую ссылку: вот мой код в form2:

private void button1_Click(object sender, EventArgs e)
        {
            perclothesdescriptionDT = new DataTable();

            foreach (DataGridViewColumn col in dataGridView3.Columns)
            {
                perclothesdescriptionDT.Columns.Add(col.HeaderText);
            }

            foreach (DataGridViewRow row in dataGridView3.Rows)
            {
                DataRow dRow = perclothesdescriptionDT.NewRow();
                foreach (DataGridViewCell cell in row.Cells)
                {
                    dRow[cell.ColumnIndex] = cell.Value;
                }
                perclothesdescriptionDT.Columns.RemoveAt(0);
                perclothesdescriptionDT.Rows.Add(dRow);
            }
            this.Visible = false;

        }

        public DataTable mydt
        {
            get
            {
                return perclothesdescriptionDT;
            }
        }


В форме 1 :

form2= new Form2();

                cmd1.CommandText = "insert into [dbo].[personClothesDesc](upperPart, lowerPart, belt, socks, shoes, differentSigns) values (@upperPart, @lowerPart, @belt, @socks, @shoes, @differentSigns)";
                        for (int i = 0; i < form2.mydt.Rows.Count; i++)
                        {
                            cmd1.Parameters.Clear();
                            cmd1.Parameters.AddWithValue("@upperPart", form2.mydt.Rows[i].ItemArray.GetValue(5).ToString());
                            cmd1.Parameters.AddWithValue("@lowerPart", form2.mydt.Rows[i].ItemArray.GetValue(4).ToString());
                            cmd1.Parameters.AddWithValue("@belt", form2.mydt.Rows[i].ItemArray.GetValue(3).ToString());
                            cmd1.Parameters.AddWithValue("@socks", form2.mydt.Rows[i].ItemArray.GetValue(2).ToString());
                            cmd1.Parameters.AddWithValue("@shoes", form2.mydt.Rows[i].ItemArray.GetValue(1).ToString());
                            cmd1.Parameters.AddWithValue("@differentSigns", form2.mydt.Rows[i].ItemArray.GetValue(0).ToString());
                            cmd1.ExecuteNonQuery();
                        }


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

я должен попытаться передать datatable из form2 в form1, но он дает мне нулевую ссылку :
общественные объект DataTable mydt
{
получить
{
вернуться perclothesdescriptionDT;
}
}

Daniel Jones

Взгляните на эту ссылку: http://stackoverflow.com/questions/1559770/send-values-from-one-form-to-another-form

3 Ответов

Рейтинг:
2

Vignesh Mani

Привет, пожалуйста, обратитесь к ссылке ниже, это поможет вам.

Как передать данные из одной формы в другую в приложении Windows Form[^]


ramy nemer

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

ramy nemer

я думаю, что лучший способ-это использовать публичный класс, но я не знаю, как это сделать

Рейтинг:
1

OriginalGriff

Ну да...это будет.
Вы создаете экземпляр Form2 и сразу же используете это свойство:

form2= new Form2();
cmd1.CommandText = ...
for (int i = 0; i < form2.mydt.Rows.Count; i++)
{
    cmd1.Parameters.Clear();
    cmd1.Parameters.AddWithValue("@upperPart",
         form2.mydt.Rows[i].ItemArray.GetValue(5).ToString());
    ...

Но ваш код для Form2 показывает, что база данных заполняется только тогда, когда пользователь нажимает кнопку.
Поскольку вы даже не показываете форму пользователю, не говоря уже о том, чтобы дать ему время нажать кнопку, datatable никогда не создается, и свойство может возвращать только null.
Вероятно, вы пытаетесь получить доступ к существующему экранному экземпляру Form2, который вы создали и отобразили в другом месте - в этом случае вам нужно сохранить экземпляр в переменной уровня класса в Form1 и использовать свойство из этого экземпляра, а не создавать новый.


ramy nemer

да но не могли бы вы привести мне пример этого пожалуйста я ценю его
спасибо

OriginalGriff

Извините, но я не могу привести вам конкретный пример для вашей ситуации - у меня нет доступа к остальной части вашего кода!

Найдите, где вы отображаете форму 2, и посмотрите, что вы там делаете.

Рейтинг:
1

BillWoodruff

Я предлагаю: во второй форме с DataGridView

определите публичное действие (делегат), которое возвращает DataTable:

public Action<DataTable> SendDataTable;
В Click EventHandler для кнопки на второй форме, после того как DataTable будет построен, затем вызовите делегат (действие) с DataTable в качестве значения параметра:
private void btnTransmitDataTable_Click(object sender, EventArgs e)
{
    // build the DataTable

    // invoke the Action delegate
    if(SendDataTable != null) SendDataTable(perclothesdescriptionDT);
}
В основной форме (которая создает форму с DataGridView):
// in Main Form scope
Form2 form2;

// in an appropriate EventHandler ... Form_Load ?
form2= new Form2();
form2.SendDataTable += HandleDztaTableResult;

private void HandleDataTableresult(DataTable dataTable)
{
    // do whatever with the data

    // Dispose, Close, or Hide secondary Form ?
}
Существует множество способов решения этой проблемы передачи данных от формы к форме. Вы можете, например, создать экземпляр DataTable и внедрить его в экземпляр Form2; вы можете передать экземпляр DataTable по ссылке в качестве параметра методу во вторичной форме и т. д.

У OriginalGriff есть отличная серия из трех статей о различных подходах к передаче информации из формы в форму; я предлагаю вам прочитать их; вот ссылка на первую, которая имеет ссылки на две другие в серии: [^].


ramy nemer

я не знаю, почему я вставляю значения dgv в datatable, не могу ли я получить доступ к datagridview в form2 непосредственно из form1 ?? извлеките его и отправьте его значения в базу данных

BillWoodruff

Приведенный здесь код не вставляет значения, он вставляет исполняемый код, который "работает" в основной форме. Действие (делегат) во второй форме - это " сокет "или" заполнитель", в который вставляется исполняемый код. Основная форма по существу подписывается на действие. Когда код, вставленный в действие, запускается, он передает данные в виде DataTable в основную форму.

Причина для того, чтобы делать вещи таким образом, в отличие от того, чтобы подвергать все DataGridView на второй форме основной форме, заключается в принципе инкапсуляции и принципе "разделения проблем"."

Как я уже сказал, Есть и другие способы создания взаимодействия. Прочтите серию OriginalGriff.

твое здоровье, Билл