我正在使用3层体系结构设计C#windows应用程序,基本上我正在为超市创建管理系统,我在其中创建了一个用于生成BILL的表单。我已经使用FlowLayout面板分别生成4个ComboBoxes,3个TextBox和2个Numeric UpDown来相应地保存Bill值。我已经提供了添加按钮,我们可以在每次单击按钮时动态创建这些控件,因此,例如,当用户单击添加按钮添加新项目时,将生成包含4个CB,3 TB和2个NUpDowns的新行。提到这个场景后,我有以下问题:
谢谢
答案 0 :(得分: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)。
我希望我的解释符合您的要求并回答您的问题。如果我可以帮助您,请随时询问。