我们如何在C#windows应用程序中访问动态创建的控件?
我正在使用三层架构设计C#windows应用程序,基本上我正在为超市制作管理系统,在这个系统中我创建了一个生成账单的表单。我使用FlowLayout面板分别生成了4个组合框、3个文本框和2个数字向上向下,以相应地保存账单值。我提供了add按钮,我们可以在每次单击按钮时动态创建这些控件,因此,例如,当用户单击add按钮添加新项目时,新行将生成4个cb、3个tb和2个nupdown。提到该场景后,我有以下疑问:我们如何在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。提到该场景后,我有以下疑问: 如何依次访问每行中的每个控件?例如,我想访问第五行的第三个组合框,我该如何访问它呢 我正
谢谢我不知道您的应用程序的体系结构,但让我试着帮助您。假设您的业务逻辑中有某种类型的客户、产品和订单对象,那么工作流可能如下所示
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面板的某些问题。:)