2017-02-17 121 views
0

我有問題,當我想添加控件到動態創建的標籤頁時。我的軟件是餐館的POS系統。我的想法是首先創建餐廳地區和地區有不同數量的桌子。例如:餐廳的地區有15個辦公桌,咖啡吧地區有22個辦公桌。在這種情況下,類似產品和產品的地區都有辦公桌。所以要做到這一點,我使用tabcontrol組件!所有tabpages是區域名稱和tabpage內容必須是桌面顯示爲buttons ...C#winforms添加控件到動態創建的標籤頁

所有地區和辦公桌都存儲在MySql數據庫中。

因此,如果tab_1(區域#1)被選爲內容循環頁面上的所有桌子buttons

我的代碼所有的時間只返回一個辦公桌,但我有10桌的區域1 ..

規範上市地區:

private void RegionList() 
{ 
    try 
    { 
     using (var conn = new MySqlConnection(Properties.Settings.Default["connectionstring"].ToString())) 
     { 
      conn.Open(); 
      using (MySqlCommand cmd = conn.CreateCommand()) 
      { 
       cmd.CommandText = "SELECT * FROM regions"; 
       MySqlDataReader reader = cmd.ExecuteReader(); 

       while (reader.Read()) 
       { 
        TabPage tabPage = new TabPage(); 
        string name = reader["name"].ToString(); 
        int id = Convert.ToInt32(reader["id"]); 

        tabPage.Name = "tab_" + id; 
        tabPage.Text = name; 

        foreach (var desk in DeskList(id)) 
        { 
         tabPage.Controls.Add(desk); 
        } 
        tabControl1.TabPages.Add(tabPage); 
       } 
       reader.Close(); 
      } 
      conn.Close(); 
     }; 
    } 
    catch (Exception ex) 
    { 
     MessageBox.Show(ex.Message); 
    } 
} 

這裏是對具體區域上市書桌碼:

private List<Button> DeskList(int regionID) 
{ 
    List<Button> desks = new List<Button>(); 

    try 
    { 
     using (var conn = new MySqlConnection(Properties.Settings.Default["connectionstring"].ToString())) 
     { 
      conn.Open(); 

      using (MySqlCommand cmd = conn.CreateCommand()) 
      { 
       cmd.CommandText = "SELECT * FROM desks WHERE region_id = @id"; 
       cmd.Parameters.AddWithValue("id", regionID); 

       MySqlDataReader reader = cmd.ExecuteReader(); 

       while (reader.Read()) 
       { 
        Button btn = new Button(); 
        string name = reader["name"].ToString(); 

        btn.Text = name; 
        btn.Name = "desk_" + reader["id"]; 
        btn.Size = new Size(100, 60); 

        desk.Add(btn); 

       } 
       reader.Close(); 
      }; 
      conn.Close(); 
     }; 
    } 
    catch (Exception ex) 
    { 
     MessageBox.Show(ex.Message); 
    } 

    return desks; 
} 

所以當我循環這個我得到只在所有地區只有1桌但正確的結果。所有地區都有10個辦公桌。我做錯了什麼? Maybie我的appoarch是錯的

+3

這可能是所有按鈕對象是在用戶界面創建,但他們很可能都堆放在彼此的頂部,因爲沒有位置上的任何設置(除非'來電DeskList'做這一切) –

+0

DeskList(id)是否返回10個元素的列表? – hellogoodnight

+0

是的位置問題。當我添加位置工作良好時,按鈕僅被疊放 – Ivan

回答

1

我認爲上述關於按鈕放置的聲明可能是問題。嘗試添加以下內容,這將改變每個按鈕的位置。

 int i = 0; 
     while (reader.Read()) 
     { 
      Button btn = new Button(); 
      string name = reader["name"].ToString(); 

      btn.Text = name; 
      btn.Name = "desk_" + reader["id"]; 
      btn.Size = new Size(100, 60); 
      btn.Location=new Point(100, 100+i); 

      desk.Add(btn); 
      i += 10; 
     } 
+0

您可以使用'TableLayoutPanel'來簡單地安排控件。 [(實施例)](http://stackoverflow.com/a/33969228/3110834) –