Связь объекта C # с динамическими метками в динамических объектах - PullRequest
0 голосов
/ 28 апреля 2018

Я создал динамическую форму, а внутри нее динамические объекты. Но по какой-то причине, когда я создаю динамические обработчики событий, обработчики событий не принимают динамические объекты. То есть они не отображаются в раскрывающемся списке параметров в Visual Studios.

код:

private void btnShop_Click(object sender, EventArgs e)
    {
        Form frmShop = new Form();
        frmShop.Show();

        Button newButton = new Button();
        Button Add = new Button();
        Label Meat = new Label();
        Label Carrots = new Label();
        Label DogFood = new Label();
        Label Fish = new Label();
        Label Rainbows = new Label();

        frmShop.Controls.Add(Meat);
        frmShop.Controls.Add(Carrots);
        frmShop.Controls.Add(DogFood);
        frmShop.Controls.Add(Fish);
        frmShop.Controls.Add(Rainbows);

        frmShop.Controls.Add(newButton);
        frmShop.Controls.Add(Add);

        frmShop.Size = new Size(300,300);

        //HERE IS MY PROBLEM v //
        frmShop.Controls.Add(lblCount) 
    }

1 Ответ

0 голосов
/ 28 апреля 2018

Переменная Rainbow является локальной для обработчика событий btnShop_Click , и вы не можете использовать эту переменную в другом методе, даже если вы используете то же имя. Подробнее об этом можно узнать здесь

Вам необходимо переместить элементы управления в глобальную область или дать им имя и извлечь их из коллекции элементов управления формы.

Например, переместите переменную, получающую динамическую форму, в глобальную область (вне любого метода класса, но внутри объявления класса)

private Form frmShop = null;

private void btnShop_Click(object sender, EventArgs e)
{
    frmShow = new Form();
    .....

    // Set the Name property for the label
    Label Rainbow = new Label { Name = "Rainbow" }
    ...

    frmShow.Controls.Add(Rainbow);


}

protected void newButton_Click(object sender, EventArgs e)
{
    ...

    // Try to extract the label required from the form controls collection
    // using the specified name
    Label aRainbowLabel = frmShow.Controls
                                 .OfType<Label>()
                                 .FirstOrDefault(x=>x.Name=="Rainbow");
    aRainbowLabel.Text = "Rainbows: 1";
} 

Остерегайтесь, что вы идете по опасному пути здесь. Переменная frmShow является глобальной, и если вы снова нажмете ту же кнопку, вы создадите вторую форму с теми же элементами. Если с этим все в порядке, то нет проблем, но если вам нужна только одна форма такого типа, вам нужно проверить переменную на null перед созданием формы и установить для переменной frmShow значение null, если вы закроете эту форму.

...