как сравнить два dgv и передать datagridview в другую форму c # - PullRequest
0 голосов
/ 27 августа 2018

У меня есть два вида сетки данных, каждый из которых содержит два столбца и одинаковое количество строк. Я сравнил эти два вида таблицы данных, используя этот цикл:

 int result = 0;
 for (int i=0;i< dgvInvent1.RowCount;i++)
 {
   var src1 = dgvInvent1.Rows[i].Cells[1].Value.ToString();
   var src2 = dgvInvent2.Rows[i].Cells[1].Value.ToString();
   result = Int32.Parse(src1) - Int32.Parse(src2);
 }

Я хочу перенести результат в другое представление данных, я назвал его "dgvFinal", за исключением того, что dvgFinal находится в другой форме под названием "Form2", которую я только что создал, поэтому я добавил эту строку в form2

public DataGridView dvgFinal { get; set; }

и в своей основной форме я добавил в свой цикл

Form2 re = new Form2();
            int result = 0;
            for (int i=0;i< dgvInvent1.RowCount;i++)
            {
                var src1 = dgvInvent1.Rows[i].Cells[1].Value.ToString();
                var src2 = dgvInvent2.Rows[i].Cells[1].Value.ToString();
                 result = Int32.Parse(src1) - Int32.Parse(src2);
                re.dvgFinal.Rows[i].Cells[2].Value = result;
            }

но это не работает, я получаю

System.NullReferenceException was unhandled
  HResult=-2147467261
  Message=Object reference not set to an instance of an object.

кто-нибудь может мне помочь? Заранее спасибо

Ответы [ 3 ]

0 голосов
/ 27 августа 2018

1) Используйте DataTable для загрузки всех ваших результатов, как.

Form5 re = new Form5();
int result = 0;
DataTable dt = new DataTable();
dt.Columns.Add("Result");

for (int i = 0; i < dataGridView1.RowCount - 1; i++)
{
    DataRow row = dt.NewRow();
    var src1 = dataGridView1.Rows[i].Cells[0].Value;
    var src2 = dataGridView2.Rows[i].Cells[0].Value;
    result = Convert.ToInt32(src1) - Convert.ToInt32(src2);

    row["Result"] = result;
    dt.Rows.Add(row);

}

re.DataTable = dt;
re.Show();

2) Создайте новое открытое свойство DataTable в целевой форме, чтобы мы могли получить к нему доступ из нашей исходной формы, например

public DataTable DataTable { get; set; }

3) Добавьте один DataGridView из набора инструментов или из кода в целевую форму, например dgvFinal.

Если вы хотите вручную добавить столбец в dgvFinal, установите для него значение ColumnType на DataGridViewTextBoxColumn и DataPropertyName на Result из окна свойств.

4) Добавьте метод Form_Load к вашей целевой форме и присвойте DataSource

private void Form5_Load(object sender, EventArgs e)
{
    this.dgvFinal.DataSource = DataTable;
}

Выход:

Исходная форма

enter image description here

Целевая форма

enter image description here

Edit:

Если вы хотите установить имя заголовка обычного для каждого столбца в datagridview, тогда установите HeaderText значение.

В этом случае сеткой данных является ваш dgvFinal

Выберите datagridview => открыть окно свойств => выберите свойство столбцов => выберите нужный столбец => выберите и установите HeaderText значение.

Если вы хотите добавить больше столбцов в dgvFinal, вы можете добавить соответствующие столбцы в таблицу данных в точке № 1, указанной выше, например

dt.Columns.Add("Result1");
dt.Columns.Add("Result2");
dt.Columns.Add("Result3");

И в цикле for вы можете присваивать значения строк каждому столбцу, например

result1 = Convert.ToInt32(src1) - Convert.ToInt32(src2);
result2 = Convert.ToInt32(src1) + Convert.ToInt32(src2);
result3 = Convert.ToInt32(src1) * Convert.ToInt32(src2);

row["Result1"] = result1;
row["Result2"] = result2;
row["Result3"] = result3;  

Вы можете присвоить любые значения каждой строке, это может быть ваш dgvInvent1 или dgvInvent2 или любой из ваших рассчитанных значений.

И, наконец, установите HeaderText значения для каждого из указанных выше столбцов. в dgvFinal

0 голосов
/ 27 августа 2018

Вот полный рабочий образец:

void Main()
{
    DataTable tbl1 = new DataTable();
    DataTable tbl2 = new DataTable();

    using (SqlConnection con = new SqlConnection(@"server=.\SQLExpress;Database=Test;Trusted_Connection=yes"))
    {
        string query = @"with myTally (N) as (
             select top(10) row_number() over (order by t1.object_id)
             from sys.all_columns t1 
             cross join sys.all_columns t2)
             select cast(N * 1000 * rand() as int) as col1, cast(N * 100 * rand() as int) as col2
             from myTally";
             con.Open();
        tbl1.Load(new SqlCommand(query, con).ExecuteReader());
        tbl2.Load(new SqlCommand(query, con).ExecuteReader());
    }

    Form f1 = new Form();
    var dgv1 = new DataGridView { Top = 10, Left = 10, Height = 100, DataSource = tbl1 };
    var dgv2 = new DataGridView { Top = 130, Left = 10, Height = 100, DataSource = tbl2 };
    var btn = new Button {Top=250, Left=10, Text="Show 3rd Grid"};

    f1.Controls.AddRange(new Control[] {dgv1, dgv2, btn});

    btn.Click += (sender, args) =>
    {
        DataTable tbl3 = new DataTable();
        tbl3.Columns.Add("Result", typeof(int));
        for (int i = 0; i < tbl1.Rows.Count; i++)
        {
            tbl3.Rows.Add((int)tbl1.Rows[i]["col1"] - (int)tbl2.Rows[i]["col1"]);
        }

        Form f2 = new Form();
        var dgv3 = new DataGridView {Dock=DockStyle.Fill, DataSource=tbl3};
        f2.Controls.Add(dgv3);
        f2.ShowDialog();
    };

    f1.Show();
}
0 голосов
/ 27 августа 2018
Form2 re = new Form2();
int result = 0;
for (int i=0 ;i< dgvInvent1.RowCount; i++)
{
    var src1 = (int)dgvInvent1.Rows[i].Cells[1].Value;
    var src2 = (int)dgvInvent2.Rows[i].Cells[1].Value;
    result = src1 - src2;
    re.dvgFinal.Rows.Add(result.ToString());
}

Это должно сработать для вас. Причина в том, что вы пытаетесь получить доступ к строкам, которых еще нет.

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

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