Winform自定义表单(转)

出处: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 上传)

原文地址:https://www.cnblogs.com/smileberry/p/9122299.html

时间: 2024-10-10 00:54:19

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

Drupal创建自定义表单,上传文件代码

Drupal中创建自定义表单,用来上传文件,对上传文件做一些操作.以下是放在Module中的代码: 一.菜单建立表单路径 /** Implementation of hook_menu(). */ function moduleName_menu () { $items = array(); $items['admin/import'] = array( 'title' => 'title', 'page callback' => 'drupal_get_form', 'page argume

struts2 自定义表单

自定义表单一定会涉及<s:iterator/>迭代,一个复杂的自定义表单可能会嵌套n多层迭代. 比如一个自定义一个问卷调查页面涉及3个模型:一个Survey代表一个调查,一个Page代表一个页面,一个Question代表一个问题.每个问题中会包含不同的表单元素,就会涉及迭代. 3个模型类如下: Survey package com.atguigu.surveypark.model; import java.util.Date; import java.util.HashSet; import

Infopath自定义表单实现列表字段联动

以前做一个项目,为了实现两字段联动录入的功能,采用了Infopath来自定义表单完成,具体方法如下: 例如,首先我们有一个数据源列表Country,里面有连个字段,一个是Country,一个是Province,存放着所有的源数据, 我们现在有一个LinkageList,用来输入信息,里面也有两个字段,一个是国家,一个是省会 现在我们需要在LinkageList列表中添加数据时,实现国家和省会联动,即如果你国家选择了China,那么省会就只有三个选择Guangdong,Hubei,Hunan供你选

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

本来在创建了表单之后应该是表单列表和预览功能,但是我看了看整合的代码,和之前没有用angularjs的基本没有什么变化,一些极小的变动也只是基于angularjs的语法,因此完全可以参考之前说些的表单列表展示相关的内容,这里也就直接进入到下一个步骤,创建流程模型了. 在之前的创建流程模型一节里,我讲代码比较多,实际上在这里还有很重要的一个环节没有细说,那就是自定义流程图,画流程图的过程也是有不少需要注意的事项的,在这一节我会适当的以截图加解释进行说明. 而在创建流程模型的过程中,因为之前也是用j

dedecms(织梦)自定义表单后台显示不全

我们常用dedecms 自定义表单做留言功能.但是偶尔会遇到这样一个问题,就是 在前台提交表单后..后天显示不全.特别是中文字符  都不会显示, 比如下图: 这是因为  如果你织梦是gbk的话那就对了 是htmlspecialchars这个函数的原因 默认是utf8 如果不想换php版本的话就把htmlspecialchars($str);替换为htmlspecialchars($str, ENT_COMPAT ,'GB2312'); 所以 要在后台模板 wwww.baidu.com/dede/

dede自定义表单制作

dede自定义表单制作和制作留言板的原理差不多,就是如果有自己制作了一个网页专题的话需要接受前台提交来的表单,可以参照这种的! 首页在后台-核心-频道模型-自定义表单-增加新的自定义表单 里添加一个表单! 接下来就是填写自定义表单的各项值了,其实这里不懂的话都默认就好,只是自定义表单的名字作为记号写个差不多的,然后就是公开与否,如果前台提交来的数据不想让别人看到就可以直接选不公开!当然这个不公开最好是最后制作完毕在选,因为接下来要在前台浏览并复制一些代码,如果不公开是不能在前台看的! 填写好确定

织梦自定义表单通过ajax提交的实现方法

自定义表单通过ajax判断,提交不用跳转页面,提高用户体验.具体方法如下: html表单代码部分,就提交按钮改成botton,,添加onclick事件 表单代码: <form action="javascript:;" enctype="multipart/form-data" method="post"> <input type="hidden" name="action" value=

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

[课程主题] 主题:5天,一起从零开始学习BPM [课程形式] 1.为期5天的短任务学习 2.每天观看一个视频,视频学习时间自由安排. [第三天课程] 1.课程概要 Step 1 软件下载:H3 BPM10.0全开放免费下载:http://bbs.h3bpm.com/read.php?tid=861&fid=11 Step 2 安装资料:参考本博的"安装资料"分类 Step 3 产品在线帮助浏览:http://bbs.h3bpm.com/read.php?tid=286&

[转] 两种自定义表单设计方案

无涯 原文 两种自定义表单设计方案 [原创] 2006-12 最近参与一个项目,客户要求提供自定义表单的功能.主要的要求是:能够对表单的字段进行增删改,对显示表单的格式可以灵活定制.由于客户的表单变动可能比较频繁,所以决定实现自定义表单功能.初步设想出以下两种自定义表单的解决方案,目前只涉及到表单的显示方案. 请大家讨论一下两种方案的优劣,使用哪种较好.也欢迎大家提出更好的解决方案. HTML模板方案 概述:采用HTML模板方式.对于每一种样式的表单定义HTML模板:在模板中定义Web页面的HT