C# 跨窗体将列和选定行从一个GridView传递到另一个GridView

C# 跨窗体将列和选定行从一个GridView传递到另一个GridView,c#,winforms,forms,gridview,C#,Winforms,Forms,Gridview,我有一个DataGrid1在一个表单中,第二个在另一个表单中。现在我想把在一个GridView中选择的行传递给第二个GridView public String selectRows(object sender) { string val = String.Empty; foreach (DataGridViewColumn column in form1.dataGridView1.Columns) { data

我有一个DataGrid1在一个表单中,第二个在另一个表单中。现在我想把在一个GridView中选择的行传递给第二个GridView

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);
我还在表格1中创建了一个函数:

 public Object getDataGrid()
    {
        return dataGridView1.DataSource;
    }
并尝试设置Object gridData=form1.getDataGrid;
当我现在尝试编写gridData.Coulumns时,他不会接受这些列。我能做什么,或者函数无效吗?

假设您在Form2中有一个属性作为DataTable 如果要在打开Form2时将整个DataTable移动到Form2,请填写如下属性:

    Form2 f2= new Form2();
    //f2.DataTableProp= yourDataTable;
    f2.ShowDialog();
请参阅注释行

或者,您可以按照以下步骤操作:

1-向Form2添加一个属性,如下所示:

public List<DataGridViewRow> Rows
    {
        get;
        set;
    }
 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中的行,如:

以上步骤经过测试,工作正常

但根据您的问题和代码,我看到您希望访问Form1 GridView的选定行,因此据我所知,win窗体上添加的控件是私有的 因此,您可以将GridView1的访问类型更改为Public,如:

public System.Windows.Forms.DataGridView dataGridView1;
然后您可以将Form1作为Form2的父级传递到它的构造函数中,如下所示:

public List<DataGridViewRow> Rows
    {
        get;
        set;
    }
 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();
    }
1-更改Form2的构造函数,如:

2-当您打开Form2 passe Form1作为其父级时,如下所示:

        Form2 f2 = new Form2(this);
        f2.Show();
或:


您可以在第二个窗体的代码隐藏中定义一个列表属性,并在打开第二个窗体时按选定行填充它。难道不能将整个数据表移动到另一个GridView吗?这是什么意思?@MKX2015这两个表单是否同时显示?是的,可以看到答案,让我们进行讨论以完成该操作。是的。我从表格1中选择GridView中的一些行,然后将它们传递给表格2中的GridView。所以Form2打开了,我可以看到两个GridViews,我只想动态移动选定的行。当两个GridView的格式相同时,上面的代码可以正常工作。@MKX2015您想将Form1 GridView行传递给Form2,对吗?我已经有了这个,就像您发布的一样,但是使用了一个新的构造函数Form2Form1 Form1。当我将Form1 parent放入构造函数中,他在其中初始化组件时,它会变得一团糟。然后他甚至不能再从Form1调用函数了。当我在Select Rows函数中创建一个新对象GridView2时,异常消失,但他打开一个空窗体窗口。为什么?否则,dataGridView2Ok中存在此空引用。抱歉,这是我的错。我忘了什么。现在你的第一个工作,他打开我的表单时,我点击按钮,但GridView2保持空。没有例外,什么都没有。所以,做第一个技巧,在From2中定义一个属性,并在它打开时填充它。
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
        } 
    }