c#以另一种形式将数据发送到数据集

时间:2017-02-19 01:21:07

标签: c# datagridview

我这里有一部分代码,我将数据从文本框和datagridview发送到数据集(所有这些都在Form1中)

但是我怎么做,我将所有这些数据发送到数据集表单(项目>添加新项目>数据集??

谢谢

private void SendData(object sender, EventArgs e)
    {
        dataGridView1.AllowUserToAddRows = false;

        DataSet ds = new DataSet();
        DataTable dt = new DataTable();
        dt.TableName = "Order";
        dt.Columns.Add("OrderNr");
        dt.Columns.Add("Custommer");
        dt.Columns.Add("Material");
        dt.Columns.Add("MaterialCode");
        ds.Tables.Add(dt);

        DataTable dtx = new DataTable();
        dtx.TableName = "Data";
        dtx.Columns.Add("Lenght");
        dtx.Columns.Add("Width");
        dtx.Columns.Add("Qty");
        dtx.Columns.Add("Texture");
        ds.Tables.Add(dtx);

        DataRow row = ds.Tables["Order"].NewRow();
        row["OrderNr"] = tbOrderNr.Text;
        row["Custommer"] = tbCustommer.Text;
        row["Material"] = tbMaterial.Text;
        row["MaterialCode"] = tbForm2MatCode.Text;
        ds.Tables["Udaje"].Rows.Add(row);

        foreach (DataGridViewRow r in dataGridView1.Rows)
        {
            DataRow row1 = ds.Tables["Data"].NewRow();
            row1["Lenght"] = r.Cells[0].Value;
            row1["Width"] = r.Cells[1].Value;
            row1["Qty"] = r.Cells[2].Value;
            row1["Texture"] = r.Cells[3].Value;
            ds.Tables["Data"].Rows.Add(row1);
        }
        dataGridView1.AllowUserToAddRows = true;
    }

2 个答案:

答案 0 :(得分:0)

想象一下,您的表单被称为Form1Form2,并且您希望向Form2发送内容。你会这样做:

方法1

Form2中创建一个属性:

public DataSet DataSet {get; set; }

Inf Form1,假设您有一个名为Form2的{​​{1}}实例:

f2

方法2

f2.DataSet = // The dataset you want to send to Form2 (不是Form2)中,创建一个如下属性:

Form1

然后,您可以使用private DataSet aDataSet; public DataSet DataSet {get { return this.aDataSet; }} 实例在Form2中访问它。想象一下,该实例名为Form1

f1

答案 1 :(得分:0)

先生。 JohnG这里发布了非常有用的答案,但已被删除。 谢谢。

正如CodingYoshi所指出的,有几种方法可以在表单之间传递变量。这真的取决于你在做什么。您可以简单地将WHOLE父表单传递给子表单,例如Form2 f2 = new Form2(this),其中“this”是父Form1Form2有一个带有Form2(Form1 parent)签名的构造函数。在该构造函数中,您可以将“this”父级分配给Form2变量,例如:Form1 PARENT;,然后在构造函数中将其分配给PARENT = parent;。

这样您就可以访问Form1中的所有公共变量。显然,如果我们只想传递一个DataSet,那就太过分了,也没有必要。因此,应用这个想法,将DataSet中的Form1传递给Form2示例:Form2 f2 = new Form2(DataSet);似乎相当简单。显然,您需要设置一个具有DataSet签名的适当构造函数。这会根据要求将DataSet传递给Form2

下面的代码只是做了一些改变,我觉得这会让这更容易。我在这里猜测,但是按照您的代码,您似乎有两个{2} DataTablesOrderDataOrder表似乎只保留一(1)条记录(行)...即订单号;顾客;材料和材料代码是此Order的单个实体。 Order可以有一个或多个Data项,即Length,Width..Etc。这种结构尖叫着“让我成为一个班级”。以下代码使用两(2)个类:OrderOrderItem

OrderItem将是您代码中的单个Data项:“长度”,“宽度”等。

Order将包含OrderNrCustomer等。ListOrderItem个对象可容纳多个OrderItems。使用下面的列表,但您可以使它成为您可能需要的任何数据结构。

这个新的Order类将是传递给第二个表单的方便项。希望这是有道理的。

Barebone OrderItem类

public class OrderItem {
  public double Lenght { get; set; }
  public double Width { get; set; }
  public double Qty { get; set; }
  public string Texture { get; set; }

  public OrderItem(double inLength, double inWidth, double inQty, string inTexture) {
    Lenght = inLength;
    Width = inWidth;
    Qty = inQty;
    Texture = inTexture;
  }
}

Barebone Order类 - 获取DataTable OrderItems和字符串方法的添加方法。

public class Order {
  public int OrderNr { get; set; }
  public string Custommer { get; set; }
  public string Material { get; set; }
  public string MaterialCode { get; set; }
  public List<OrderItem> OrderInfo { get; set; }

  public Order(int oNum, string oCust, string oMaterial, string oMatCode) {
    OrderNr = oNum;
    Custommer = oCust;
    Material = oMaterial;
    MaterialCode = oMatCode;
    OrderInfo = new List<OrderItem>();
  }

  public DataTable GetItemsDT() {
    DataTable OrderDT = new DataTable();
    OrderDT.Columns.Add("Length", typeof(double));
    OrderDT.Columns.Add("Width", typeof(double));
    OrderDT.Columns.Add("Qty", typeof(double));
    OrderDT.Columns.Add("Texture", typeof(string));
    foreach (OrderItem item in OrderInfo) {
      OrderDT.Rows.Add(item.Lenght, item.Width, item.Qty, item.Texture);
    }
    return OrderDT;
  }

  public string GetOrderString() {
    StringBuilder sb = new StringBuilder();
    sb.AppendLine("Order: " + OrderNr + " Customer: " + Custommer + " Material: " + Material + " MatCode: " + MaterialCode);
    sb.AppendLine("-- Order Items --");
    sb.AppendLine("Length, Width, Qty, Texture");
    foreach (OrderItem item in OrderInfo) {
      sb.AppendLine(item.Lenght + ", " + item.Width + ", " + item.Qty + ", " + item.Texture);
    }
    sb.AppendLine("");
    return sb.ToString();
  }
}

Form1方法GetOrderFromTextBoxesGetOrderItemsFromDGV

private Order GetOrderFromTextBoxes() {
  int orderNum = 0;
  int.TryParse(tbOrderNr.Text, out orderNum);
  string cust = tbCustommer.Text;
  string mat = tbMaterial.Text;
  string code = tbForm2MatCode.Text;
  return new Order(orderNum, cust, mat, code);
}

private void GetOrderItemsFromDGV(Order inOrder) {
  double doubleValue = 0;
  double length = 0;
  double width = 0;
  double qty = 0;
  string texture = "";
  foreach (DataGridViewRow r in dataGridView1.Rows) {
    if (!r.IsNewRow) {
      if (r.Cells[0] != null)
        double.TryParse(r.Cells[0].Value.ToString(), out doubleValue);
      length = doubleValue;
      if (r.Cells[1] != null)
        double.TryParse(r.Cells[1].Value.ToString(), out doubleValue);
      width = doubleValue;
      if (r.Cells[2] != null)
        double.TryParse(r.Cells[2].Value.ToString(), out doubleValue);
      qty = doubleValue;
      if (r.Cells[3] != null)
        texture = r.Cells[3].Value.ToString();
      inOrder.OrderInfo.Add(new OrderItem(length, width, qty, texture));
    }
  }
}

使用按钮点击Form1以使用上述方法并将Order对象传递给Form2

private void btSendOrder_Click(object sender, EventArgs e) {
  Order thisOrder = GetOrderFromTextBoxes();
  GetOrderItemsFromDGV(thisOrder);
  Form2 f2 = new Form2(thisOrder);
  f2.ShowDialog();
}

Form2使用传入的Order对象填充一些文本框,并通过获取DataSourceDataGridView来设置Order’s的{​​{1}}与DataTable

thisOrder.GetItemsDT();

希望这有帮助。