我有两个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.
有人可以帮助我吗? 预先谢谢你
答案 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;
}
输出:
源表单
目标表格
编辑:
如果要为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;
您可以为每行分配任何值,它可以来自dgvInvent1
或dgvInvent2
或任何计算出的值。
最后为上述每个列设置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();
}