实用程序类与子类.net控件

时间:2009-06-24 13:59:36

标签: c# datagridview controls subclassing

我想重用一些我写的代码来为datagridview添加一些功能。我希望公开默认的datagridview属性和事件,因此我不想创建新的自定义组件。所以我尝试编写一个子类,工作正常。但我也想到我可以编写一个独立的实用程序类,它在构造函数中获取datagridview并以相同的方式设置它。 e.g。

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 个答案:

答案 0 :(得分:3)

从长远来看,实用程序类比子类控件更易于维护,除非你做的是扩展DataGridView而不是修改排序。

实用程序类的方法(在构造函数中使用DataGridView)是一种可靠的方法。

答案 1 :(得分:1)

实用程序类的唯一缺点是您失去了设计器支持。这意味着,如果您将控件子类化,则在将其添加到设计器时,您在继承控件的构造函数中所做的任何更改都将显示在设计器中。此外,如果要向其添加一些属性,它们将显示在属性窗口中,从而为其提供更大的灵活性。如果设计师支持对您无关紧要,那么我没有看到实用程序类的任何其他缺点。

答案 2 :(得分:1)

如果您使用的是C#3,extension methods可能值得一看。看起来你正在为一个类型添加行为,你希望它是开箱即用的。

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
}