我们如何在C#windows应用程序中访问动态创建的控件?

我们如何在C#windows应用程序中访问动态创建的控件?,c#,sql,winforms,3-tier,C#,Sql,Winforms,3 Tier,我正在使用三层架构设计C#windows应用程序,基本上我正在为超市制作管理系统,在这个系统中我创建了一个生成账单的表单。我使用FlowLayout面板分别生成了4个组合框、3个文本框和2个数字向上向下,以相应地保存账单值。我提供了add按钮,我们可以在每次单击按钮时动态创建这些控件,因此,例如,当用户单击add按钮添加新项目时,新行将生成4个cb、3个tb和2个nupdown。提到该场景后,我有以下疑问: 如何依次访问每行中的每个控件?例如,我想访问第五行的第三个组合框,我该如何访问它呢 我正

我正在使用三层架构设计C#windows应用程序,基本上我正在为超市制作管理系统,在这个系统中我创建了一个生成账单的表单。我使用FlowLayout面板分别生成了4个组合框、3个文本框和2个数字向上向下,以相应地保存账单值。我提供了add按钮,我们可以在每次单击按钮时动态创建这些控件,因此,例如,当用户单击add按钮添加新项目时,新行将生成4个cb、3个tb和2个nupdown。提到该场景后,我有以下疑问:

  • 如何依次访问每行中的每个控件?例如,我想访问第五行的第三个组合框,我该如何访问它呢
  • 我正在使用三层应用程序体系结构来设计应用程序。我已经将它们的函数放在BusinessLogicLayer中,并在UI中的按钮事件中调用它们。我同意这种方法吗
  • 我希望每行中的每个组合框都与第一个连接。例如,当用户从中选择任何内容时,第一个组合框表示主类别,第二个组合框(子类别)应显示与第一个组合框连接的项目,依此类推。我该怎么做
    谢谢

    我不知道您的应用程序的体系结构,但让我试着帮助您。假设您的业务逻辑中有某种类型的客户、产品和订单对象,那么工作流可能如下所示

    void ButtonFindCustomer_Click(object sender, EventArgs e)
    {
        m_order.Customer = Customer.Find(TextBoxFirst.Text, TextBoxLast.Text, TextBoxCustomerID.Text);
    }
    
    void ButtonAddProduct_Click(object sender, Event args)
    {
        m_order.AddArticle(Product.Find(TextBoxArticleNumber.Text), NumericUpDownArticleAmount.Value);
    }
    
    void ButtonSubmit_Click(object sender, EventArgs e)
    {
        m_order.Place();
    }
    
    我在这里使用成员变量的前缀只是为了清楚,因为缺少上下文。在实际代码中,您应该避免使用它。此外,我还忽略了检查ButtonFindCustomer\u Click中是否存在用户,这种情况也应该得到处理。在ButtonAddProduct_中,单击添加产品并进行处理的情况。再次假设产品的存在,因此您必须在这里引入一些错误处理,例如使用

    if(Product.Exists(productNumber))
    {
        // add to order
    }
    else
    {
        // emit error message
    }
    
    实际事务在ButtonsSubmit_Click处理程序中执行。订单经过验证,然后发送到数据访问层(例如写入SQL数据库)。错误处理再次丢失,请记住这一点

    要了解您的实际问题:

    1) 您必须以某种方式跟踪您创建的控件。如果总是在同一组中创建它们,则应考虑用户控件,避免跟踪哪些控件属于同一控件。例如,控件可以包含一个类别下拉框、一个产品下拉框和一个金额数字上下框

    class ProductSelector : UserControl
    {
        ... //add controls to user control
    
        public event EventHandler CategoryChanged;
        public event EventHandler ProductChanged;
        ...
    
        public void PopulateCategories(list<string> names, list<string> ids)
        {
            ...
        }
    
        public void PopulateProducts(list<string> names, list<string ids)
        {
            ...
        }
    }
    
    class ProductSelector:UserControl
    {
    …//将控件添加到用户控件
    公共事件事件处理程序类别已更改;
    公共事件事件处理程序已更改;
    ...
    公共void PopulateCategories(列表名称、列表ID)
    {
    ...
    }
    
    public void PopulateProducts(列表名称,列表这对于SO Q&A格式来说太宽泛了。请将您的问题分解成更小的问题,尝试自己解决,如果遇到问题,请在此处发布。要访问表单上的每个控件,请运行此。控件列表:foreach(此.Controls中的控件){do something}我还有最后一个问题,如何在数据库中保存动态创建的控件组中的值。嘿,Paul,如果我想在数据库中存储这些控件生成的所有值,该怎么办?正如你所知道的bill(s)可以包含多组控件。顺便说一句,我使用了您的想法,您保存了我的代码,该代码生成了flowlayout面板的某些问题。:)