关于Form Designer

COOL099 2005-03-17 02:34:19
MSDN上原码示例和SharpDevelop示例,但都是Win Form的。可我要求的是Web Page的设计。不知哪位大侠有这方面的经验?
Web Control可以加到工具箱中,但设计容器是Form,所以控件无法拖放到设计的页面上。
...全文
319 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
hihin 2005-03-28
  • 打赏
  • 举报
回复
给你一段代码示例。

推荐你去读读mono的源代码。
以前写过的。

多看看SDK,总是有好处。

using System;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.ComponentModel;
using System.Collections;

namespace Wap_Controls
{
/// <summary>
/// Wap_Anchor
/// </summary>
[Designer("Wap_Controls.Designers.AnchorDesigner, Wap_Controls")]
[ToolboxData("<{0}:Wap_Anchor runat=server></{0}:Wap_Anchor>")]
public class Wap_Anchor : System.Web.UI.WebControls.WebControl
{
private string[] _postFields;
private string _title;
private string _href;

public Wap_Anchor()
{
}

[Category("Properties")]
[Bindable(true)]
[DefaultValue("")]
[Description("The Anchor's title")]
public string Title
{
get
{
if(_title == null)
_title = this.UniqueID;
return _title;
}
set
{
if(value == null)
_title = string.Empty;
else
_title = value;
}
}

[Category("Properties")]
[Bindable(true)]
[DefaultValue("")]
[Description("The target URL processes posted content")]
[Editor ("System.Web.UI.Design.UrlEditor, System.Design", typeof (System.Drawing.Design.UITypeEditor))]
public string PostTarget
{
get
{
if(_href == null)
_href = "";
return _href;
}
set
{
if(value == null)
_href = "";
else
_href = value;
}
}

[Category("Properties")]
[Bindable(true)]
[DefaultValue(new string[] {"cond1"})]
[Description("All of the controls's name or id you want to post, separate each of them by semicolon")]
[Editor("Wap_Controls.Editor.StringCollectionEditor, Wap_Controls", typeof(System.Drawing.Design.UITypeEditor))]
public string PostFields
{
get
{
string str = "";

if(_postFields == null)
return str;

for(int i = 0; i < _postFields.Length; i++)
{
str += _postFields[i];
if(i != _postFields.Length -1)
{
str +=";";
}
}
return str;
}
set
{
if(value == null)
_postFields = new string[] {"cond1"};
else
{
string[] array = value.Split(';');
ArrayList al = new ArrayList();
for(int i = 0; i < array.Length; i++)
{
if(array[i] != string.Empty && array[i] != null)//this makes me feel better.hiahia.
{
al.Add(array[i]);
}
}
al.TrimToSize();
string[] result = new string[al.Count];
al.CopyTo(0, result, 0, al.Count);
_postFields = result;
}
}
}

[Browsable(false)]
public string[] _PostFields
{
get
{
return _postFields;
}
set
{
_postFields = value;
}
}
#region disappear

[Browsable (false), EditorBrowsable (EditorBrowsableState.Never)]
public override Unit Width
{
get
{
return base.Width;
}
set
{
base.Width = value;
}
}

[Browsable (false), EditorBrowsable (EditorBrowsableState.Never)]
public override Unit Height
{
get
{
return base.Height;
}
set
{
base.Height = value;
}
}

[Browsable (false), EditorBrowsable (EditorBrowsableState.Never)]
public override bool Enabled
{
get
{
return base.Enabled;
}
set
{
base.Enabled = value;
}
}

[Browsable (false), EditorBrowsable (EditorBrowsableState.Never)]
public override System.Drawing.Color ForeColor
{
get
{
return base.ForeColor;
}
set
{
base.ForeColor = value;
}
}

[Browsable (false), EditorBrowsable (EditorBrowsableState.Never)]
public override string AccessKey
{
get
{
return base.AccessKey;
}
set
{
base.AccessKey = value;
}
}

[Browsable (false), EditorBrowsable (EditorBrowsableState.Never)]
public override System.Drawing.Color BackColor
{
get
{
return base.BackColor;
}
set
{
base.BackColor = value;
}
}

[Browsable (false), EditorBrowsable (EditorBrowsableState.Never)]
[DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
public override FontInfo Font
{
get
{
return base.Font;
}
}

[Browsable (false), EditorBrowsable (EditorBrowsableState.Never)]
public override BorderStyle BorderStyle
{
get
{
return base.BorderStyle;
}
set
{
base.BorderStyle = value;
}
}

[Browsable (false), EditorBrowsable (EditorBrowsableState.Never)]
public override System.Drawing.Color BorderColor
{
get
{
return base.BorderColor;
}
set
{
base.BorderColor = value;
}
}

[Browsable (false), EditorBrowsable (EditorBrowsableState.Never)]
public override Unit BorderWidth
{
get
{
return base.BorderWidth;
}
set
{
base.BorderWidth = value;
}
}

[Browsable (false), EditorBrowsable (EditorBrowsableState.Never)]
public override string CssClass
{
get
{
return base.CssClass;
}
set
{
base.CssClass = value;
}
}

[Browsable (false), EditorBrowsable (EditorBrowsableState.Never)]
public override bool EnableViewState
{
get
{
return base.EnableViewState;
}
set
{
base.EnableViewState = value;
}
}

[Browsable (false), EditorBrowsable (EditorBrowsableState.Never)]
public override short TabIndex
{
get
{
return base.TabIndex;
}
set
{
base.TabIndex = value;
}
}

[Browsable (false), EditorBrowsable (EditorBrowsableState.Never)]
public override string ToolTip
{
get
{
return base.ToolTip;
}
set
{
base.ToolTip = value;
}
}

[Browsable (false), EditorBrowsable (EditorBrowsableState.Never)]
public override bool Visible
{
get
{
return base.Visible;
}
set
{
base.Visible = value;
}
}

#endregion

protected override void Render(HtmlTextWriter writer)
{
string str = "";
str = "<anchor title='" + WMLTools_BaseHelper.Gen_Unicode(this.Title) + "'><go href='"+this.PostTarget+"' method='get'>";
for(int i = 0; i< _postFields.Length; i++)
{
str += "<postfield name='" + _postFields.GetValue(i) + "' value='$(" + _postFields.GetValue(i) + ")'/>";
}
str += "</go>" + WMLTools_BaseHelper.Gen_Unicode(this.Title) + "</anchor>";
writer.Write(str);
}

}
}


namespace Wap_Controls.Designers
{
/// <summary>
/// Wap_Anchor的设计器
/// </summary>
public class AnchorDesigner : System.Web.UI.Design.ControlDesigner
{
public override string GetDesignTimeHtml()
{
Wap_Anchor anchor = this.Component as Wap_Anchor;
if(anchor == null)
return "<B> this.Component is null or is not typeof(Wap_Anchor) --- from Wap_AnchorDesigner</B>";

string str;
if(anchor.Title == string.Empty || anchor.Title == null)
str = "<B>" + anchor.UniqueID + "</B>";
else
str = "<B>" + anchor.Title + "</B>";
str += "<br/>";

if(anchor.PostFields == null || anchor.PostFields.Length == 0)
str += "<br/><B>PostFields is not set</B>";
else
{
foreach(string tmp in anchor._PostFields)
{
str += "<br/>PostField : <B>" + tmp + "</B>";
}
}

str += "<br/><br/>";
if(anchor.PostTarget == string.Empty || anchor.PostTarget == null)
str += "<B>PostTarget is not set</B>";
else
str += "Post To : " + "<B>" + anchor.PostTarget + "</B>";
return str;
}

}
}
toball 2005-03-23
  • 打赏
  • 举报
回复
我也在做这样的东西,大家可以交流
haoco 2005-03-21
  • 打赏
  • 举报
回复
up
lovelxj 2005-03-21
  • 打赏
  • 举报
回复
WEB FORM的服务器控件如果设计器是 WIN FORM 也是可以的
ycc2008 2005-03-20
  • 打赏
  • 举报
回复
抄人家的,呵呵
ycc2008 2005-03-20
  • 打赏
  • 举报
回复
public class HtmlEditorDesigner : System.Web.UI.Design.ControlDesigner
{
public HtmlEditorDesigner()
{
}
private YccHtmlEditor ftb = null;

/// <summary>
/// 使设计器准备查看、编辑和设计指定的组件
/// </summary>
/// <param name="component">此设计器的组件</param>
public override void Initialize(IComponent component)
{
ftb = (YccHtmlEditor)component;
base.Initialize(component);
}

/// <summary>
/// 获取用于在设计时表示关联控件的 HTML。
/// </summary>
/// <returns>用于在设计时表示控件的 HTML。</returns>
public override string GetDesignTimeHtml()
{
System.IO.StringWriter sw = new System.IO.StringWriter();

HtmlTextWriter htw = new HtmlTextWriter(sw);
HtmlTable t = new HtmlTable();
t.CellPadding = 3;
t.CellSpacing = 1;
t.BorderColor = ColorTranslator.ToHtml(System.Drawing.Color.Black);
t.BgColor = ColorTranslator.ToHtml(ftb.BackColor);
t.Width = "550px";
t.Height = "350px";
HtmlTableRow tr = new HtmlTableRow();
HtmlTableCell td = new HtmlTableCell();
td.VAlign = "top";
td.Align = "center";

// inner table for iframe
HtmlTable iframe = new HtmlTable();
iframe.BgColor = "#FFFFFF";
iframe.Width="100%";
iframe.Height="100%";
iframe.CellPadding = 0;
iframe.CellSpacing = 0;
iframe.Style.Add("border","1 solid " + ColorTranslator.ToHtml(System.Drawing.Color.Black));
HtmlTableRow tr2 = new HtmlTableRow();
HtmlTableCell td2 = new HtmlTableCell();
td2.VAlign = "middle";
td2.Align = "center";
td2.Controls.Add(new LiteralControl(ftb.ID));
tr2.Cells.Add(td2);
iframe.Rows.Add(tr2);

td.Controls.Add(iframe);
td.Controls.Add(new LiteralControl("<br><br><br>"));
tr.Cells.Add(td);
t.Rows.Add(tr);
t.RenderControl(htw);
return sw.ToString();
}

/// <summary>
/// 获取在呈现控件时遇到错误后在设计时为指定的异常显示的 HTML。
/// </summary>
/// <param name="e">要为其显示错误信息的异常。</param>
/// <returns>设计时为指定的异常显示的 HTML。</returns>
protected override string GetErrorDesignTimeHtml(Exception e)
{
string errorstr="创建控件时出错!"+e.Message;
return CreatePlaceHolderDesignTimeHtml(errorstr);
}
}
COOL099 2005-03-20
  • 打赏
  • 举报
回复
非常感谢: upto(阿球) RapidTier <% N-Tier Code Generator %>) 和 ycc2008(皮皮)
我用Refactor 找到Microsoft Visual Studio .NET 2003\Common7\IDE\Microsoft.VSDesigner.dll
发现里面包含:Microsoft.VSDesigner.WebForms.WebFormDesigner,我想应该就是这个设计器了。但不知如何下手。
有FormDesigner验的大侠多多指点。
ajieboy 2005-03-19
  • 打赏
  • 举报
回复
关注
当初我也是因为创建不了Web Form被卡住了
lehehe 2005-03-19
  • 打赏
  • 举报
回复
关注一下
Bob 2005-03-18
  • 打赏
  • 举报
回复
我最近也在实现类似的功能!

我建议你去下载一个ASP.NET Web Matrix
http://www.asp.net/
然后用Reflector查看它的实现.

要实现这样的Designer,你首先要实现一个WYSIWYG HTML Editor.
WebMatrix的作者Nikhil Kothari已经公开了这部分的源码:
http://www.nikhilk.net/Entry.aspx?id=11
hedonister 2005-03-17
  • 打赏
  • 举报
回复
做成服务器控件
Jim3 2005-03-17
  • 打赏
  • 举报
回复
没有找到,帮顶

17,740

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 .NET Framework
社区管理员
  • .NET Framework社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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