2017-09-19 19 views
-2

私はプログラムで行を追加できるdataGridViewをform1に持っており、その値をすべて取得して、それを1つ1つデータベースに挿入してください。C#DataGridViewのすべての行の値を取得して別のフォームに渡す方法

+0

これまでのコードを表示してください –

+1

データソースまたはグリッド行をループして追加し、コンストラクタまたはパブリックプロパティを使用して新しいフォームに情報を渡します。あなたがもっと助けが必要な場合は、最初にコードを表示しなければなりません... – LarsTech

+0

[datagridviewをあるフォームから別のフォームに渡します](https://stackoverflow.com/questions/32033325/pass-datagridview-from-one) -form-to-another-c-sharp) – Deja

答えて

0

ここには最小限ですが、実際の例があります。

メソッドがタイプを入力パラメータとして期待している限り、任意のメソッドに任意の型を渡すことができます。

ます。private void doSomethingの(文字列withThisString)

そのメソッドの宣言では、私は、メソッドがプライベート別名このクラスへのアクセスのみ ある

  1. ...と宣言
  2. メソッドが返されますvoid別名は何も返しません
  3. メソッド名がDoSomething
  4. 方法では、あなたがあなたのケースに似た何かをしたいstringパラメータ

を期待しています。しかし、あなたは...あなたがパラメータとしてstringを渡すことを望ましくない場合、DataGridViewRowを渡したいと思います...実際には、... 複数の行を渡したいので、List<DataGridViewRow>の行を集計させてください単一の行を渡すのではなく、行のリストを渡します。

List<DataGridViewRow> listofrows = new List<DataGridViewRow>();//we'll agregate our desired rows in this 
//itterate through the rows of the DataGridView 
foreach (DataGridViewRow item in dgv1.Rows) 
{ 
    DataGridViewRow r = (DataGridViewRow)item.Clone();//clone the desired row 
    //Oddly enough... cloning does not clone the values... So lets put the values back in their cells 
    for (int i = 0; i < item.Cells.Count; i++) 
    { 
     r.Cells[i].Value = item.Cells[i].Value; 
    } 
    listofrows.Add(r);//add the row to the list 
} 

また、あなたはForm2のを「初期化」の責任があるメソッドに渡したい、DoSomethingにそのパラメータを渡すことにしたくありません。あなたは私たちが()で見ることができるように...フォームのコンストラクタがこの

public Form2() 
{ 
    InitializeComponent(); 
} 

public Form2()のように書かれている新しいフォームを作成するときにデフォルトで

は、この方法が動作する任意のパラメータを期待されていません。実際には、あなたがしたい場合でも、その方法は何の準備もできていないので、何も渡すことができませんでした。それはちょうどだけで ...

に動作します。しかしあなたには、いくつかのDataGridViewRow周りを渡したいので、私たちは()で見ることができるように、この方法は、現在あるメソッド宣言ビット

public Form2(List<DataGridViewRow> dgvc = null) 
{ 
    InitializeComponent(); 
} 

public Form2(List<DataGridViewRow> dgvc = null)を変更できます動作するにはList<DataGridViewRow>を受け取ることを期待しています。

今、Form2は、私が持っているパラメータを期待しています...行のリストを作成したら、それを使うことができます!

//Make an instance of Form2, passing it the list of Rows we just created 
Form2 f2 = new Form2(listofrows); 
f2.Show();//show the form 

と言われています。あなたの目標を達成するために、ハイレベルで、あなたは

  • Listに必要な行を蓄積したり、
  • を選ぶものは何でもあなたのDataGridViewの行を

    1. 反復する必要はForm2をパラメータとしてListを渡します
    2. はForm2のは、着信List

    DataGridViewRowのFoをして、あなたが好きなタスクを実行していrm1.cs

    using System; 
    using System.Collections.Generic; 
    using System.ComponentModel; 
    using System.Drawing; 
    using System.Windows.Forms; 
    
    namespace DataGridViewRowsToForm2_46306622 
    { 
        public partial class Form1 : Form 
        { 
    
         DataGridView dgv1 = new DataGridView(); 
         BindingList<dgventry> dgv1Data = new BindingList<dgventry>(); 
         Button btn = new Button(); 
    
         public Form1() 
         { 
          InitializeComponent(); 
          InitializeGrid(); 
          AddButton(); 
          AddData(); 
         } 
    
         private void AddButton() 
         { 
          btn.Location = new Point(5, dgv1.Location.Y + dgv1.Height + 5); 
          btn.Text = "Click to pass rows"; 
          btn.Click += Btn_Click; 
          this.Controls.Add(btn); 
         } 
    
         private void Btn_Click(object sender, EventArgs e) 
         { 
          List<DataGridViewRow> listofrows = new List<DataGridViewRow>(); 
          foreach (DataGridViewRow item in dgv1.Rows) 
          { 
           DataGridViewRow r = (DataGridViewRow)item.Clone(); 
           for (int i = 0; i < item.Cells.Count; i++) 
           { 
            r.Cells[i].Value = item.Cells[i].Value; 
           } 
           listofrows.Add(r); 
          } 
          Form2 f2 = new Form2(listofrows); 
          f2.Show(); 
         } 
    
         private void AddData() 
         { 
          for (int i = 0; i < 5; i++) 
          { 
           dgv1Data.Add(new dgventry 
           { 
            col1 = "row " + i, 
            col2 = i.ToString(), 
            col3 = i.ToString() 
           }); 
          } 
    
         } 
    
         private void InitializeGrid() 
         { 
          dgv1.Location = new Point(5, 5); 
          dgv1.DataSource = dgv1Data; 
          this.Controls.Add(dgv1); 
         } 
        } 
    
        public class dgventry 
        { 
         public string col1 { get; set; } 
         public string col2 { get; set; } 
         public string col3 { get; set; } 
        } 
    } 
    

    にForm2.cs

    using System.Collections.Generic; 
    using System.Drawing; 
    using System.Windows.Forms; 
    
    namespace DataGridViewRowsToForm2_46306622 
    { 
        public partial class Form2 : Form 
        { 
         //Have a form constructor that accepts your GridViewRows as argument 
         public Form2(List<DataGridViewRow> dgvc = null) 
         { 
          InitializeComponent(); 
          TextBox txtbx = new TextBox(); 
          txtbx.Location = new Point(5, 5); 
          if (dgvc != null) 
          { 
           //iterate through the rows and do what you want with them 
           foreach (DataGridViewRow item in dgvc) 
           { 
            txtbx.Text += item.Cells[0].Value + "/"; 
           } 
          } 
          this.Controls.Add(txtbx); 
         } 
        } 
    } 
    

    一部の人々は代わりにDataSourceを渡すことをお勧めします。確かに、それはあなたのDataSourceDataGridViewの内容と一致している限り、うまくいくでしょう。常にそうであるとは限りませんので、それに応じて毒を選んでください。

  • 関連する問題