2017-02-17 7 views
0

У меня проблема, когда я хочу добавить элементы управления в динамически созданные вкладки. Мое программное обеспечение - это система POS для ресторанов. Моя идея состоит в том, чтобы сначала создать регионы ресторанов, а регионы имеют различное количество столов. Пример: в регионе для столовой имеется 15 столов, в зоне кафе - 22 столовых. Что-то вроде категории и продуктов, в этом случае в регионах есть столы. Поэтому для этого я использую компонент tabcontrol! Все tabpages - название региона и содержимое страницы должны быть представлены как buttons ...C# winforms добавить элементы управления к динамически созданным вкладкам

Все регионы и парты хранятся в базе данных MySql.

Так что если tab_1 (Region # 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

Вполне возможно, что все объекты Button создаются на UI, но они, вероятно, все укладываются друг на друга, потому что не место установлен на что-либо (если вызывающий 'DeskList' не все это делает) –

+0

Does 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) –

Смежные вопросы