Member 12341536 Ответов: 1

Сделать имя группы контроля в//получаем имя управления и соответствующие полю


Всем привет,

Во-первых, вот мой код.

private void Form1_Load(object sender, EventArgs e)
{
    foreach (var button in Controls.OfType<System.Windows.Forms.Control>())
    {
        button.Click += button_Click;

    }

}

    private void button_Click(object sender , EventArgs e)
    {
        Console.WriteLine("the Control with the name "+ this.Controls[((System.Windows.Forms.Control)(sender)).Name].Name+ "was clicked");

    }



Каждый элемент управления в классе Control печатает свое имя, если он был нажат.

Это прекрасно работает, но когда элемент управления, например кнопка или pictureBox, находится в групповом поле, он больше не дает мне имени, если я нажимаю на него. Когда я нажимаю на группы, это дает мне название группы. Похоже, что у меня больше нет доступа к именам элементов управления.

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

Мне это нужно точно так же, как и приведенный выше код. Я не хочу реализовывать для каждого элемента управления отдельный метод.

Я был бы очень признателен, если бы кто-нибудь мог дать мне предложение.

Спасибо.

Что я уже пробовал:

Google, MSDN, глядя на общие проблемы в CodeProject.com

[no name]

Группа имеет свой собственный набор элементов управления. Вам нужно будет проверить его вместо коллекции элементов управления forms.

1 Ответов

Рейтинг:
10

Midi_Mick

Это происходит потому, что элементы управления в контейнере, таком как groupbox или panel, принадлежат коллекции элементов управления контейнера, а не коллекции элементов управления формы. Вам нужно рекурсивно просмотреть коллекции контейнера, если вы хотите получить их все

private void SetClickHandler(Control.ControlCollection controls) {
	foreach (var button in controls.OfType<Control>()) {
		button.Click += button_Click;
		if (button.Controls.Count > 0)
			SetClickHandler(button.Controls);
	}
}
private void Form1_Load(object sender, EventArgs e) {
	SetClickHandler(Controls);
}


Member 12341536

Привет,

большое вам спасибо за ваши ответы.

В Midi_Mick:
Я заменил ваш код своим кодом, но он по-прежнему дает мне только имена элементов управления за пределами groupbox/panel. Ты хоть представляешь, что это может быть?

Спасибо.

Midi_Mick

Вы сделали то, что я сделал сначала, и в foreach забыли изменить "элементы управления.OfType "to" control.Управления.Метод oftype"? Или, возможно, скобки вокруг внешней стороны кнопки.Нажмите кнопку+= и оператор if?

Ralf Meier

@Мик:
Возможно, Вам не следует спрашивать ContainerControl - лучше вы спросите, имеет ли ControlsCollection этого элемента управления значение Count-Value > 0. кроме того, тип для SetClickHandler-метода может быть Control вместо ContainerControl ...

Midi_Mick

Вы правы. GroupBox не наследуется от ContainerControl. Кто бы мог подумать. Обновлю свое решение в соответствии с вашим. Спасибо.

Ralf Meier

Добро пожаловать...

Member 12341536

Эй круто,

теперь он показывает мне имя нажатой кнопки, которая находится в групповом поле. Большое спасибо за это.

Теперь, как я могу получить имя группового поля, содержащего кнопку? На самом деле я хочу и то, и другое одновременно. Я хотел бы иметь печать типа: "Вы нажали на button_X в groupbox_Y" , когда я нажимаю на button_X. Я думаю, что это родительская проблема, но сам не могу понять :(

Большое спасибо за помощь.

Midi_Mick

Да - в случае щелчка просто проверьте отправителя ((Control)).Свойство parent. Это будет любой элемент управления, содержащий элемент управления, который был нажат, так что вы можете получить ((Control)sender).Parent.Name или что там еще. Обратите внимание, что для элементов управления, которые находятся непосредственно в форме, это будет сама форма - вы можете проверить это.

Member 12341536

Большое спасибо, что это работает.
Очень ценю это.

Member 12341536

это нормально ... это система.Диагностика.Процесс.GetCurrentProcess (). MainWindowTitle.Метод toString()

Спасибо снова.