我这里有一部分代码,我将数据从文本框和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;
}
答案 0 :(得分:0)
想象一下,您的表单被称为Form1
和Form2
,并且您希望向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”是父Form1
,Form2
有一个带有Form2(Form1 parent)
签名的构造函数。在该构造函数中,您可以将“this”父级分配给Form2
变量,例如:Form1 PARENT;
,然后在构造函数中将其分配给PARENT = parent
;。
这样您就可以访问Form1
中的所有公共变量。显然,如果我们只想传递一个DataSet
,那就太过分了,也没有必要。因此,应用这个想法,将DataSet
中的Form1
传递给Form2
示例:Form2 f2 = new Form2(DataSet);
似乎相当简单。显然,您需要设置一个具有DataSet
签名的适当构造函数。这会根据要求将DataSet
传递给Form2
。
下面的代码只是做了一些改变,我觉得这会让这更容易。我在这里猜测,但是按照您的代码,您似乎有两个{2} DataTables
:Order
和Data
。 Order
表似乎只保留一(1)条记录(行)...即订单号;顾客;材料和材料代码是此Order
的单个实体。 Order
可以有一个或多个Data
项,即Length,Width..Etc。这种结构尖叫着“让我成为一个班级”。以下代码使用两(2)个类:Order
和OrderItem
。
OrderItem
将是您代码中的单个Data
项:“长度”,“宽度”等。
Order
将包含OrderNr
,Customer
等。List
个OrderItem
个对象可容纳多个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方法GetOrderFromTextBoxes
和GetOrderItemsFromDGV
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
对象填充一些文本框,并通过获取DataSource
项DataGridView
来设置Order’s
的{{1}}与DataTable
thisOrder.GetItemsDT();
希望这有帮助。