C#创建,检查,循环对象

时间:2017-08-14 20:25:58

标签: c# winforms combobox

这种奇怪的情况出现在我面前。这就是事情。 如果我在PHP或其他编程语言中这样做很容易,但在C#中我不知道如何实现这一点。

我的问题的简要描述:

  1. 我在C#中有一个带有组合框的UserForm。在这个组合框中,我有与数据库中一样多的项目 - >所以它在应用程序的开始时动态填充
  2. 每个项目应代表单个UserForm。所以这就是问题所在,如果用户选择了项目并且点击了按钮检查,那么如果创建了该用户窗体,则应该触发,如果不是,则必须创建新的(对象?)用户窗体。通常我会在每次用户选择新选项时删除并重新创建新表单,但我想保留这些Userforms并创建它们一次,然后只隐藏它们或显示它们,因此textinputs等在应用程序运行时仍保持填充(但我不要创建它15-20应用程序开始时的UserForms在性能方面是可以的。)
  3. 所以我在考虑做什么以及我尝试了什么:

    1. 我想使用组合框中所选项目的名称,并将其用作对象(UserForm)名称。 (还要在创建前检查它是否已存在) - >显然,在C#中不可能将字符串变量用作对象名称

    2. 我搜索了字典,但是我可以在那里存储整个用户表单吗?

    3. 此外,我还考虑在开始时创建所有15-20个用户表单,然后循环显示它们并显示或隐藏它们。

    4. 有什么想法吗?

1 个答案:

答案 0 :(得分: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();