C#打开窗体有问

allen0118 2012-04-27 11:54:05
http://q.cnblogs.com/q/35451/

CSDN 连张图片都上传不了,真是悲催。
烦请各位移步博 客 园帮忙看看这个问题,万分感谢。
...全文
130 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
kkgoose 2012-04-27
  • 打赏
  • 举报
回复
把函数当做参数传递,在使用函数前,定义函数并把它加入到楼上说的函数字典里,这样通过函数字典就知道要调用哪个方法了
threenewbee 2012-04-27
  • 打赏
  • 举报
回复
每个功能自己初始化的时候去注册。
allen0118 2012-04-27
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]
不用写死啊,每个功能自己去注册自己。
[/Quote]

Caozhy:

你说的这个自己注册自己的步骤是在什么地方完成呢?是在我这个工具栏的加载事件里面吗?还是?
threenewbee 2012-04-27
  • 打赏
  • 举报
回复
不用写死啊,每个功能自己去注册自己。
allen0118 2012-04-27
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]
前提是委托怎么用你自己学。大概说说:

定义一个全局的字典:

C# code
static class GlobalData {
public static Dictionary<string, Action> dict = new Dictionary<string, Action>();
}

在每个功能中插入自己,比如:

C# code
GlobalDat……
[/Quote]

这样的话是不是还得写死才可以啊,代码里面如果不写的话就用不到对应的菜单啊。
threenewbee 2012-04-27
  • 打赏
  • 举报
回复
前提是委托怎么用你自己学。大概说说:

定义一个全局的字典:
static class GlobalData {
public static Dictionary<string, Action> dict = new Dictionary<string, Action>();
}

在每个功能中插入自己,比如:
GlobalData.dict.Add("菜单设置", () => ShowFunction());

每个功能都把自己注册进去,其余类似

按钮处理:

private void wOutlookBar_ItemClicked(object sender,  LumiSoft.UI.Controls.WOutlookBar.ItemClicked_EventArgs e)
{
var cmd = GlobalData.dict.Where(x => x.Key == e.Item.Caption).FirstOrDefault();
if (cmd != null) cmd.Value();
}

allen0118 2012-04-27
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]
这是使用委托的最佳场景
[/Quote]

朋友,能详细点说一下吗?
threenewbee 2012-04-27
  • 打赏
  • 举报
回复
这是使用委托的最佳场景
jy251 2012-04-27
  • 打赏
  • 举报
回复
这个需要用到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中做的。
我也不知道如何来解释了。。。你自己想想吧,也许我的编程方式跟你不太一样。
allen0118 2012-04-27
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]
把函数当做参数传递,在使用函数前,定义函数并把它加入到楼上说的函数字典里,这样通过函数字典就知道要调用哪个方法了
[/Quote]

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

110,535

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