Как изменить BackColor кнопок внутри TableLayoutPanel? - PullRequest
0 голосов
/ 24 апреля 2019

Есть ли способ изменить цвет фона кнопок внутри TableLayoutPanel?

Цвет фона кнопок будет изменен одним нажатием кнопки за пределами TableLayoutPanel.
На самом деле я хотел знать, как определить кнопки, которые находятся внутри TableLayoutPanel.
Я предоставляюблок кода ниже.Пожалуйста, поправьте меня.

private void button10_Click(object sender, EventArgs e)
{
    Button btnClicked = sender as Button;
       // wanted to convert the controls of tablelayoutpanel
    if (tableLayoutPanel1.Controls is Button)
    {
        btnClicked = (Button)tableLayoutPanel1.Controls;
    }
    else
        continue;
}

// Couldn't call the buttons inside the tablelayoutpanel.

1 Ответ

1 голос
/ 24 апреля 2019

Control.Controls - это коллекция. Он не может быть приведен к одному объекту. Это:

tableLayoutPanel1.Controls is Button

получит уведомление в редакторе кода (зеленое подчеркивание) с сообщением:

Данное выражение никогда не относится к указанному ('Button') типу.

Это приведение приведет к ошибке:

btnClicked = (Button)tableLayoutPanel1.Controls;

CS0030: невозможно преобразовать тип 'System.Windows.Forms.TableLayoutControlCollection' для 'System.Windows.Forms.Button'


Чтобы изменить свойство всех дочерних элементов управления Button элемента TableLayoutPanel (или любого другого контейнера), вы можете перечислить его коллекцию Controls , учитывая только дочерние элементы управления определенного типа.

Например, измените на Color.Red свойство BackColor всех кнопок внутри TableLayoutPanel:

foreach (Button button in tableLayoutPanel1.Controls.OfType<Button>()) {
    button.BackColor = Color.Red;
}

Изменить на Text свойство всех кнопок в первой строке:
Обратите внимание, что здесь я использую универсальный тип Control вместо Button. Это связано с тем, что свойство Text является общим для всех элементов управления, которые являются производными от Control . Свойство Text определено в классе Control.

foreach (Control ctl in tableLayoutPanel1.Controls.OfType<Button>())
{
    if (tlp1.GetRow(ctl) == 0)
        ctl.Text = "New Text";
}

Изменить свойство элемента управления в первой строке, первом столбце TableLayoutPanel:
Здесь я не знаю, какой тип управления расположен в координатах (0, 0), но я знаю, что это объект, полученный из класса Control. Поэтому я могу установить свойство, которое принадлежит этому классу и поэтому наследуется.
Может случиться так, что конкретное свойство не относится к типу элемента управления. В этом случае ничего не произойдет (вы можете попытаться установить свойство Text вашей TableLayoutPanel).

(tableLayoutPanel1.GetControlFromPosition(0, 0) as Control).BackColor = Color.Green;
...