1

谁能帮忙..?

我真的需要帮助,这里我有两个表格 [form1 & form2]。我在每个表单中都创建了 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

4 回答 4

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 { }   }
    
于 2013-10-28T09:22:08.157 回答
0

您可以简单地声明dataset/datatable将您绑定form1 grid为 public 并在form2. 通过它,datatable or dataset您可以再次在 form2 上绑定网格。

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

这是最简单的方法。

于 2013-10-28T05:05:07.183 回答
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在实际项目中处理的方式。

于 2013-10-28T09:21:43.157 回答
0

在Form 2中声明一个public BindingList<row_object>,从Form 1中写入。如果Form 1中的datagridview绑定到bindingList,数据会自动刷新。请参阅以查看如何将 datagridview 绑定到 bindingList。

于 2014-02-14T11:07:48.183 回答