跨表单将列和选定行从一个 GridView 传递到另一个
Pass columns and selected rows from one GridView to another across Forms
我在一个 Form 中有一个 DataGrid1,在另一个 Form2 中有第二个。现在我想将我在一个 GridView 中 select 的行传递给第二个。
public String selectRows(object sender)
{
string val = String.Empty;
foreach (DataGridViewColumn column in form1.dataGridView1.Columns)
{
dataGridView2.Columns.Add(column.Clone() as DataGridViewColumn);
}
foreach (DataGridViewRow row in form1.dataGridView1.SelectedRows)
{
int index = dataGridView2.Rows.Add(row.Clone() as DataGridViewRow);
foreach (DataGridViewCell cell in row.Cells)
{
dataGridView2.Rows[index].Cells[cell.ColumnIndex].Value = cell.Value;
}
}
return val;
}
这在两个 GridView 都处于同一窗体中时有效(代码稍作更改,没有 "sender"、"val" 等)。现在上面我试图在两种形式之间建立通信。在这种情况下,我在
上得到 "NullReferenceException"
dataGridView2.Columns.Add(column.Clone() as DataGridViewColumn);
我在Form1中也做了一个函数:
public Object getDataGrid()
{
return dataGridView1.DataSource;
}
并尝试设置 "Object gridData = form1.getDataGrid();"
当我现在尝试写 "gridData.Coulumns" 时,他不会接受 "Columns"。我能做什么或该功能无效?
假设您在 Form2
中有一个 属性 作为 DataTable
如果您想在打开 Form2
时将整个 DataTable
移动到 Form2
,请填写 属性,例如:
Form2 f2= new Form2();
//f2.DataTableProp= yourDataTable;
f2.ShowDialog();
查看注释行。
或者您可以按照以下步骤操作:
1- 将 属性 添加到 Form2
,如下所示:
public List<DataGridViewRow> Rows
{
get;
set;
}
2- 在 Form1
中,当你想像这样显示 Form2
时:
private void btnShowForm2_Click(object sender, EventArgs e)
{
List<DataGridViewRow> selectedRows = new List<DataGridViewRow>();
foreach (DataGridViewRow row in dataGridView1.SelectedRows)
{
selectedRows.Add(row);
}
Form2 oForm = new Form2(this);
oForm.Rows = selectedRows;
oForm.Show();
}
3- 最后,您可以在 Form2
中操作 Rows
,例如:
private void Form2_Shown(object sender, EventArgs e)
{
foreach (DataGridViewRow row in Rows)
{
//Manipulate row
}
}
以上步骤已经过测试,可以正常工作。
但是根据你的问题和你的代码,我看到你想要访问 Form1
GridView 的选定行,所以据我所知,在 win 表单上添加的控件是私有的
因此,您可以将 GridView1
的访问类型更改为 Public,例如:
public System.Windows.Forms.DataGridView dataGridView1;
然后你可以在它的构造函数中将 Form1
作为 Form2
的父级传递:
1- 更改 Form2
的构造函数,例如:
public Form2(Form1 parent)
{
InitializeComponent();
//You can access gridView1 here
//For example
MessageBox.Show(parent.dataGridView1.Rows.Count.ToString());
}
2- 当您打开 Form2
passe Form1
时,它的父级如下:
Form2 f2 = new Form2(this);
f2.Show();
或者:
public Form1 ParentForm
{
get;
set;
}
public Form2(Form1 parent)
{
InitializeComponent();
ParentForm = parent;
selectRows();
}
public void selectRows()
{
foreach (DataGridViewColumn column in ParentForm.dataGridView1.Columns)
{
//Your code
}
foreach (DataGridViewRow row in ParentForm.dataGridView1.SelectedRows)
{
//Your code
}
}
我在一个 Form 中有一个 DataGrid1,在另一个 Form2 中有第二个。现在我想将我在一个 GridView 中 select 的行传递给第二个。
public String selectRows(object sender)
{
string val = String.Empty;
foreach (DataGridViewColumn column in form1.dataGridView1.Columns)
{
dataGridView2.Columns.Add(column.Clone() as DataGridViewColumn);
}
foreach (DataGridViewRow row in form1.dataGridView1.SelectedRows)
{
int index = dataGridView2.Rows.Add(row.Clone() as DataGridViewRow);
foreach (DataGridViewCell cell in row.Cells)
{
dataGridView2.Rows[index].Cells[cell.ColumnIndex].Value = cell.Value;
}
}
return val;
}
这在两个 GridView 都处于同一窗体中时有效(代码稍作更改,没有 "sender"、"val" 等)。现在上面我试图在两种形式之间建立通信。在这种情况下,我在
上得到 "NullReferenceException" dataGridView2.Columns.Add(column.Clone() as DataGridViewColumn);
我在Form1中也做了一个函数:
public Object getDataGrid()
{
return dataGridView1.DataSource;
}
并尝试设置 "Object gridData = form1.getDataGrid();" 当我现在尝试写 "gridData.Coulumns" 时,他不会接受 "Columns"。我能做什么或该功能无效?
假设您在 Form2
中有一个 属性 作为 DataTable
如果您想在打开 Form2
时将整个 DataTable
移动到 Form2
,请填写 属性,例如:
Form2 f2= new Form2();
//f2.DataTableProp= yourDataTable;
f2.ShowDialog();
查看注释行。
或者您可以按照以下步骤操作:
1- 将 属性 添加到 Form2
,如下所示:
public List<DataGridViewRow> Rows
{
get;
set;
}
2- 在 Form1
中,当你想像这样显示 Form2
时:
private void btnShowForm2_Click(object sender, EventArgs e)
{
List<DataGridViewRow> selectedRows = new List<DataGridViewRow>();
foreach (DataGridViewRow row in dataGridView1.SelectedRows)
{
selectedRows.Add(row);
}
Form2 oForm = new Form2(this);
oForm.Rows = selectedRows;
oForm.Show();
}
3- 最后,您可以在 Form2
中操作 Rows
,例如:
private void Form2_Shown(object sender, EventArgs e)
{
foreach (DataGridViewRow row in Rows)
{
//Manipulate row
}
}
以上步骤已经过测试,可以正常工作。
但是根据你的问题和你的代码,我看到你想要访问 Form1
GridView 的选定行,所以据我所知,在 win 表单上添加的控件是私有的
因此,您可以将 GridView1
的访问类型更改为 Public,例如:
public System.Windows.Forms.DataGridView dataGridView1;
然后你可以在它的构造函数中将 Form1
作为 Form2
的父级传递:
1- 更改 Form2
的构造函数,例如:
public Form2(Form1 parent)
{
InitializeComponent();
//You can access gridView1 here
//For example
MessageBox.Show(parent.dataGridView1.Rows.Count.ToString());
}
2- 当您打开 Form2
passe Form1
时,它的父级如下:
Form2 f2 = new Form2(this);
f2.Show();
或者:
public Form1 ParentForm
{
get;
set;
}
public Form2(Form1 parent)
{
InitializeComponent();
ParentForm = parent;
selectRows();
}
public void selectRows()
{
foreach (DataGridViewColumn column in ParentForm.dataGridView1.Columns)
{
//Your code
}
foreach (DataGridViewRow row in ParentForm.dataGridView1.SelectedRows)
{
//Your code
}
}