Г-н JohnG размещена здесь очень полезный ответ тоже, но был удален. Спасибо.
Как указывалось в кодировке Yoshi, существует несколько способов передачи переменных между формами. Это действительно зависит от того, что вы делаете. Вы можете просто передать родительскую форму WHOLE дочерней форме, например Form2 f2 = new Form2(this)
, где «this» является родителем Form1
и Form2
имеет конструктор с подписью, такой как Form2(Form1 parent)
. Внутри этого конструктора вы можете назначить «этого» родителя переменной Form2
, например: Form1 PARENT;
, затем назначьте ее в конструкторе с помощью PARENT = parent
;.
Это даст вам доступ ко всем общедоступным переменным в Form1
. Очевидно, что это излишне и ненужно, если мы просто хотим передать один номер DataSet
. Поэтому, применяя эту идею, представляется довольно прямой передачей DataSet
в Form1
- Form2
. Пример: Form2 f2 = new Form2(DataSet);
. Очевидно, вам нужно будет создать соответствующий конструктор с подписью DataSet
. Это передаст DataSet
по номеру Form2
согласно требованию.
Код ниже делает только это с несколькими изменениями, которые, как я чувствовал, сделают это проще. Я угадываю здесь, но, следуя вашему коду, кажется, что у вас есть два (2) DataTables
: Order
и Data
. В таблице Order
отображается только одна запись (строка) ONE (1) ... т. Е. Номер для заказа; Клиент; Материал и материальный код являются отдельными объектами для этого Order
. Order
может иметь один или несколько элементов Data
, то есть длину, ширину ....Эта структура кричит «сделай меня классом». В приведенном ниже коде используются два (2) класса: Order
и OrderItem
.
OrderItem
бы один Data
пункт в вашем коде: «Длина», «Ширина» Etc.
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
пункты DataTable
с thisOrder.GetItemsDT();
private Order thisOrder;
public Form2(Order inOrder) {
InitializeComponent();
thisOrder = inOrder;
}
private void Form2_Load(object sender, EventArgs e) {
tbCustommer.Text = thisOrder.Custommer;
tbOrderNr.Text = thisOrder.OrderNr.ToString();
tbMaterial.Text = thisOrder.Material;
tbForm2MatCode.Text = thisOrder.MaterialCode;
dataGridView1.DataSource = thisOrder.GetItemsDT();
}
Надеется, что это помогает.
Entity Framework предназначен для упрощения такого рода вещей. – user34660