2014-10-22 98 views
0

我有這樣的代碼,在我讀書,我在GridView反序列化的數據,讓我們將其命名爲FormReadDatabases 它被填充像這樣:數據保存在內存

xmlData = (xml.ServiceConfig)serializer.Deserialize(reader); 
dataGridView1.DataSource = xmlData.Databases; 

然後在網格的每一行中我有一個按鈕「表」
我點擊它一種新的形式出現後FormReadTables

它被填充像這樣:

BindingList<xml.Table> table = new BindingList<xml.Table>(); 
dataGridView4.DataSource = table; 

然後我有一個按鈕,它可以幫助我添加一個新表,它工作正常,新行出現在FormReadTables,但是當我關閉表單並且我現在在FormReadDatabases,如果我再次單擊Table按鈕時更改沒有保存。

任何想法如何避免這種情況?

+0

'靜態'或一些運行時管理器(又名IoC單件)?只是在說'... – 2014-10-22 09:19:59

+0

親愛的@AndreasNiedermair感謝您的答覆,但我是一個初學者,這是什麼意思? – Perf 2014-10-22 09:24:44

+0

你使用哪個UI框架? – 2014-10-22 09:29:35

回答

1

這應該是簡單的,數據綁定需要使用,可容納即使形式打開或關閉值的機制發生:

第一種方式可以如下使用靜態類型:

static BindingList<xml.Table> table; 

public BindingList<xml.Table> FetchTable() 
{ 
if(table == null) 
{ 
table = new BindingList<xml.Table>(); 
} 
return table 
} 

dataGridView4.DataSource = FetchTable(); 

有一個問題在這裏,如果表單能有什麼多個實例比可以訪問靜態變量,然後同時更新表鍵入需要鎖定/同步

另一種選擇是表格類型是主窗體的一部分,它加載子窗體並在子窗體的構造函數中獲取父窗體的實例,該窗體使用更新並在關閉子窗體後保留。這也將需要同步的多用戶/線程訪問

public class ParentForm 
{ 
public BindingList<xml.Table> table = new BindingList<xml.Table>(); 
} 

public class ChildForm 
{ 
ParentForm localPf; 
pulic ChildForm(ParentForm pf) 
{ 
localPf = pf; 
} 
dataGridView4.DataSource = localPf.table; 
} 

野老到父窗體對象的表變量的任何變化將持續直到點父窗體是在內存中,但請注意這種實現還不是線程安全的

1

每次窗體打開時,都會創建一個新的BindingList。

BindingList<xml.Table> table = new BindingList<xml.Table>(); 

相反,讓其他頁面包含一個變量,當你'新'的另一種形式,傳入變量。

在打開的窗體上採取的操作是byref,因此將更新您的宿主窗體變量。這意味着下次打開表單時,您傳遞給它的變量將已經存儲以前的更改。根據要求

例子:

我沒有我的WinForms手頭的環境,但是這顯示了重要的概念。

namespace Bob 
{ 
    public class FormLucy 
    { 
     private BindingList<xml.Table> table = new BindingList<xml.Table>(); 

     // your form stuff.. 

     protected void ButtonClick(object sender, EventArgs e) 
     { 
      var frm = new FormTracy(table); 

      // init your forms properties, position etc 

      fmr.ShowDialog(); 
     } 
    } 
} 
+0

這是我需要的,請你給我一個例子代碼,因爲我是這個新的 – Perf 2014-10-22 09:25:41

+0

但是,如果其他頁面不是*靜態*,也可以打開和關閉......你是否從最外面的頁面注入'table'變量?而且,如果OP使用ASP.NET而不是WinForms? – 2014-10-22 09:28:04

+0

@AndreasNiedermair是的,每一頁都可以打開和關閉,所以我需要保存在內存中,我正在用WinForms工作 – Perf 2014-10-22 09:31:44