Утилита класса против подклассов. NET управления - PullRequest
5 голосов
/ 24 июня 2009

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

public class
MyGrid
{
    private DataGridView m_dg;

    public MyGrid(DataGridView dg)
    {
        m_dg = dg;
        m_dg.RowHeadersVisible = false;
        m_dg.SortCompare += new DataGridViewSortCompareEventHandler(m_dg_SortCompare);
    }

    void m_dg_SortCompare(object sender, DataGridViewSortCompareEventArgs e)
    {
        // do custom sorting here
    }
}

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

MyGrid g1 = new MyGrid(dataGridView1);
MyGrid g2 = new MyGrid(dataGridView2);

и т. Д. какие недостатки у этого подхода? кажется, что большая часть кода будет одинаковой, разница в том, как создать экземпляр расширенной сетки (перетащите подклассный элемент управления в форму против перетаскивания простого представления данных и вызовите код выше)

Ответы [ 3 ]

3 голосов
/ 24 июня 2009

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

Ваш подход к служебному классу (с использованием DataGridView в конструкторе) является надежным подходом.

1 голос
/ 24 июня 2009

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

static class GridExtMethods
    {
        public static void SortAsICommand(this MyGrid grid)
        {
            //grid.Prop = value; possible
            grid.Sort += MyCustomSort;
        }
        static void MyCustomSort(object sender, SortEventArgs evtArgs)
        {
            Console.WriteLine("Sort {0} and {1}", evtArgs.First, evtArgs.Second);
        }
    }

....

static void Main()
{
   var grid = new MyGrid(10,20);
   grid.SortAsICommand();

   //grid.RaiseEvent(); do something that raises the event
}
1 голос
/ 24 июня 2009

Единственный недостаток служебного класса - потеря поддержки дизайнера. Это означает, что если вы подклассифицируете элемент управления, когда вы добавляете его в конструктор, любые изменения, которые вы делаете в конструкторе вашего унаследованного элемента управления, будут отображаться в конструкторе. Кроме того, если вы хотите добавить к нему некоторые свойства, они появятся в окне свойств, что придаст ему еще большую гибкость. Если поддержка дизайнера для вас не имеет значения, то я не вижу никаких других недостатков для служебного класса.

...