C#如何获取dataGridView中所有行的所有值并将其传递给另一个表单

时间:2017-09-19 17:35:33

标签: c# loops datagridview

我在form1中有一个dataGridView,我可以以编程方式添加行,我想获取所有值并将其传输到表单2,我可以将其逐个插入数据库

1 个答案:

答案 0 :(得分:0)

这是一个极小但有效的例子。

只要方法期望类型为传入参数,就可以将任何类型传递给任何方法......

  

private void DoSomething(string withThisString)

在那个方法声明中,我声明了......

  1. 该方法是私有仅此类可访问
  2. 该方法返回void 又名不返回任何内容
  3. 方法名称为DoSomething
  4. 该方法需要string参数
  5. 你想在你的情况下做类似的事情。但是你...你不希望传递string作为参数,你希望传递DataGridViewRow ......实际上没有......你想传递多行< / em>所以我们要聚合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
    }
    

    此外,您不希望将该参数传递给DoSomething,您希望将其传递给负责&#34;初始化&#34;的方法。 Form2。

    默认情况下,当您创建新表单时...表单构造函数就像这样写

    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
    

    说完了这一切。为了实现您的目标,您需要

    1. 遍历DataGridView的行
    2. List或您选择的任何内容中累积所需的行
    3. List作为参数传递给Form2
    4. 让Form2使用List
    5. 的传入DataGridViewRow执行您想要的任何任务

      Form1.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的内容相匹配,那就可行。不一定是这种情况,所以请相应地选择毒药。