2014-03-06 141 views
0

我想在C#中创建一个POS系统(非常基本的),并且我有一个MYSQL数据库中的产品,我想要被拉动然后显示在系统中。将OnClick事件添加到按钮

我可以生成名称没有问题的按钮,我遇到的问题是,我想要实现一种方式,让用户点击一个按钮,并将其添加到列表框中 - 这很容易做到如果我知道的产品在数据库中的金额,但我不会,所以我需要的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

我编辑了你的标题。请参阅:“[应该在其标题中包含”标签“](http://meta.stackexchange.com/questions/19190/)”,其中的共识是“不,他们不应该”。 –

+0

这是一个winforms应用程序? –

+0

是的,它是一个窗体 – user2960452

回答

2

如果您需要访问产品信息的点击处理程序中,你可以做如下:

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++; 
} 
+0

我建议使用FlowLayoutPanel作为包装,可能会有用... –

1

是的,当你创建一个按钮,你必须添加一个事件处理程序为它:

button.Click += Button_ClickedEvent;


private void Button_ClickedEvent(object sender, EventArgs e) 
{ 
    //Use the sender object to work out which button was clicked. 
} 
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 
} 

演员发送者参数作为一个Button来确定哪一个调用了点击,如果需要的话,并且做你需要做的任何事情。

+0

如果我想添加有关该产品的信息,我该如何传递标识符。该系统是基于大量的产品,但我永远不知道确切的计数,所以如果你按下按钮X,那么系统将需要添加产品X到列表框 我正在考虑一些功能的增加产品信息到列表框中,如 private void add(String product){listbox1.add(product);} } 但我不知道如何通过按钮发送产品名称点击 – user2960452

+0

这是你可以从数据库中读取的东西吗? –

+0

这个想法是,一旦按下按钮(从数据库生成的按钮信息),它将它插入到列表框中 – user2960452

0

要查看添加事件处理您的控制的很好的例子来看看在了.Designer.cs文件为你的形式。几乎每一行有一个+ =操作符的行都将一个新的事件处理程序分配给一个控件。

我花了很多时间在了.Designer.cs删除不需要的事件处理程序分配时,我删除了(经常为空)事件处理函数,并重新生成解决方案。错误总是在处理程序分配的行上。

+0

-1:您不应该编辑.Designer.cs文件。他们属于设计师。使用设计器UI来删除由设计人员添加的处理程序。 –

+0

是的,我已经看到了哪里可以咬人屁股。然而,在我强调的情况下,这确实是最方便的方式。我可以删除UI中的处理程序分配,但实时编译错误已经指向我确切的修复。 –