2014-03-06 200 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中的處理程序分配,但實時編譯錯誤已經指向我確切的修復。 –