2011-02-28 56 views
2

在我的應用程序中,我有一個DataSet可以保存以不同形式使用的表格,遍及我的應用程序。 爲了能夠形式之間保持併發性,並且不必每次用戶打開一個新的形式,時間從數據庫中獲取數據,我認爲我的數據集作爲一個靜態字段在程序類是這樣的:使用靜態數據集作爲數據源

static class Program 
{ 
    public static CustomDataSet StockDataSet { get; private set; } 

    [STAThread] 
    static void Main() 
    { 
     StockDataSet = new Database.CustomDataSet(); 
     StockDataSet.InitRelations(); 
     StockDataSet.EnforceConstraints = false; 
     StockDataSet.Categories.Fill(); 
     StockDataSet.Suppliers.Fill(); 
     StockDataSet.StockItems.Fill(); 
     StockDataSet.EnforceConstraints = true; 

     Application.EnableVisualStyles(); 
     Application.SetCompatibleTextRenderingDefault(false); 
     Application.Run(new MainWindow()); 
    } 

這使得以編程方式使用DataSet變得非常容易。然而,在設計階段工作會造成挫折感。考試;我有一個綁定到BindingSource的DataGridView。如果我希望能夠在設計時使用DataGridView的列,那麼我必須讓我的自定義DataSet的對象可以在InitializeComponent中的BindingSource中訪問。

我想到的所有解決方法都是相當醜陋的黑客。 就像在Designer.cs中使用虛擬對象來保持設計時愉快一樣,然後將靜態對象分配給包含虛擬對象的字段。之後,重置構造函數中的所有綁定。這必須被認爲是非常糟糕的做法,對嗎?

所以我的問題是這樣的:是不是有一個更優雅,或至少有實際的方法呢? 還是有任何建議的最佳做法與多種形式的數據集一起工作?

編輯
股票庫存與庫存相關。對數據不做重大處理,數據保存在本地服務器上的MySql數據庫中。

+0

我真的希望你不要做任何線程 - 這將是純粹的混亂與靜態數據集 – 2011-02-28 13:06:17

+0

不,沒有線程。幸運的是 – JonC 2011-02-28 13:09:27

回答

2

顯示在運行一個數據源評相應的部分,以及其他在設計時是根本不難看。我認爲在使用DataTables,DataSets和DataGridViews以及設計器時,你所面對的是相當普遍的。如果使用非常簡單的主/表格形式並且不希望超出標準行爲,那麼它是一個很好的工具。

在您描述的場景中,您想要改變這些項目的正常用法,以便您可以在應用程序啓動時預先加載數據。正如你發現的那樣,這會導致你現在不得不自己處理的一些問題。處理該問題的一部分是在運行時將DataSource重置爲新值。這根本不是不雅或不好的做法。

但是,當你開始談論假貨和因性能問題而導致的緩存時,我想知道你是否真的想要一個數據庫。看起來您正在尋找開發一個模型(使用C#對象),您可以根據需要綁定,更新和序列化。雖然我不確定這是否適用於您的設計,但如果這是我的設計(我對您的問題的理解有限),那就是我會做的。即使這樣,數據庫也不是我項目的重要組成部分。我將構建代表我的表格的C#對象,管理這些項目的模型類以及實例化模型並管理其生命週期的工廠。

如果在某一點上,我不得不序列化/互動,/有一個數據庫,我會構建到模型中。

對於我而言,對於優雅而言,更大的問題是如何測試所有這些?如果我在設計時綁定,並且在運行時依靠靜態加載,那麼我的設計阻止了我執行任何類型的單元或基於類的集成測試。如果我將數據庫內容分解成模型,那麼我會將數據管理的注意力分成一個類,我可以將一個接口粘貼到這個類中,這樣我就可以僞造或模擬存根。

0

我會去使用在Designer.cs一個虛擬對象的想法,但使用條件編譯(即#如果DEBUG)

+0

設計師對設計師文件的外觀過於嚴格。它只是刪除條件語句。 – JonC 2011-02-28 14:27:30

0

嘗試使用單例設計模式。

public sealed class DB 
{ 
    private static readonly DB instance = new DB(); 
    public static DB Instance { get { return instance; } } 

    static DB() { } 
    private DB() 
    { 
     StaticData = new DataSet(); 
    } 

    private static DataSet StaticData; 

    public DataTable GetCategoryTable() 
    { 
     // check if the table has been created 
     if(StaticData.Tables["Category"] == null) 
     { 
      // build table (or retrieve from database) 
      DataTable table = new DataTable(); 
      table.TableName = "Category"; 
      table.Columns.Add("ID", typeof(int)); 
      table.Columns.Add("Name", typeof(string)); 
      table.Columns.Add("Description", typeof(string)); 

      table.Rows.Add(1, "Beverages", "Soft drinks, coffees, teas, beers, and ales"); 
      table.Rows.Add(2, "Condiments", "Sweet and savory sauces, relishes, spreads, and seasonings"); 
      table.Rows.Add(3, "Produce", "Dried fruit and bean curd"); 
      table.Rows.Add(4, "Seafood", "Seaweed and fish"); 
      table.Rows.Add(5, "Meat/Poultry", "Prepared meats"); 
      StaticData.Tables.Add(table.Copy()); 

     } 
     return StaticData.Tables["Category"]; 
    } 

    public DataTable GetStatusTable() 
    { 
     // check if the table has been created 
     if(StaticData.Tables["Status"] == null) 
     { 
      // build table (or retrieve from database) 
      DataTable table = new DataTable(); 
      table.TableName = "Status"; 
      table.Columns.Add("ID", typeof(int)); 
      table.Columns.Add("Name", typeof(string)); 
      table.Columns.Add("Description", typeof(string)); 

      table.Rows.Add(1, "Active", "Active"); 
      table.Rows.Add(2, "Retired", "Retired"); 
      StaticData.Tables.Add(table.Copy()); 

     } 
     return StaticData.Tables["Status"]; 
    } 

} 

使用方法如下:

private void Form1_Load(object sender, EventArgs e) 
    { 
     DB db = DB.Instance; 
     dataGridView1.DataSource = db.GetCategoryTable(); 
     dataGridView2.DataSource = db.GetCategoryTable(); 
     dataGridView3.DataSource = db.GetStatusTable(); 
    } 
+0

只要在這裏[單身模式是邪惡](http://blogs.msdn.com/b/scottdensmore/archive/2004/05/25/140827.aspx)[騙子](http://misko.hevery。 (2008/08/17/singletons-are-pathological-liars /),並不是說他們沒有[良好的用途](http://www.craigsefton.com/programming/the-singleton-pattern-is -not惡/) – Amicable 2012-07-24 09:51:09