2013-02-10 55 views
1

我正在使用以下兩種方法來保存有關DataGridView和ListView的列信息。如何編寫一個可以將DataGridView或ListView作爲輸入的方法?

我注意到方法都非常相似,其實我用的是相同的數據結構存儲在列設置。我存儲每列的屬性之類的東西,可見,寬度的DisplayIndex

哪有我重新寫這個,所以我有一個可以處理DataGridView或ListView的函數?

我想過調查DataGridView和ListView是繼承一個普通的類還是實現一個通用接口 - 但我不知道如何找到它。

另外我想過擴展每個類來實現一個通用接口......但我不知道如何繼續。

public void SaveDataGridView (DataGridView view) 
{ 
     foreach (DataGridViewColumn col in view.Columns) 
     { 
      // save properties  
     } 
} 

public void SaveDataListView(ListView view) 
{ 
     foreach (ColumnHeader col in view.Columns) 
     { 
      // save properties 
     } 
} 
+2

我會說你亂運氣。我看着類繼承樹,那裏沒有希望。如果您要將列狀態保存爲循環內的常用類型,那就很好了。我會打電話給它一天,並找到應用程序的其他部分「改善」。 :) – John 2013-02-10 02:16:27

+0

'// save properties'裏面是什麼? – abatishchev 2013-02-10 02:20:55

+0

你爲什麼要循環Columns集合?爲什麼不是[Rows](http://msdn.microsoft.com/zh-cn/library/system.windows.forms.datagridview.rows.aspx)和[Items](http://msdn.microsoft.com/zh-cn/ -us/library/system.windows.forms.listview.items.aspx)?他們都只實現'ILIst'。 – abatishchev 2013-02-10 02:27:21

回答

0

它們都從Control class繼承。所以,你可以寫一個函數是這樣的:

public void SaveView(Control view) 
{ 
    if(view is DataGridView) 
    { 
     //stuff 
    } 
    if(view is ListView) 
    { 
     //stuff 
    } 
} 

控制是非常通用的,所以這個功能並沒有做出很大的意義,因爲有一噸的有效參數。不幸的是,網格和列表不能繼承更具體的父類。

+0

它與OP的代碼幾乎相同。他可以同時命名這兩種方法,使它們成爲單一方法的重載,因此您的代碼將完全平等。 – abatishchev 2013-02-10 02:25:39

0

我清盤做以下

interface IView 
{ 
    void SaveView(Control control); 
} 

public class GridViewHelper : IView 
{ 
    public void SaveView(Control control) 
    { 
     var view = (DataGridView)control; 
     foreach (DataGridViewColumn col in view.Columns) 
     { 
      // save properties 
     } 
    } 
} 

public class ListViewHelper : IView 
{ 

    public void SaveView(Control control) 
    { 
     var view = (ListView)control; 
     foreach (ColumnHeader col in view.Columns) 
     { 
      // save properties 
     } 
    } 
} 
相關問題