出处:http://www.newlifex.com/showtopic-167.aspx

好吧,附件真的损坏了,原始代码我也没有了,再提取我也没精力了,不好意思,哪位之前下过可以重发一遍吗?不过即使没有也可以参考下面几个示例很快就可以做出来了......

最近在做个项目,业务方面较繁琐,用户需要自定义数据库,也就是石头开源的魔方所提供的功能,但winform实现自定义表单,这个......
在网上搜索了前人的代码发现以下几个参考意义:
http://www.codeproject.com/Articles/24385/Have-a-Great-DesignTime-Experience-with-a-Powerful
http://www.codeproject.com/Articles/60175/The-DesignSurface-Extended-Class-is-Back-Together
http://www.cnblogs.com/michael-zhang/articles/655267.html
http://www.cnblogs.com/pvistely/archive/2006/02/09/327656.html

不过功能都不是很全面,相似之处都是在SD中提取的,哈哈。
把这几个例子整合了一下,发现还缺少最重要的功能对设计窗体的序列化功能都没有啊,于是重新翻阅了一个SD3.2的源代码把XmlForm相关的代码提取出来,然后用XML to Linq重新修改了一遍,效果图如下,界面是用dotnetbar组件:

由于整个编辑器关联太多东东,所以我只把核心功能提出出来,有兴趣的朋友可以看看,由于时间关系,菜单命令我只添加了有限的几个,完整的可以自己添加看看效果,全在源代码中。
还有自定义属性在资源文件中Properties.xml设置,由于我用的是多语言包的,所以在分享的源代码中屏蔽了部分代码,在HmCustomProperty类中进行设置,大家看看就会懂的。

另外如果有些控件的属性对象复杂的话,需要对这个属性单独进行序列化,需要在DesignSurfaceExt类的GetElementFor方法和XmlLoader类的SetAttributes方法中分别设置,我用的是SharpSerializer来实现属性对象序列化的。

还有就是比较复杂的控件如Tabcontrol之类的,也需要自己单独设置,大家可以查看一下sd的源代码看看。

还有一个问题没有解决,如果在设计窗体中使用快捷键,我把sd中的FormKeyHandler类提取出来,就会有一个问题,我按del键删除一个控件时没有问题,但是在在属性中编辑某个属性时也会用到del键,这时也会把设计窗体中的选中的控件删除,

.net版本用的是2.0,所以需要手动添加system.core.dll和system.xml.linq.dll的引用,还有newlife.core.dll的引用。

下面是我上传的源代码,运行时的截图:


*******************************************************
压缩包损坏缺少一个文件EventBindingService.cs,现在附件上传不了啦,自己该下命名空间把

using System;
using System.Collections;
using System.ComponentModel;
using System.Reflection; namespace HmFramework.UI.Sprite.Services
{
internal class EventBindingServiceExt : System.ComponentModel.Design.EventBindingService
{
public EventBindingServiceExt(IServiceProvider provider)
: base(provider)
{
} protected override String CreateUniqueMethodName(IComponent component, EventDescriptor e)
{
return String.Format("{0}_{1}", Char.ToUpper(component.Site.Name[0]) + component.Site.Name.Substring(1), e.DisplayName);
} // sohuld look around in form class for compatiable methodes
protected override ICollection GetCompatibleMethods(EventDescriptor e)
{
ArrayList al = new ArrayList();
MethodInfo methodInfo = e.EventType.GetMethod("Invoke");
if (null != methodInfo)
{
al.Add(methodInfo.Name);
}
return al;
} protected override Boolean ShowCode()
{
//IWorkbenchWindow window = WorkbenchSingleton.Workbench.ActiveWorkbenchWindow;
//if (window == null) {
// return false;
//}
//FormsDesignerViewContent formDesigner = window.ActiveViewContent as FormsDesignerViewContent;
//if (formDesigner != null) {
// formDesigner.ShowSourceCode();
// return true;
//}
return false;
} protected override Boolean ShowCode(Int32 lineNumber)
{
//IWorkbenchWindow window = WorkbenchSingleton.Workbench.ActiveWorkbenchWindow;
//if (window == null) {
// return false;
//}
//FormsDesignerViewContent formDesigner = window.ActiveViewContent as FormsDesignerViewContent;
//if (formDesigner != null) {
// formDesigner.ShowSourceCode(lineNumber);
// return true;
//}
return false;
} protected override Boolean ShowCode(IComponent component, EventDescriptor edesc, String methodName)
{
//System.Windows.Forms.MessageBox.Show("to add:" + component.Site.Name + "\r\n" + methodName);
return false;
}
}
}
 
new.png (94.08 K, 下载次数:2)

(2013/8/13 15:24:02 上传)

designer.png (133.23 K, 下载次数:8)

(2013/8/13 15:24:02 上传)

