跨表单将列和选定行从一个 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
        } 
    }