如何在C#中将值从form2 datagridview复制/传输到form1 datagridview?

时间:2013-10-28 05:02:02

标签: c# .net winforms datagridview

任何人都可以帮忙..?

我真的需要帮助,这里有两种形式[form1&窗口2]。我在每个表单中创建了datagridview(DGV)。现在我需要通过单击form2上的一个按钮将值从form2 datagridview传输/复制到form1 datagridview。

在form2中我写了这个..!

   private void button1_Click(object sender, EventArgs e)
    {
        try
        {
            if (dataGridView1.RowCount != 0)
            {

                foreach (DataGridViewRow row in dataGridView1.SelectedRows)
                {
                    object[] items = new object[row.Cells.Count];
                    for (int i = 0; i < row.Cells.Count; i++)
                        items[i] = row.Cells[i].Value;
                    Form1 F1 = new Form1();
                    F1.Activate();
                    F1.dataGridView1.Rows.Add(items);
                    F1.dataGridView1.DataSource = items; 
                    dataGridView1.Rows.Remove(row);
                }

              }
            else
            {
                MessageBox.Show("There is no data to export, please verify..!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
        catch { }

    }

我得到的错误就像“...... dataGridView1.Form1由于其保护级别而无法访问”。是否有任何其他方法或方法可以将值从form2 datagridview导入到form1 datagridview ..?

任何想法......?

提前感谢。

4 个答案:

答案 0 :(得分:2)

将Form1的DGV声明为Public而不是private,并在Form2中执行以下操作:

  1. 声明以下变量:

    System.Windows.Forms.Form f = System.Windows.Forms.Application.OpenForms["Form1"];

  2. 在您的计划中执行以下更改:

     private void button1_Click (object sender, EventArgs e)      
     {
    
     try
      {
        if (dataGridView1.RowCount != 0)
        {
    
            foreach (DataGridViewRow row in dataGridView1.SelectedRows)
            {                                       
                ((Form1)f).dataGridView1.Rows.Add(row);                    
            }
    
          }
        else
        {
            MessageBox.Show("There is no data to export, please verify..!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
    }
    catch { }   }
    

答案 1 :(得分:0)

您只需声明dataset/datatable即可将form1 grid绑定为公开,并在form2中访问该datatable or dataset。通过{{1}},您可以再次绑定form2上的网格。

或者您可以将数据集或数据表从form1发送到form2(可能通过模块化函数),然后绑定网格。

这是最简单的方法。

答案 2 :(得分:0)

您应该使用某种event来实现此目的:

//the Form1 class
public partial class Form1 : Form {
  Form2 f2 = new Form2();  
  public Form1(){
    InitializeComponent();
    f2.TransferSelectedRows += (s,e) => {
      if (dataGridView1.RowCount > 0) {
         foreach(DataGridViewRow row in dataGridView1.SelectedRows){
           //add the selected row to the receiver grid
           e.ReceiverGrid.Rows.Add(row.Cells.OfType<DataGridViewCell>()
                                          .Select(cell=>cell.Value).ToArray());
           //remove the selected row
           dataGridView1.Rows.Remove(row); 
         }
         e.HasRows = true;
      } else {
        e.HasRows = false;
      }
    };
  }     
}
//Form2 class
public partial class Form2 : Form { 
  public Form2() {
    InitializeComponent();       
  }
  public class TransferSelectedRowsEventArgs : EventArgs {
    public DataGridView ReceiverGrid {get; private set;}
    public bool HasRows {get;set;}
    public TransferSelectedRowsEventArgs(DataGridView receiver){
       ReceiverGrid = receiver;
    }
  }
  public delegate void TransferSelectedRowsEventHandler(object sender, TransferSelectedRowsEventArgs e);
  public event TransferSelectedRowsEventHandler TransferSelectedRows;
  protected virtual void OnTransferSelectedRows(TransferSelectedRowsEventArgs e){
    TransferSelectedRowsEventHandler handler = TransferSelectedRows;
    if(handler != null) handler(this, e);
  }
  //Click event handler for button1
  private void button1_Click(object sender, EventArgs e){
    var transfer = new TransferSelectedRowsEventArgs(dataGridView1);
    OnTransferSelectedRows(transfer);
    if(!transfer.HasRows){
       MessageBox.Show("There is no data to export, please verify..!", "Error", 
                        MessageBoxButtons.OK, MessageBoxIcon.Error);
    }
  }
}

注意:我在上面发布的代码不完整,应添加一些您自己的成员或代码。您还应该考虑在网格中使用DataSource,这就是我们在实际项目中处理DataGridView的方式。

答案 3 :(得分:0)

在表单2中声明一个公共BindingList<row_object>并从表单1中写入。如果表单1中的datagridview绑定到bindingList,则数据将自动刷新。请参阅this以查看如何将datagridview绑定到bindingList。