2016-02-13 60 views
-1

我有一個允許用戶(客戶)下訂單的winform應用程序。爲此,當用戶點擊「下訂單」button時,則會顯示另一個表單,其中包含許多不同的控件(numericUpDown,TextBox,Combobox,Calendar和CheckBoxes)。然後用戶必須填寫所有字段,然後確認過程。從winform中動態創建控件獲取數據

現在,這個場景只是放置一個訂單,如果想要允許用戶一次放置多個訂單,該怎麼辦?

我想要應用的場景是用戶首先必須確定他們想要的訂單數量,然後根據該數量創建另一個表格並根據指定訂單數量動態創建的控件填充。

我的意思是,用戶需要8個訂單,所以每個類型的8個控件都是動態創建的。其實,直到現在,我已經設法做到了,但是我堅持的是,我怎麼才能從控件中獲取數據?

回到我的例子: 如果客戶想8項目,然後我將有: 8文本框 8個組合框 8日曆 等

更清楚,現在我想要得到的從textbox1,calender1,combobox1 ....等等插入數據,然後將它們存儲在臨時列表中以便稍後存儲到數據庫中,

任何人都可以給我一個線索? 在此先感謝

回答

1

我會建議你做出自己的用戶控制每個訂單(每行)。 在項目上下文菜單中選擇Add-> User control ...,然後輸入控制名稱「MyOrderControl」並將所有訂單的控件放在上面。

您還需要創建特定類來保存訂單的數據(如果ouy沒有這樣的類)。並添加到MyOrderControl特殊方法以返回該類的實例。

public partial class MyOrderControl : UserControl 
{ 
    public MyOrderControl() 
    { 
     InitializeComponent(); 
    } 

    public class Order 
    { 
     public string Name { get; set; } 
     public int Quantity { get; set; } 
    } 

    public Order GetFilledOrder() 
    { 
     //Validate data 
     return new Order() 
     { 
      Name = textBox1.Text, 
      Quantity = (int)numericUpDown1.Value 
     }; 
    } 
} 

在表單初始化中,您可以創建任意數量的控件實例。您可以使用FlowLayoutPanel自動放置它們。

public Form1() 
    { 
     InitializeComponent(); 

     const int nOrders = 10; 
     for (int n = 0; n < nOrders; n++) 
     { 
      flowLayoutPanel1.Controls.Add(new MyOrderControl()); 
     } 
    } 

,然後添加spectial方法來檢索所有的成品(使用System.Collections.Generic,System.Linq的):

public IEnumerable<MyOrderControl.Order> GetOrders() 
    { 
     foreach (var order in flowLayoutPanel1.Controls.OfType<MyOrderControl>()) 
     { 
      yield return order.GetFilledOrder(); 
     } 
    } 

它可以讓你從父窗體訪問所有的訂單:

public void AcquireOrders() 
    { 
     var form = new Form1(); 
     if (form.ShowDialog() != DialogResult.OK) 
      return; 

     foreach (var order in form.GetOrders()) 
     { 
      System.Diagnostics.Debug.Print("Order: {0} Qty={1}", 
       order.Name, order.Quantity); 
     } 
    } 
+0

太棒了!這正是我所期待的。非常感謝您的回答 –