2017-02-17 3 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

버튼의 모든 개체가 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) –