http://q.cnblogs.com/q/35451/CSDN 连张图片都上传不了,真是悲催。
烦请各位移步博 客 园帮忙看看这个问题,万分感谢。

解决方案 »

  1.   

    本帖最后由 caozhy 于 2012-04-27 12:10:25 编辑
      

  2.   


    Caozhy:你说的这个自己注册自己的步骤是在什么地方完成呢?是在我这个工具栏的加载事件里面吗?还是?
      

  3.   


    我数据库里面的每一个菜单都是对应了一个窗体名称的,
    其实我的想法是写一个公共的函数,然后点击图标的时候传入一个窗体名称,
    Caozhy的方法还是比较好的,只是我感觉还没有完全理解。
      

  4.   

    这个需要用到assembly和interface的内容。给你一段我自己的代码吧,我一直这么用。private void initializeAssemblys()
            {
                List<string> FileNames = getFileFullNames("FunModules");
                Assembly assembly = null;
                IChildModule childModule = null;            foreach (string fileName in FileNames)
                {
                    try
                    {
                        assembly = Assembly.LoadFile(fileName);
                        string assemblyString = getNameFromFull(fileName);                    Type childModuleType = assembly.GetType(assemblyString + "." + assemblyString + "Assembly");
                        if (childModuleType == null) continue;
                        if (!childModuleType.GetType().IsInstanceOfType(typeof(IChildModule))) continue;
                        childModule = childModuleType.GetConstructor(new Type[] { }).Invoke(new object[] { }) as IChildModule;
                        childModule.childService.Connection = MainForm.service.Connection;
                        childModule.LoginUser = MainForm.LoginUser;
                        childModules.Add(childModule);
                    }
                    catch (FileLoadException ex)
                    {
                        onChildModuleErr(new Exception(fileName + " load err," + ex.Message));
                    }
                    catch (Exception ex)
                    {
                        onChildModuleErr(ex);
                    }
                }
            }上面的代码是动态加载DLL,当然这些动态加载的DLL是继承了IChildModule接口的。
    下面是接口的定义:public interface IChildModule
        {
            Dictionary<string, Type> childForms { get; }
            ChildModuleService childService { get; }
            Data_LoginContent LoginUser { get; set; }
            TreeNodeInfo moduleTree { get; }
        }接口中定义有TreeNodeInfo 类,这个类就是帮助你动态生成树节点的类,这个类只有属性,这些属性都是树节点需要的。
    树控件加载了之后,每个节点的tag都设置为TreeNodeInfo 的对象。TreeNodeInfo 中有一个重要的属性是这个节点对应的窗体的Type。
    那么点击树节点的时候,我们可以获得这个TreeNodeInfo 对象,根据这个对象的窗体的Type来实例化窗体,展现。也许上面你看糊涂了,我解释一下。
    我做的DLL都是继承了IChildModule接口的,所以所有的DLL都有TreeNodeInfo 对象,TreeNodeInfo 对象中有属性来保存对应的窗体的Type。这个Type是需要你自己手动在DLL中做的。
    我也不知道如何来解释了你自己想想吧,也许我的编程方式跟你不太一样。