我在form1中有一个dataGridView,我可以以编程方式添加行,我想获取所有值并将其传输到表单2,我可以将其逐个插入数据库
答案 0 :(得分:0)
这是一个极小但有效的例子。
只要方法期望类型为传入参数,就可以将任何类型传递给任何方法......
private void DoSomething(string withThisString)
在那个方法声明中,我声明了......
void
又名不返回任何内容 DoSomething
string
参数你想在你的情况下做类似的事情。但是你...你不希望传递string
作为参数,你希望传递DataGridViewRow
......实际上没有......你想传递多行< / em>所以我们要聚合List<DataGridViewRow>
中的行,我们会传递一个行列表,而不是传递一行。
List<DataGridViewRow> listofrows = new List<DataGridViewRow>();//we'll agregate our desired rows in this
//itterate through the rows of the DataGridView
foreach (DataGridViewRow item in dgv1.Rows)
{
DataGridViewRow r = (DataGridViewRow)item.Clone();//clone the desired row
//Oddly enough... cloning does not clone the values... So lets put the values back in their cells
for (int i = 0; i < item.Cells.Count; i++)
{
r.Cells[i].Value = item.Cells[i].Value;
}
listofrows.Add(r);//add the row to the list
}
此外,您不希望将该参数传递给DoSomething
,您希望将其传递给负责&#34;初始化&#34;的方法。 Form2。
默认情况下,当您创建新表单时...表单构造函数就像这样写
public Form2()
{
InitializeComponent();
}
public Form2()
正如我们在()
中看到的那样,此方法并不期望任何参数可以正常工作。实际上,即使你想要,你也无法通过任何东西,因为这种方法还没有做好任何准备。它只能单独使用 ......
但是你想传递一些DataGridViewRow
,所以让我们稍微修改一下方法声明
public Form2(List<DataGridViewRow> dgvc = null)
{
InitializeComponent();
}
public Form2(List<DataGridViewRow> dgvc = null)
正如我们在()
中看到的那样,此方法现在希望收到List<DataGridViewRow>
才能正常工作。
既然Form2
期待我拥有的参数......我们可以在完成行列表后使用它!
//Make an instance of Form2, passing it the list of Rows we just created
Form2 f2 = new Form2(listofrows);
f2.Show();//show the form
说完了这一切。为了实现您的目标,您需要
List
或您选择的任何内容中累积所需的行List
作为参数传递给Form2 List
DataGridViewRow
执行您想要的任何任务
醇>
Form1.cs的
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms;
namespace DataGridViewRowsToForm2_46306622
{
public partial class Form1 : Form
{
DataGridView dgv1 = new DataGridView();
BindingList<dgventry> dgv1Data = new BindingList<dgventry>();
Button btn = new Button();
public Form1()
{
InitializeComponent();
InitializeGrid();
AddButton();
AddData();
}
private void AddButton()
{
btn.Location = new Point(5, dgv1.Location.Y + dgv1.Height + 5);
btn.Text = "Click to pass rows";
btn.Click += Btn_Click;
this.Controls.Add(btn);
}
private void Btn_Click(object sender, EventArgs e)
{
List<DataGridViewRow> listofrows = new List<DataGridViewRow>();
foreach (DataGridViewRow item in dgv1.Rows)
{
DataGridViewRow r = (DataGridViewRow)item.Clone();
for (int i = 0; i < item.Cells.Count; i++)
{
r.Cells[i].Value = item.Cells[i].Value;
}
listofrows.Add(r);
}
Form2 f2 = new Form2(listofrows);
f2.Show();
}
private void AddData()
{
for (int i = 0; i < 5; i++)
{
dgv1Data.Add(new dgventry
{
col1 = "row " + i,
col2 = i.ToString(),
col3 = i.ToString()
});
}
}
private void InitializeGrid()
{
dgv1.Location = new Point(5, 5);
dgv1.DataSource = dgv1Data;
this.Controls.Add(dgv1);
}
}
public class dgventry
{
public string col1 { get; set; }
public string col2 { get; set; }
public string col3 { get; set; }
}
}
Form2.cs
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;
namespace DataGridViewRowsToForm2_46306622
{
public partial class Form2 : Form
{
//Have a form constructor that accepts your GridViewRows as argument
public Form2(List<DataGridViewRow> dgvc = null)
{
InitializeComponent();
TextBox txtbx = new TextBox();
txtbx.Location = new Point(5, 5);
if (dgvc != null)
{
//iterate through the rows and do what you want with them
foreach (DataGridViewRow item in dgvc)
{
txtbx.Text += item.Cells[0].Value + " / ";
}
}
this.Controls.Add(txtbx);
}
}
}
有些人会建议传递DataSource
。当然,只要您的DataSource
与DataGridView
的内容相匹配,那就可行。不一定是这种情况,所以请相应地选择毒药。