Как получить атрибут из неуказанного объекта?

#c# #winforms #button

#c# #winforms #кнопка

Вопрос:

Моя программа динамически создает несколько кнопок во время выполнения. Все они привязываются к обработчику событий, который ссылается на один и тот же метод. Как узнать, какая кнопка была нажата при выполнении метода? Я попытался использовать sender.Name , потому что отправитель объекта — это кнопка во время выполнения, но она не компилируется.

     List<Button> buttons = new List<Button>();

    private void Form1_Load(object sender, EventArgs e)
    {
        for (int i = 1; i < 3; i  )
        {
            buttons.Add(new Button() { Name = "btn"   i });
            buttons.Last().Click  = new EventHandler(btn_Click);
        }            
    }
    public void btn_Click(object sender, EventArgs e)
    {
        MessageBox.Show(sender.Name   " is clicked");
    }
 

Комментарии:

1. Вы можете привести sender к Button : ((Button)sender).Name

2. Вы также можете использовать лямбда-выражение для захвата, например button.Click = (o, e) => MessageBox.Show($"{button.Name} is clicked");

3. Вы имеете в виду свойство , а не атрибут ? Если вы имеете в виду атрибут, можете ли вы показать пример атрибута, который вы хотите найти?

Ответ №1:

Вы на правильном пути.

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

  public void btn_Click(object sender, EventArgs e)
 {    
     Button senderButton = (Button)sender;
     MessageBox.Show(senderButton.Name   " is clicked");
 }