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

问题描述 投票:0回答:1

我正在使用3层架构设计C#windows应用程序,基本上我正在为超市创建管理系统,我在其中创建了一个用于生成BILL的表单。我已经使用FlowLayout面板分别生成4个ComboBoxes,3个TextBox和2个Numeric UpDown来相应地保存Bill值。我已经提供了添加按钮,我们可以在每次单击按钮时动态创建这些控件,因此,例如,当用户单击添加按钮添加新项目时,将生成包含4个CB,3 TB和2个NUpDowns的新行。提到场景后,我有以下查询:

  1. 如何依次访问每一行中的每个控件?所以,例如,我想访问第5行的第3个ComboBox,我该如何访问它。
  2. 我正在使用3层应用程序架构来设计应用程序。我已将其功能放在BusinessLogicLayer中,并在按钮事件中在UI中调用它们。这个方法我还好吗?
  3. 我希望每行中的每个ComboBox都与第一个连接。例如,当用户从中选择任何内容时,第一个指示主要类别,第二个组合框(子类别)应显示与第一个连接的项目,依此类推。我怎样才能做到这一点?

谢谢

c# sql winforms 3-tier
1个回答
1
投票

我不知道你的应用程序的架构,但让我试着帮助你。假设您拥有适用于您的业务逻辑的某种客户,产品和订单对象,则工作流程可能如下所示

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_Click中,我省略了检查,也应该处理这种情况。在ButtonAddProduct_Click中,处理添加产品的情况。假设产品的存在,因此你必须在这里引入一些错误处理,例如通过使用类似的东西

if(Product.Exists(productNumber))
{
    // add to order
}
else
{
    // emit error message
}

实际事务在ButtonSubmit_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)
    {
        ...
    }
}

现在,只要有任何关于产品的信息发生变化,您就会收到一个事件,可以直接访问您的用户控件和所有必要的数据(如果您在ProductSelector中编写了这些函数)。如果要依次访问控件,可以从MainForm.Controls获取ProductSelector类型的所有控件,也可以创建所添加的所有ProductControl的列表。

2)是的,我认为你对这种方法没问题。在某些地方你必须访问BLL和UI事件处理程序的功能是一个很好的起点。

3)请看我回答1)。

我希望我的解释符合您的要求并回答您的问题。如果我可以帮助您,请随时询问。

© www.soinside.com 2019 - 2024. All rights reserved.