C# I';我已将表单名称存储在数据库中。现在我想使用这些名称加载表单

C# I';我已将表单名称存储在数据库中。现在我想使用这些名称加载表单,c#,C#,我已将表单名称存储在数据库中。现在我想使用这些名称加载表单。 以下是我的表格结构: frmID, Item_Name, formName 这是我的密码: private void treeView1_AfterSelect(object sender, TreeViewEventArgs e) { //TreeNode node = treeView1.SelectedNode; string item = Convert.ToString(tr

我已将表单名称存储在数据库中。现在我想使用这些名称加载表单。 以下是我的表格结构:

frmID, Item_Name, formName
这是我的密码:

    private void treeView1_AfterSelect(object sender, TreeViewEventArgs e)
    {
        //TreeNode node = treeView1.SelectedNode;
        string item = Convert.ToString(treeView1.SelectedNode);

        int index = item.IndexOf(" ");
        if (index > 0)
            item = item.Substring(index + 1); 
        //MessageBox.Show(item);
        var selectedFRM = from Menu in dbdata.Menus
                          where Menu.Item_Name == item
                          select Menu;
        foreach (var pick in selectedFRM.Take(1))
        {
            string sel = pick.Form_Name;
            Assembly asm = typeof(Form).Assembly;
            Type type = asm.GetType(sel);

            string df = Convert.ToString(type);
            MessageBox.Show(df);
            AssemblyName assemName = asm.GetName();
            MessageBox.Show(assemName.Name);
            try
            {
            Form frmChk = (Form)Activator.CreateInstance(type);                
                frmChk.Show();
            }
            catch (Exception)
            {
                MessageBox.Show("Error in loading form");
            }
           // MessageBox.Show(sel);
        }

最多
Assembly asm=typeof(Form).Assembly代码工作正常。如何使用数据库中的“formName”加载表单我怀疑这就是问题所在:

Assembly asm = typeof(Form).Assembly;
Type type = asm.GetType(sel);
该程序集将是
System.Windows.Forms
程序集-它显然不包括您的特定表单。只需使用您知道在正确程序集中的任何表单,而不是
表单

// Or whatever you know about, of course...
Assembly asm = typeof(LoginForm).Assembly;
请注意,名称仍然需要是命名空间限定名称


另一种(更灵活的)替代方法是存储类型的程序集限定名称,您可以通过以下方式获得该名称。然后您可以只使用
Type.GetType(aqName)
——这意味着如果您将表单拆分到多个程序集,那么您的代码仍然可以工作。

我想这就是问题所在:

Assembly asm = typeof(Form).Assembly;
Type type = asm.GetType(sel);
该程序集将是
System.Windows.Forms
程序集-它显然不包括您的特定表单。只需使用您知道在正确程序集中的任何表单,而不是
表单

// Or whatever you know about, of course...
Assembly asm = typeof(LoginForm).Assembly;
请注意,名称仍然需要是命名空间限定名称


另一种(更灵活的)替代方法是存储类型的程序集限定名称,您可以通过以下方式获得该名称。然后您可以只使用
Type.GetType(aqName)
——这意味着如果您将表单拆分到多个程序集,您的代码仍然可以工作。

我找到了解决方案。
Type-Type=asm.GetType(sel)行应该这样更正

Type type = asm.GetType("WindowsFormsApplication6." + sel);
这意味着

Type type = asm.GetType("Namespace.Class");

我找到了解决办法。
Type-Type=asm.GetType(sel)行应该这样更正

Type type = asm.GetType("WindowsFormsApplication6." + sel);
这意味着

Type type = asm.GetType("Namespace.Class");

你需要重新格式化你的问题,使它更容易阅读。你还需要问一个实际的问题。你已经说了它的作用有多大,但没有说它不起作用时会发生什么……你需要重新格式化你的问题,使其更容易阅读。你还需要问一个实际的问题。您已经说过它工作了多远,但没有说它不工作时会发生什么……那么,如果没有“Type Type=asm.GetType(sel);“我如何创建表单的Instance并加载它?”我如何加载该foarm?@user1508417:不清楚您的意思。如果可以使用已知类型找到正确的程序集,那么您仍然使用
asm.GetType(…)
,或者使用
type.GetType()
而不是
assembly.GetType
。实际上,我想要的是使用数据库加载特定的表单。在这个代码中,我不能这样做。那我该怎么做呢?表格字段是formName。(我还强烈建议您遵循.NET命名约定,并使您的类型名称更具描述性-例如,
DisplayEmployeeForm
)那么,如果没有“type type=asm.GetType(sel);“我如何创建表单的Instance并加载它?”我如何加载该FOARM?user1508417:不清楚您的意思。如果可以使用已知类型找到正确的程序集,那么您仍然使用
asm.GetType(…)
,或者使用
type.GetType()
而不是
assembly.GetType
。实际上,我想要的是使用数据库加载特定的表单。在这个代码中,我不能这样做。那我该怎么做呢?表格字段是formName。(我还强烈建议您遵循.NET命名约定,并使类型名称更具描述性-例如,
DisplayEmployeeForm