从winform中动态创建的控件中获取数据

时间:2016-02-13 17:24:04

标签: c# winforms

我有一个winform应用程序,允许用户(客户)下订单。为此,当用户点击“下订单”button时,会显示另一个表单,其中包含许多不同的控件(numericUpDown,TextBox,Combobox,Calendar和CheckBoxes)。然后,用户必须填写所有字段,然后确认该过程。

现在这种情况只是用于下单,如果想让用户一次性下订单,该怎么办?

我想要应用的场景是用户首先必须确定他们想要多少订单,然后根据该编号创建另一个表单并由根据指定订单数动态创建的控件填充。

我的意思是,用户想要8个订单,因此动态创建每种类型的8个控件。

实际上,到目前为止,我已经设法这样做了,但我坚持的是如何从控件中获取数据?

回到我的例子: 如果客户想要8个订单,那么我将: 8个文本框 8个组合框 8个日历 等等

更清楚一点,现在我想从textbox1,calender1,combobox1等中获取插入的数据,然后将它们存储在临时列表中,以便稍后存储到数据库中,

有人能给我一些线索吗? 提前谢谢

1 个答案:

答案 0 :(得分:1)

我建议您为每个订单(每行)进行自己的用户控制。 在项目上下文菜单中选择添加 - >用户控件...然后输入控件名称“MyOrderControl”并将所有订单的控件放在其上。

此外,您还需要创建特定类来保存订单的数据(如果没有这样的类)。并添加到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);
        }
    }