2013-10-28 68 views
1

任何人都可以幫忙..?如何將值從form2 datagridview複製/轉移到Form1 datagridview在C#..?

我真的需要幫助,在這裏我有兩種形式[form1 & form2]。我已經在每個表單中創建了datagridview(DGV)。現在我需要通過單擊form2上的一個按鈕來將值從form2 datagridview傳遞/複製到form1 datagridview。

in 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 ..?

有什麼想法...?

在此先感謝。

回答

0

您可以簡單地聲明dataset/datatable,它將您的form1grid作爲公共訪問,並在form2中訪問它。通過那datatable or dataset你可以再次在form2上綁定網格。

或者您可以將數據集或數據表從form1發送到form2(可能通過模塊化功能),然後綁定網格。

這是最簡單的方法。

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的方式。

2

聲明Form1的DGV作爲公共的,而不是私人和做在窗體2如下:

  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 { } } 
    
+0

好一個@xpertgun我有同樣的問題你的答案是絕對正確的,它的100%工作非常感謝你完全 – user2491383

0

在表2中聲明公共BindingList<row_object>,它從表1編寫如果表1中的datagridview綁定到的BindingList時,數據將自動刷新。請參閱this以查看如何將datagridview綁定到bindingList。

相關問題