我想重用一些我写的代码来为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);
等等。这种方法的任何缺点?看起来大部分代码都是一样的,不同之处在于如何实例化扩展网格(将子类控件拖放到表单中,拖动普通数据网格并调用上面的代码)
答案 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
}