Задать вопрос
@VavilonBase

WinForms как сделать обработчик событий, который ссылается на обобщенный метод?

Всем привет. Вопрос заключается в следующей, есть такой обобщенный метод:
private void ClickOnReferences<T>(object sender, EventArgs e)
            where T: Form, new()

        {
            string name = ((ToolStripMenuItem)sender).Name;
            if (!CheckMdiChildrenInMdiContainer(name))
            {
                var form = new T();
                form.MdiParent = this;
                form.Name = name;
                form.Show();
            }
        }


Необходимо на него подписать несколько обработчиков событий по клику
Я делал так
this.Students.Click += new System.EventHandler(this.ClickOnReferences<StudentsForm>);

Если выполнить сборку, то после сохранения он станет выглядить так
this.Students.Click += new System.EventHandler(this.ClickOnReferences);

И начнет выдавать ошибку, что нужно явно определить тип аргумента
Может я что неправильно делаю? У меня следующая суть задания, нужно при клике на определенный ToolStripMenuItem открывать определенную форму, сначала делал для каждого itemа свой обработчик и все работало, но решил сделать обобщенный и наткнулся на такую особенность. Так же, если вместо сборки запустить приложение, то все будет работать нормально, но дальше ситуацию повторяется
  • Вопрос задан
  • 280 просмотров
Подписаться 2 Средний 3 комментария
Решения вопроса 1
yarosroman
@yarosroman Куратор тега C#
C# the best
public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            button1.Click += new EventHandler(button1_Click<List<object>>);
            button2.Click += new EventHandler(button1_Click<object>);
        }

        private void button1_Click<T>(object sender, EventArgs e) where T: new()
        {
            var o = new T();
            MessageBox.Show(o.GetType().FullName);
        }
    }

Вот набросал похожее, ничего не исчезает, проект WinForms. Запускал, сохоанял, отчищал, пересобирал проект, все на месте. VS19. Установите последнюю студию или все обновы на нее.

ЗЫ: Конечно такое решение неплохо (Хотя на WPF гораздо элегантнее делается, без всякого ручного присвоения событий).
Вариант 2. если глюк останется
public partial class Form1 : Form
    {
        private Dictionary<string, Type> _forms = new Dictionary<string, Type>();
        public Form1()
        {
            InitializeComponent();
            _forms.Add("button1", typeof(Form));
            _forms.Add("button2", typeof(Form));
        }

        private void button1_Click(object sender, EventArgs e)
        {
            var name = (sender as Button).Name;
            Form form = (Form)Activator.CreateInstance(_forms[name]);
            form.Show();
        }
    }
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы