Создание пользовательского TabControl в C# - PullRequest
0 голосов
/ 11 апреля 2020

Я довольно новичок в 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 об этом. Пожалуйста, кто-нибудь может дать мне какие-нибудь советы о том, что делает класс хорошим в такой ситуации, и какие аспекты я должен включить в класс и что я должен оставить для формы, чтобы позаботиться? Спасибо.

...