2017-02-19 3 views
0

я есть здесь часть моего кода, где я отправить данные из текстовых полей и DataGridView к набору данных (все это в Form1)C# отправить данные в наборе данных в другой форме

Но как я могу сделать, что я отправить все эти данные в виде набора данных (проект> добавить новый элемент> набор данных ??

Спасибо

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

Entity Framework предназначен для упрощения такого рода вещей. – user34660

ответ

0

Представьте ваши формы называются Form1 и Form2, и вы хотите отправить что-то Form2. вы будете делать это:

подход 1

В Form2 создать свойство:

public DataSet DataSet {get; set; } 

Inf Form1, представьте у вас есть экземпляр Form2 под названием f2:

f2.DataSet = // The dataset you want to send to Form2 

подход 2

В Form1 (не Form2), создать свойство как это:

private DataSet aDataSet; 
public DataSet DataSet {get { return this.aDataSet; }} 

Тогда вы можете получить доступ к нему в Form2 используя экземпляр Form1. Представьте себе экземпляр с именем f1:

var f1DataSet = f1.DataSet; 
0

Г-н 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(); 
} 

Надеется, что это помогает.

 Смежные вопросы

  • Нет связанных вопросов^_^