Winform自定义表单(转)的更多相关文章

  1. 【从零开始学BPM,Day3】自定义表单开发

    [课程主题] 主题:5天,一起从零开始学习BPM [课程形式] 1.为期5天的短任务学习 2.每天观看一个视频,视频学习时间自由安排. [第三天课程] 1.课程概要 Step 1 软件下载:H3 BP ...

  2. 【.net+jquery】绘制自定义表单(含源码)

    前言 两年前在力控的时候就想做一个类似的功能,当时思路大家都讨论好了,诸多原因最终还是夭折了.没想到两年多后再这有重新提出要写一个绘制表单的功能.对此也是有点小激动呢?总共用时8.5天的时间基本功能也 ...

  3. [转]django自定义表单提交

    原文网址:http://www.cnblogs.com/retop/p/4677148.html 注:本人使用的Django1.8.3版本进行测试 除了使用Django内置表单,有时往往我们需要自定义 ...

  4. Dedecms自定义表单后台列表展现方式更改

    Dedecms有自定义表单功能,方便我们收集用户信息.个人通常喜欢拿这个功能做问卷调查,在线留言等功能.但是如果使用过这个功能的朋友就会知道,Dedecms自定义表单后台列表展现方式并不好看. 上面就 ...

  5. Vue组件之自定义表单组件

    今天又看了一遍vue的文档,记得之前学习的时候,官方文档中有提过,v-model指令是一个语法糖,做两件事,一个是给表单控件元素绑定value,第二个是当输入时更新绑定的值,不过后来在"表单 ...

  6. Django初体验(一):自定义表单提交

    注:本人使用的Django1.8.3版本进行测试 除了使用Django内置表单,有时往往我们需要自定义表单.对于自定义表单Post方式提交往往会带来由CSRF(跨站请求伪造)产生的错误"CS ...

  7. DedeCMS提交自定义表单加入验证码功能

    织梦dedecms网站给自定义表单加dede模板自带验证码的方法. 有时候,我们因为需要给dede网站的自定义表单添加验证码,防止恶意填写表单提交. 我们可以用以下的方法来实现: 首先,我们要找到 / ...

  8. activiti自定义流程之整合(三):整合自定义表单创建模型

    本来在创建了表单之后应该是表单列表和预览功能,但是我看了看整合的代码,和之前没有用angularjs的基本没有什么变化,一些极小的变动也只是基于angularjs的语法,因此完全可以参考之前说些的表单 ...

  9. Orchard创建自定义表单

    本文链接:http://www.cnblogs.com/souther/p/4520130.html 主目录 自定义表单模块可以用来获取网站前台用户的信息.自定义表单需要与一个内容类型结合使用.它可以 ...

随机推荐

  1. Cisco VSS

    1.原理 VSS是将两台及以上的物理设备虚拟成逻辑上的一台,可类比堆叠.VSS在控制层面上两个交换机有主从之分,但在数据面上处理是双活的.无论是从网络控制层面和管理视图上在网络上都是一个单独的设备实体 ...

  2. SCP对拷如何连接指定端口远程主机

    SCP对拷如何连接指定端口(非22端口)的远程主机 scp  -P  远程端口号  本机待拷贝文件路径 远程主机用户名@远程主机地址:远程主机目的路径 注意:  1.  参数-P 的位置一定要紧跟在s ...

  3. HTML day48

    前端知识之HTML内容   HTML介绍 Web服务本质 import socket#引入套接字模块 sk = socket.socket()#实例化一个套接字对象 sk.bind(("12 ...

  4. Java并发-ConcurrentModificationException原因源码分析与解决办法

    一.异常原因与异常源码分析 对集合(List.Set.Map)迭代时对其进行修改就会出现java.util.ConcurrentModificationException异常.这里以ArrayList ...

  5. Hadoop(二) HADOOP集群搭建(简化版)

    1.准备Linux环境    1.0先将虚拟机的网络模式选为NAT            1.1修改主机名        vi /etc/sysconfig/network               ...

  6. 反射中,Class.forName 和 classloader 的区别

    https://blog.csdn.net/qq_27093465/article/details/52262340 java中class.forName()和classLoader都可用来对类进行加 ...

  7. 迈科DPI和运营商合作比较多

    业界领先的DPI/DFI解决方案提供商 专注网络流量数据和应用性能数据的分析优化   业界领先的DPI/DFI解决方案提供商 专注网络流量数据和应用性能数据的分析优化 Previous Next DP ...

  8. JavaScript中对数据库表中某一个字段进行赋值

    场景如下,通过下拉列表选择一个选项(如“启用”和“不启用”),启用用0表示,不启用用1表示. enableFlag是表中一个字段,我猜date:后面就是对该字段的赋值.

  9. Tinyos学习笔记(一)

    简述:发送和接受数据的程序分别烧录到两个节点上,发送方发送流水灯数据,接受方接受数据并实现流水灯 1.发送和接受程序用到的组件及其接口如图(通过make telosb docs获得)所示:   2.发 ...

  10. Best Sightseeing Pair LT1014

    Given an array A of positive integers, A[i] represents the value of the i-th sightseeing spot, and t ...