将列和选定的行从一个GridView传递到另一个GridView

时间:2015-01-28 13:35:59

标签: c# winforms forms gridview

我在一个Form中有一个DataGrid1,在另一个Form2中有一个第二个。现在我想将我在一个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都在同一个表单中(并且代码更改了一点而没有"发送者"," val"等等)。现在,我试图在两种形式之间建立沟通。在这种情况下,我得到一个" NullReferenceException"上

  dataGridView2.Columns.Add(column.Clone() as DataGridViewColumn);

我还在Form1中创建了一个函数:

 public Object getDataGrid()
    {
        return dataGridView1.DataSource;
    }

并尝试设置" Object gridData = form1.getDataGrid();" 当我现在尝试写" gridData.Coulumns"他不会接受" Columns"。我该怎么办或功能无效?

1 个答案:

答案 0 :(得分:0)

假设您在DataTable中拥有Form2的媒体资源 如果您想要在DataTable开启时将整个Form2移至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-最后,您可以在Rows中操纵Form2,如:

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
        } 
    }