2011-02-18 173 views
0

,比如我有一个DataGrid,并希望用它做一些数据绑定前和绑定后,像这样:包装器的代码块

dgvTasksDocList.SaveLayoutToFile(); 
sTATUSCHANGESEXTENDEDBindingSource.DataSource = dt; 
dgvTasksDocList.RestoreLayoutFromFile(); 

,我想与所有绑定某些时候情况下添加这样的代码源。有一种简单的方法可以在某些动作之前/之后编写这样的代码(当然,我可以添加这两行,但可能有一些已知的做这种事情的方式)?

+1

到底为什么你认为这些3个系将不会适用于所有情况。如果你想在绑定数据之前和之后做一些事情,那么你必须这样做。这个事实没有别的办法。 – 2011-02-18 13:59:35

回答

0

似乎是AOP的情况下 - http://en.wikipedia.org/wiki/Aspect-oriented_programming

例如与PostSharp你将能够创建一个属性PersistLayout,并将其应用这样的:

[PersistLayout] 
public void BindDataSource(object dt) 
{ 
    sTATUSCHANGESEXTENDEDBindingSource.DataSource = dt; 
} 

然后Postsharp将在编译时间范围源代码来调用您的其他两行。

其他的想法可能是援引sTATUSCHANGESEXTENDEDBindingSource.DataSource属性setter这两个方法,但这一决定需要更多的上下文就知道了。

+1

除了通过使方法保存并加载布局来完成他自己写的内容之外。我没有看到使用PostSharp进行这种简单任务的好处。 – 2011-02-18 14:03:09

+1

@Ramhound - 完全同意。我喜欢AOP/PostSharp,但这就像使用核设备打开一扇门。 – RQDQ 2011-02-18 14:07:40

0
public class MyDGV : DataGridView 
{ 
    public MyDGV() 
    { 
     DataSourceChanged += (s, e) => SaveLayoutToFile(); 
     DataBindingComplete += (s, e) => RestoreLayoutFromFile(); 
    } 
} 
0

只是扩展方法制成的,所以现在它看起来像:

dgvTasksDocList.BindSourceAndSaveLayouts(sTATUSCHANGESEXTENDEDBindingSource, dt); 

甚至:

dgvTasksDocList.BindSourceAndSaveLayouts(dt); 

因为dgvTasksDocList.DataSource可强制转换为BindingSource(相信我必须提供BindingSource