Как найти класс элемента управления, когда он определен в другом классе

#c# #winforms

#c# #winforms

Вопрос:

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

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

1. Мне трудно понять ваш вопрос. Как вы думаете, вы могли бы нажать кнопку редактирования и попытаться немного прояснить это, могут помочь маркированные пункты.

2. Также могут помочь новые строки (клавиша ввода). И код понятнее, чем английский.

3. Я дал вам хороший код для использования, но на самом деле вам следует пересмотреть свой дизайн. Зачем в классах кнопки? Являются ли классы производными от кнопок?

Ответ №1:

В вашем классе назначьте обработчики событий для события click на кнопках, чтобы при добавлении их в форму и щелчке по ним обработчик событий запускался внутри вашего класса, чтобы вы могли получить доступ к свойствам класса.

В противном случае добавьте ссылку на класс к свойству тега кнопки.

    class Class1
    {

        public Button MyButton { get; set; }

        public Class1()
        {
            MyButton = new Button();
            MyButton.Click  = new EventHandler(MyButton_Click);
        }

        void MyButton_Click(object sender, EventArgs e)
        {
            //Do code here
        }

    }

public partial class Form1 : Form
    {
        Class1 c1 = new Class1();

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            c1.MyButton.Width = 100;
            c1.MyButton.Height = 100;
            c1.MyButton.Top = 0;
            c1.MyButton.Left = 0;
            this.Controls.Add(c1.MyButton);


        }
  

или

 class Class1 : IButtonClass
    {

        public Button MyButton { get; set; }

        public Class1()
        {
            MyButton = new Button();
            MyButton.Tag = this;        
        }

        public void DoSoemthing()
        {
            //Do something
        }

    }

    interface IButtonClass
    {
        void DoSoemthing();
    }

public partial class Form1 : Form
    {
        Class1 c1 = new Class1();

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            c1.MyButton.Width = 100;
            c1.MyButton.Height = 100;
            c1.MyButton.Top = 0;
            c1.MyButton.Left = 0;
            this.Controls.Add(c1.MyButton);

            c1.MyButton.Click  = new EventHandler(MyButton_Click);
        }

    void MyButton_Click(object sender, EventArgs e)
    {
        IButtonClass c = ((Button)sender).Tag as IButtonClass;
        c.DoSoemthing();
    }
}
  

Ответ №2:

В событии нажатия кнопки вы можете попробовать

     void button_Click(object sender, EventArgs e)
    {
        Console.WriteLine((sender as Button).Parent.Name);
    }
  

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

1. неправильно, здесь отображается ‘Form1’ вместо имени класса. отправитель — это ОТПРАВИТЕЛЬ события, а не родительский элемент управления

2. @DustinDavis для нажатия кнопки отправителем является кнопка, а кнопка обычно присутствует в родительском контейнере как форма, которая может быть классом операционной системы.

3. Из того, что я прочитал, он хочет класс, в котором содержится кнопка, а не форма. Родительский элемент будет установлен контейнером (form1), а не классом, в котором он находится.

4. опять же, это трудно читать, так что, возможно, вы правы, и я ухожу