2011-02-18 69 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