Subrata.In Ответов: 1

Управляющее событие из базового класса


У меня есть несколько DataGridView на нескольких формах. Когда пользователь выбирает строки, он покажет некоторые данные/результат, но есть условие. Если это условие проходит, то отображается только результат.

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

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

Заранее спасибо.

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

/*Inherited base Class*/
public partial class MyDataGridView : DataGridView
{
  public bool ShowData = new bool();
  public new event System.EventHandler SelectionChanged;

  public CustomDataGridView()
  {
     InitializeComponent();
  }

  protected override void base_SelectionChanged(object sender, EventArgs e)
  {
     if(ShowData)
     {
       //Want to raise/pass/trigger event on child class
       if (this.SelectionChanged != null) this.SelectionChanged(sender, e);
     }
     else
     {
       //do not want to raise/pass/trigger event on child class
     }
  }

}

/*On Win Form*/
public partial class Form1 : Form
{
  public Form1()
  {
    InitializeComponent();
  }

  private void MyDataGridView1_SelectionChanged(object sender, EventArgs e)
  {
    MessageBox.Show("My Result........");
  }
}

1 Ответов

Рейтинг:
2

OriginalGriff

Проблема заключается в том, что методы базового класса вообще не выполняются, если они были переопределены в производном классе, если они явно не вызываются из него:

    public static void Main()
        {
        Base b = new Derived();
        b.MyMethod();
        Console.WriteLine();
        }
    }
public abstract class Base
    {
    public virtual void MyMethod()
        {
        Console.WriteLine("Base");
        }
    }
public class Derived : Base
    {
    public override void MyMethod()
        {
        Console.WriteLine("Derived");
        }
    }
Просто дам вам "производную" - вам нужно явно вызвать базовую версию:
    public static void Main()
        {
        Base b = new Derived();
        b.MyMethod();
        Console.WriteLine();
        }
    }
public abstract class Base
    {
    public virtual void MyMethod()
        {
        Console.WriteLine("Base");
        }
    }
public class Derived : Base
    {
    public override void MyMethod()
        {
        base.MyMethod();
        Console.WriteLine("Derived");
        }
    }
чтобы получить "базовое" и "производное".
А это значит, что то, что вы хотите сделать, не сработает!

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

Не думайте, что если вы создадите абстрактный UserControl, вы не сможете редактировать его непосредственно в конструкторе без добавления конкретной производной реализации между абстрактным классом и вашей производной реализацией. Если вы попытаетесь, дизайнер откажется показывать форму.


Subrata.In

Спасибо за ваш ответ. Вы правы, метод базового класса не выполняется. Я изменился : это.SelectionChanged += новая система.EventHandler(this.base_SelectionChanged) -> base.SelectionChanged += новая система.EventHandler(this.base_SelectionChanged)

OriginalGriff

Это не остановит события в производном классе, если они будут добавлены в список - помните, что обработчик событий является частью цепочки делегатов, которые выполняются при запуске события.
Единственный способ предотвратить цепочку производных классов в коллекцию обработчиков - это запретить им получать доступ к базовому событию, а это означает инкапсуляцию DGV. Вы можете (вероятно, я еще не пробовал) скрыть событие от Intellisense точно так же, как вы можете скрыть свойства и методы:
https://www.codeproject.com/Tips/56028/Hiding-Inherited-Properties-and-Tasks-in-Derived-C
Но это не остановит ввод имени и компиляцию без проблем.

Subrata.In

Большое вам спасибо за ваш ответ. Это поможет мне в будущем...

OriginalGriff

Всегда пожалуйста!