5

我想重用我编写的一些代码来向 datagridview 添加一些功能。我希望公开默认的 datagridview 属性和事件,所以我不想创建新的自定义组件。所以我尝试编写一个子类,效果很好。但我也想到我可以编写一个独立的实用程序类,它在构造函数中采用一个 datagridview 并以相同的方式设置它。例如

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);

等等。这种方法有什么缺点吗?似乎大部分代码都将是相同的,区别在于您如何实例化扩展网格(将子类控件拖放到表单与拖动普通 datagridview 并调用上面的代码)

4

3 回答 3

3

从长远来看,实用程序类将比子类控件更易于维护,除非您正在做一些比修改排序更重要的事情来扩展 DataGridView。

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

于 2009-06-24T14:03:26.667 回答
1

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

于 2009-06-24T14:15:23.773 回答
1

如果您使用的是 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
}
于 2009-06-24T15:53:08.203 回答