Как я могу получить имя текущего элемента управления для динамического назначения контрольного текста? - PullRequest
0 голосов
/ 30 июля 2010

Не вдаваясь в подробности о том, чего я пытаюсь достичь, возможно ли (и если да, то как) я могу ссылаться на объект, имя которого я не знаю?Например, я хочу сказать что-то вроде:

someButton.Text = someButton.Name;

Но с правой стороны я не хочу указывать имя объекта.Так что я действительно хотел бы сделать что-то вроде:

someButton.Text = currentButton.Name;
otherButton.Text = currentButton.Name;

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

Обновление: (Я использую Windows Forms.) Я надеялся, что программа каким-то образом узнает, чтоконтроль, о котором я говорил (текущий), немного похож на ссылку this.Поэтому мне не нужно было передавать конкретный объект, если я собираюсь сделать это, я, вероятно, мог бы просто пропустить строку.Я надеялся вставить одну и ту же строку кода, вызывающую метод, каждый раз, когда захотел.Я подозреваю, что я просто ленивый ... и то, что я хочу сделать, смешно.

И нет никакого связанного события для элемента управления.

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

Ответы [ 2 ]

1 голос
/ 30 июля 2010

Как вы определяете «текущую» кнопку?

Была ли она просто нажата?Используйте аргумент sender для обработчика событий Click (и приведите его к Button).

Вы имеете в виду тот, который имеет фокус?Прочитайте свойство ActiveControl (и приведите его к Button).

РЕДАКТИРОВАТЬ: подождите, под текущая кнопка, которую вы имеете в виду на левой стороне оператора присваивания?Если вы хотите выполнить какую-либо операцию с множеством разных кнопок, вы можете определенно избегать называть каждую кнопку несколько раз.Вот пример:

foreach(Button currentButton in new Button[] { thisButton, thatButton, otherButton, yetAnotherButton })
{
    currentButton.Text = currentButton.Name;
}

или

Action<Button> copyName = (currentButton) => currentButton.Text = currentButton.Name;
copyName(thisButton);
copyName(thatButton);
copyName(otherButton);
copyName(yetAnotherButton);
0 голосов
/ 30 июля 2010

Используйте рефлексию.

Imports System.Reflection

Public Function GetName(b as Button) as String
  Dim t As Type = b.GetType()
  Dim prop As PropertyInfo = t.GetProperty("Name")
  Return prop.GetValue(b, Nothing).ToString()
End Function

В C # я думаю, что это так:

using System.Reflection;

public string GetName(Button b)
{
    Type t = b.GetType();
    PropertyInfo prop = t.GetProperty("Name");
    return prop.GetValue(b, null).ToString();
}
...