【问题标题】:utility class vs subclassing .net controls实用程序类与子类化 .net 控件
【发布时间】:2009-06-24 13:59:35
【问题描述】:

我想重用我编写的一些代码来向 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 并调用上面的代码)

【问题讨论】:

    标签: c# datagridview controls subclassing


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        如果您使用的是 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
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-06-17
          • 1970-01-01
          • 2012-04-26
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多