Я довольно новичок в C# и объектно-ориентированном программировании в целом. Для части программы, которую я сейчас создаю, мне нужно использовать элемент управления вкладками, но элемент управления вкладками по умолчанию, который поставляется с меню панели инструментов Visual Studio, не позволяет мне достаточно настраиваться (например, вы не можете удалить границу). Я решил создать свой собственный элемент управления вкладками, используя две панели: одну для кнопок вкладок и одну для страниц вкладок. Мой проект требует, чтобы у меня была новая вкладка для каждого типа продукта (находится в списке типов продукта Объекты, сгенерированные из моей базы данных). Мне нужно, чтобы на каждой вкладке отображались все продукты (найденные в списке объектов Product).
Я уже написал код для этого, но поскольку я гораздо больше привык к процедурному программированию, я когда я делал что-то подобное, я использовал, как мне кажется, одни из худших OOP C# практик. Код, который я написал ниже (извините, он довольно длинный, хотя я и пытался его прокомментировать):
private List<Panel> tabs = new List<Panel>();
private void CreateTabControl()
{
using (SqlConnection cnn = new SqlConnection(cnnString))
{
cnn.Open();
var productTypes = cnn.Query<ProductTypes>("SELECT ProductType FROM tblProductTypes");
//Create a Flow Layout Panel for the tab buttons
FlowLayoutPanel flpTabButtons = new FlowLayoutPanel();
panel1.Controls.Add(flpTabButtons);
flpTabButtons.Dock = DockStyle.Fill;
foreach (ProductTypes pt in productTypes)
{
// Create a new tab page and add it to the list of tabs
Panel tab = new Panel();
tabs.Add(tab);
// Create a button used to open the tab (adds to the FLP created earlier)
Button b = new Button();
b.Text = pt.ProductType.ToString();
flpTabButtons.Controls.Add(b);
b.Tag = tab; // Tag is set to 'tab' so that the eventhandler knows what the current tab is
b.Click += new EventHandler(OpenTab);
panel2.Controls.Add(tab);
tab.Dock = DockStyle.Fill;
// Adding items the tab page
var filteredProducts = cnn.Query<Products>("SELECT * FROM tblProducts WHERE ProductType = @filterType", new { filterType = pt.ProductType });
FlowLayoutPanel flpProducts = new FlowLayoutPanel();
tab.Controls.Add(flpProducts);
flpProducts.Dock = DockStyle.Fill;
foreach (Products product in filteredProducts)
{
Button btnProduct = new Button();
btnProduct.Size = new Size(100, 100);
btnProduct.Text = product.Description;
flpProducts.Controls.Add(btnProduct);
btnProduct.Tag = product;
//b.Click += new EventHandler();
}
tab.Hide();
}
}
}
private void OpenTab(object sender, EventArgs e)
{
Button b = (Button)sender;
Panel tab = (Panel)b.Tag;
CloseTabs();
int tabIndex = tabs.IndexOf(tab);
tabs[tabIndex].Show();
}
private void CloseTabs()
{
foreach (Panel tab in tabs)
{
if (tab.Visible)
tab.Hide();
}
}
Я знаю, что мне, вероятно, нужно создать собственный класс, который будет иметь дело с моя генерация управления вкладками, но я не знаю, как go об этом. Пожалуйста, кто-нибудь может дать мне какие-нибудь советы о том, что делает класс хорошим в такой ситуации, и какие аспекты я должен включить в класс и что я должен оставить для формы, чтобы позаботиться? Спасибо.