2017-08-14 82 views
-1

這樣一個奇怪的情況出現在我面前。這是事情。 如果我會在PHP或其他編程語言中這樣做,它會很容易,但在C#中,我不知道如何實現這一點。C#創建,檢查,循環對象

我的問題的簡要說明:

  1. 我在C#與組合框的用戶窗體。在這個組合框中,我擁有與數據庫中一樣多的項目 - >所以它在應用程序的開始處動態填充
  2. 每個項目應該代表單個UserForm。所以這裏是問題所在,如果用戶選擇了項目並且點擊按鈕檢查,則應該在該用戶窗體創建時觸發,如果沒有,則必須創建新的(object?)用戶窗體。通常我會刪除並重新創建新的表單,每次用戶選擇新的選項,但我想保留這些用戶表單,並創建一次,然後只隱藏或顯示它們,所以textinputs等等應用程序將運行時仍然填充(但我沒有在性能方面,應用程序開始時的15-20個用戶窗體是可以的)。

所以我在想什麼做的和我的嘗試:

  1. 我想從組合框中選擇使用項目的名稱,並把它作爲一個對象(用戶窗體)的名稱。 (也執行檢查,如果它已經存在,然後創建) - >顯然這是不可能的在C#中使用字符串變量作爲對象名稱

  2. 我GOOGLE了關於字典,但我可以存儲整個用戶窗體嗎?

  3. 另外我正在考慮在開始時創建所有15-20個用戶表單,然後遍歷它們並顯示或隱藏它們。

任何想法?

回答

2

這是一個緩存問題。你想緩存表單。

所以首先你需要一個緩存容器,例如

var cache = new List<UserForm>(); 

然後,需要一個表單時,你需要一個特殊的方法來搜索緩存,如果需要添加到它。因爲有一種以上類型的表格,你要在這裏使用泛型:

T GetOrCreateForm<T> where T: UserForm, new() 
{ 
    UserForm f = cache.OfType<T>().FirstOrDefault(); //Search cache 
    if (f == default(T))        //If not found, 
    { 
     f = new T();         //Create it anew 
     cache.Add(f);         //and add it to the cache 
    } 
    return f;           //return the form we just created/retrieved 
} 

你可以這樣調用這個方法,傳遞形式的所需類型:

var form1 = GetOrCreateForm<Form1>(); 
form1.Show(); 

以上假定列表中每行有一種形式(一類)。如果你實際上有一個常見的表格類別,但是它們有別於其他的表達方式(例如,也許每個表格都有一個在運行時設置的獨特Name屬性),那麼你需要一個字典來區分表格:

var cache = new Dictionary<string, UserForm>(); 

UserForm GetOrCreateForm(string name) 
{ 
    UserForm f; 
    if (!cache.TryGetValue(name, out f)) 
    { 
     f = new UserForm { Name = name }; 
     cache.Add(name, f); 
    } 
    return f;   
} 


var myForm = GetOrCreateForm("SomeUniqueName"); 
myForm.Show(); 
+0

我個人認爲字典會更適合。如果多個項目共享相同類型的表單會怎麼樣? – JuanR

+0

謝謝John Wu,明天我會試一試,但它看起來非常適合我需要的東西。 @Juan你是什麼意思,相同類型「? –

+0

@Juan,編輯爲適應一種形式/多個實例,假設我們可以通過某些屬性(如「名稱」)區分它們。 –