如何比较两个dgv并将datagridview传递给另一个Form C#

时间:2018-08-27 12:19:36

标签: c# .net winforms datagridview

我有两个datagridview,每个datagridview包含两列和相同数量的行。我使用此循环比较了这两个datagridview:

 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);
 }

我也想将结果传输到另一个datagridview,我将其命名为“ 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 :(得分:1)

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());
}

这应该为您工作。原因是您尝试访问尚不存在的行。

但是,请考虑改用数据源。

答案 1 :(得分:1)

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

编辑:

如果要为datagridview中的每一列设置定制标题标题,请设置 HeaderText值。

在这种情况下,datagridview是您的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;  

您可以为每行分配任何值,它可以来自dgvInvent1dgvInvent2或任何计算出的值。

最后为上述每个列设置HeaderText值 在dgvFinal

答案 2 :(得分:0)

这是一个完整的工作示例:

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();
}