Переключение на динамически создаваемую TabPage по нажатию кнопки - PullRequest
0 голосов
/ 19 октября 2018

Я практикую свое кодирование и пытаюсь создать до, динамически заполняя элементы, которые хранятся в текстовом файле.Я могу динамически создавать вкладки, кнопки и создавать кнопки меню на основе категорий элементов.Я пытаюсь переключить вкладку одним нажатием кнопки.Вкладки получают имя, которое является идентификатором категории, а текст отображает категорию.В случае попытки переключения вкладки я получаю следующую ошибку:

Ошибка CS0266 Невозможно неявно преобразовать тип «объект» в «System.Windows.Forms.TabPage».Существует явное преобразование (вам не хватает приведения?)

Я предполагаю, что мне нужно создать закладку или что-то в этом роде, но я не могу узнать, как это сделать.Будь на нем часами!Вот мой код ....

public partial class Form1 : Form
{
    private void Form1_Load(object sender, EventArgs e)
    {
        string[] loadedFile = File.ReadAllLines(@"h:\shopItemsV2.txt");
        foreach (string line in loadedFile)
        {
            // Split string and create required variables
            string[] newBtnData = line.Split(',');
            int catID = int.Parse(newBtnData[0]);
            string cat = newBtnData[1];
            string item = newBtnData[2];
            double price = double.Parse(newBtnData[3]);

            // Create tab if needed
            if (tabControl1.TabCount < catID)
            {
                TabPage tp = new TabPage()
                {
                    Text = cat,
                    Name = catID.ToString()
                };
                tabControl1.TabPages.Add(tp);
                // Add FlowLayoutPanel with unique name
                FlowLayoutPanel fp = new FlowLayoutPanel()
                {
                    Name = "fp" + catID.ToString(),
                    Dock = DockStyle.Fill
                };

                // Add FlowLayoutPanel to correct Tab
                tabControl1.TabPages[catID-1].Controls.Add(fp);

                // Create Button for menu
                Button newMenuBtn = new Button()
                {
                    Name = cat + "Btn",
                    Tag = catID,
                    Width = 100,
                    Height = 50,
                    Text = cat,
                };
                newMenuBtn.Click += SwitchTab;
                menuFP.Controls.Add(newMenuBtn);
            }

            // Create Button
            Button newBtn = new Button()
            {
                Name = item,
                Tag = price,
                Width = 100,
                Height = 100,
                Text = item,
            };
            newBtn.Click += AddItem;

            //Add button to correct tab
            foreach (TabPage tabP in tabControl1.TabPages)
            {

                if (tabP.Name == catID.ToString())
                {
                    Control fp = this.Controls.Find("fp"+catID, true).First();
                    fp.Controls.Add(newBtn);
                }
            }
        }
    }

    private void SwitchTab(object sender, EventArgs e)
    {
        // Create button, switch to required Tab
        // Tabs named the same as Tag on the button
        Button clickedBtn = sender as Button;        
        tabControl1.SelectedTab = clickedBtn.Tag;
    }
}

Любая помощь будет принята с благодарностью.

Ответы [ 2 ]

0 голосов
/ 19 октября 2018
private void AddNewPr_Click(object sender, EventArgs e)
    {
        TabPage tab = new TabPage();
        _list = new ListBox();
        _list2 = new ListBox();
        PictureBox picBox = new PictureBox();
        picBox.Click = picBox_Click;

        //More stuff here

        //Add the controls        
        tabControl1.Controls.Add(tab);
        tab.Controls.Add(list);
        tab.Controls.Add(list2);
        tab.Controls.Add(pictureBox);
    }
0 голосов
/ 19 октября 2018

Вы можете сохранить что угодно в свойстве Tag () вашей кнопки.Имея это в виду, сохраните ссылку на вашу вкладку!

Изменение:

// Create Button for menu
Button newMenuBtn = new Button()
{
    Name = cat + "Btn",
    Tag = catID,
    Width = 100,
    Height = 50,
    Text = cat,
};

Кому:

// Create Button for menu
Button newMenuBtn = new Button()
{
    Name = cat + "Btn",
    Tag = tp; // store the reference to the TabPage you created
    Width = 100,
    Height = 50,
    Text = cat,
};

Тогда предложение Уве Кейма должно сработать:

tabControl1.SelectedTab = clickedBtn.Tag as TabPage;
...