0

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

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);
        }

uptoAssembly asm = typeof(Form).Assembly;代码工作正常。如何使用数据库中的“formName”加载表单

4

2 回答 2

5

这就是问题所在,我怀疑:

Assembly asm = typeof(Form).Assembly;
Type type = asm.GetType(sel);

该程序集将是System.Windows.Forms程序集-显然不包括您的特定表格。只需使用您知道在正确程序集中的任何Form形式,而不是:

// Or whatever you know about, of course...
Assembly asm = typeof(LoginForm).Assembly;

请注意,该名称仍需要是命名空间限定的名称。

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

于 2012-07-07T08:09:43.513 回答
0

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

Type type = asm.GetType("WindowsFormsApplication6." + sel);

这意味着

Type type = asm.GetType("Namespace.Class");
于 2012-07-08T13:00:36.613 回答