2017-02-17 35 views
0

ダイナミックに作成されたタブページにコントロールを追加するときに問題があります。私のソフトウェアはレストランのPOSシステムです。私のアイデアは、まずレストランの地域を作成し、地域には机の数が異なります。例:ダイナー用の領域には15の机があり、カフェバーには22の机があります。この場合のカテゴリや製品のようなものには、デスクがあります。だから私はtabcontrolコンポーネントを使用して!すべてtabpagesは地域名で、タブページのコンテンツはbuttons ...C#winforms動的に作成されたタブページにコントロールを追加

と表示されている必要があります。すべての地域とデスクはMySqlデータベースに保存されています。

したがって、コンテンツループとしてtab_1(地域#1)が選択されている場合は、すべてのデスクbuttonsがページにあります。地域をリストするための

私のコードのすべての時間のリターンを一つだけ机しかし、私は、地域1のための10個の机を持っている...

コード:

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

ButtonオブジェクトのすべてがUI上で作成されている可能性があるが、何に設定された何場所がないので、 'の呼び出し側は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) –

関連する問題