我正在尝试在C#中创建一个POS系统(非常基本的),我在MYSQL数据库中有产品,我希望将其拉出然后显示在系统中。
我可以生成名称没有问题的按钮,我的问题是我想实现一种方法让用户点击一个按钮并将其添加到列表框中 - 这很容易做到,如果我知道数据库中的产品数量,但我不会这样,我需要使用按钮以编程方式生成onclick处理程序
这是我的按钮生成代码:
int i = 1;
while (sqlReader.Read())
{
//Create label
var button = new Button {Text = String.Format(sqlReader.GetString("productName"), i)};
//Position label on screen
button.Left = 110;
button.Top = (i + 1)*30;
//Add controls to form
Controls.Add(button);
i++;
}
我意识到并不是所有的都在那里,但那是我用来生成按钮的while循环所以我想知道处理程序是否会进入那里?
答案 0 :(得分:2)
如果您需要在Click处理程序中访问产品信息,可以执行以下操作:
int i = 1;
while (sqlReader.Read())
{
//Create label
var button = new Button {Text = String.Format(sqlReader.GetString("productName"), i)};
//Position label on screen
button.Left = 110;
button.Top = (i + 1)*30;
// Get product data
var prodData1 = sqlReader["prodData1"];
var prodData2 = sqlReader["prodData2"];
// etc.
button.Click += (sender,e)=>{
// In here, you can access prodData1 and prodData2
};
//Add controls to form
Controls.Add(button);
i++;
}
答案 1 :(得分:1)
是的,无论何时创建按钮,都必须为其添加一个事件处理程序:
button.Click += Button_ClickedEvent;
private void Button_ClickedEvent(object sender, EventArgs e)
{
//Use the sender object to work out which button was clicked.
}
答案 2 :(得分:0)
你的方法有点不正统,但你几乎就在那里。您可以按照在创建新按钮时分配Text
属性的方式分配事件处理程序。 如果按钮点击都会做同样的事情,你就可以说:
var button = new Button {Text = String.Format(sqlReader.GetString("productName"), i)};
button.Click += button_Clicked
button_Clicked将是代码中某处定义的函数:
private void button_Click(object sender, EventArgs e)
{
// add to listbox here
}
将sender参数转换为Button,以确定在需要时调用了哪一个,并执行您需要执行的操作。
答案 3 :(得分:0)
要查看向控件添加事件处理程序的好例子,请查看表单的.Designer.cs文件。几乎每个都有+ =运算符的行就是为控件分配一个新的事件处理程序。
当我删除(通常是空白的)事件处理函数并重建解决方案时,我花了很多时间在.Designer.cs中删除不需要的事件处理程序赋值。错误总是在处理程序分配的行上。