自定义控件的问题!!!!!!!!!!!

cyp503 2004-04-30 08:46:52
各位,我按照.net framework帮助文档做了一个自定义控件,源代码如下:

using System;
using System.Web.UI;
using System.Collections;
using System.Collections.Specialized;

namespace WebControlLibrary
{

public class TestButton: System.Web.UI.WebControls.WebControl, IPostBackEventHandler
{

// Defines the Click event.
public event EventHandler Click;

//Invoke delegates registered with the Click event.
protected virtual void OnClick(EventArgs e)
{

if (Click != null)
{
Click(this, e);
}
}


// Define the method of IPostBackEventHandler that raises change events.
public void RaisePostBackEvent(string eventArgument)
{

OnClick(new EventArgs());
}


protected override void Render(HtmlTextWriter output)
{
output.Write("<INPUT TYPE = submit name = " + this.UniqueID +
" Value = 'Click Me' />");
}
}
}

编译后引用,这个自定义控件完全没问题.注意:直到这里没问题

后来,我又做了一个自定义控件,这个控件嵌入上述控件TestButton,

新作的这个控件也可以实现页面回发,因为实现了IPostBackEventHandler接口

但问题出现在"虽然已经可以实现页面回发,但服务器端不能判断是由于哪个控件引起的"

即:

MyCustomButton btn=new MyCustomButton();
btn.Click+=new EventHandler(this.btnClick);

private void btnClick(object sender,EventArgs e)
{
Response.Write("hello world!"); //这里不能输出!!
}
...全文
121 21 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
vzxq 2004-05-08
  • 打赏
  • 举报
回复
学习!
cyp503 2004-05-08
  • 打赏
  • 举报
回复
thanks saucer :)

cyp503 2004-05-07
  • 打赏
  • 举报
回复
WebControlCollection.cs

----------------------------------------------------------------------------------


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

namespace WebControlLibrary
{
[Serializable()]
public class WebControlCollection:System.Collections.CollectionBase
{
public WebControlCollection(){}
public WebControlCollection(WebControlCollection value)
{
this.AddRange(value);
}
public WebControlCollection(WebControl[] value)
{
this.AddRange(value);
}

public WebControl this[int index]
{
get{return (WebControl)List[index];}
set{List[index]=value;}
}

public int Add(WebControl value)
{
return List.Add(value);
}

public void AddRange(WebControl[] value)
{
for(int i=0;i<value.Length;i=i+1)
{
this.Add(value[i]);
}
}

public void AddRange(WebControlCollection value)
{
for(int i=0;i<value.Count;i=i+1)
{
this.Add(value[i]);
}
}

public bool Contains(WebControl value)
{
return List.Contains(value);
}

public void CopyTo(WebControl[] array,int index)
{
List.CopyTo(array,index);
}

public int IndexOf(WebControl value)
{
return List.IndexOf(value);
}

public void Insert(int index,WebControl value)
{
List.Insert(index,value);
}

public void Remove(WebControl value)
{
List.Remove(value);
}

public new WebControlEnumerator GetEnumerator()
{
return new WebControlEnumerator(this);
}
}

public class WebControlEnumerator:object, System.Collections.IEnumerator
{
private IEnumerator baseEnumerator;
private IEnumerable temp;
public WebControlEnumerator(WebControlCollection mappings)
{
this.temp=((IEnumerable)mappings);
this.baseEnumerator=temp.GetEnumerator();

}

public WebControl Current
{
get{return (WebControl)baseEnumerator.Current;}
}

object IEnumerator.Current
{
get
{
return baseEnumerator.Current;

}
}

public bool MoveNext()
{
return baseEnumerator.MoveNext();
}

bool IEnumerator.MoveNext()
{
return baseEnumerator.MoveNext();
}

public void Reset()
{
baseEnumerator.Reset();
}
//
// bool IEnumerator.Reset()
// {
// baseEnumerator.Reset();
// }

}
}
cyp503 2004-05-07
  • 打赏
  • 举报
回复
MenuButton.cs

------------------------------------------------------------------

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

namespace WebControlLibrary
{
/// <summary>
/// MenuBarItem
/// </summary>
[DefaultProperty("Text"),
ToolboxData("<{0}:MenuBarItem runat=server></{0}:MenuBarItem>")]
public class MenuBarItem : System.Web.UI.WebControls.WebControl,IPostBackEventHandler , INamingContainer

{
public event EventHandler Click;
private string text;

[Bindable(true),
Category("Appearance"),
DefaultValue("")]
public string Text
{
get{return text;}
set{text = value;}
}

private string strToolTip;
/// <summary>
/// 提示
/// </summary>
[Bindable(true),
Category("Appearance"),
DefaultValue("")]
public override string ToolTip
{
get{return strToolTip;}
set{strToolTip=value;}
}


public void RaisePostBackEvent(string eventArgument)
{
OnBtnClick(new EventArgs());

}

protected virtual void OnBtnClick(EventArgs e)
{
if(Click!=null)
Click(this,e);
}


/// <summary>
/// 将此控件呈现给指定的输出参数。
/// </summary>
/// <param name="output"> 要写出到的 HTML 编写器 </param>
protected override void Render(HtmlTextWriter output)
{
output.Write(GetBeginHtmlSource());
output.Write("<input type=submit name="+this.UniqueID+" value="+text+" alt=\""+strToolTip+"\" id="+this.UniqueID+" />");
//base.RenderControl(output);
output.Write("</td></tr></tbody></table></td>");
}

/// <summary>
/// 获取开始输出的Html源
/// </summary>
/// <returns>Html源</returns>
private string GetBeginHtmlSource()
{
StringBuilder sb=new StringBuilder();
ensb.Append(" <td align=absmiddle noWrap width=\"50\">");
sb.Append("\n");
sb.Append("<table border=1 bordercolordark=#ECEAE6 bordercolorlight=#ECEAE6 cellpadding=0 cellspacing=0 height=22 ");
sb.Append(" onMouseDown=\"javascript:this.borderColorDark='#ffffff';this.borderColorLight='#808080'\" ");
sb.Append(" onMouseOut=\"javascript:this.borderColorDark='#ECEAE6';this.borderColorLight='#ECEAE6';\" ");
sb.Append("onMouseOver=\"javascript:this.borderColorDark='#808080';this.borderColorLight='#ffffff';\"");
sb.Append("onMouseUp=\"javascript:this.borderColorDark='#ECEAE6';this.borderColorLight='#ECEAE6'\"");
sb.Append("style=\"CURSOR: hand\" width=\"100%\">");
sb.Append("\n");
sb.Append(" <tbody>");
sb.Append("\n");
sb.Append(" <tr>");
sb.Append("\n");
sb.Append("<td align=center bgcolor=#ECEAE6 bordercolordark=#ECEAE6");
sb.Append(" bordercolorlight=#ECEAE6 noWrap valign=center>");
return sb.ToString();
}
}
}
cyp503 2004-05-07
  • 打赏
  • 举报
回复
谢谢各位的热心回复:



我现在把源代码贴出来,麻烦各位帮个忙!真的很急!谢谢

MenuBar.cs
----------------------------------------------------------------------


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

namespace WebControlLibrary
{
/// <summary>
/// MenuBar
/// </summary>
[DefaultProperty("Text"),
ToolboxData("<{0}:MenuBar runat=server></{0}:MenuBar>")]
public class MenuBar : System.Web.UI.WebControls.WebControl,System.Web.UI.IPostBackEventHandler,System.Web.UI.INamingContainer
{

private WebControlCollection webControlCollection=new WebControlCollection();
/// <summary>
/// MenuBarItem集合
/// </summary>
[Bindable(true),
Category("Appearance"),
DefaultValue(typeof(WebControlCollection))]
public WebControlCollection MenuBarItems
{
get{return webControlCollection;}
set
{
this.EnsureChildControls();
webControlCollection=value;
}
}


private string strWidth="100%";
/// <summary>
/// 宽度
/// </summary>
[Bindable(true),
Category("Appearance"),
DefaultValue("100%")]
public new string Width
{
get{return strWidth;}
set
{
this.EnsureChildControls();
strWidth=value;
}
}

private string strHeight="20";
/// <summary>
/// 高度
/// </summary>
[Bindable(true),
Category("Appearance"),
DefaultValue("")]
public new string Height
{
get{return strHeight;}
set
{
this.EnsureChildControls();
strHeight=value;
}
}

/// <summary>
/// 将此控件呈现给指定的输出参数。
/// </summary>
/// <param name="output"> 要写出到的 HTML 编写器 </param>
protected override void Render(HtmlTextWriter output)
{
output.Write(GetBeginHtmlSource());
foreach(WebControl wtl in webControlCollection)
{
wtl.RenderControl(output);
}
output.Write(" </tr> </tbody></table>");

}


/// <summary>
/// 获取开始输出的Html源
/// </summary>
/// <returns>Html源</returns>
private string GetBeginHtmlSource()
{
StringBuilder sb=new StringBuilder();
sb.Append("<table bgcolor=#ECEAE6 border=1 bordercolordark=#808080 ");
sb.Append(" bordercolorlight=#ffffff cellpadding=0 cellspacing=0 width=\""+strWidth+"\" height=\""+strHeight+"\">");
sb.Append(" <tbody>");
sb.Append(" <tr bordercolordark=#ECEAE6 bordercolorlight=#ECEAE6> ");
return sb.ToString();
}

#region Implementation of IPostBackEventHandler
public void RaisePostBackEvent(string eventArgument)
{

}
#endregion


}
}
saucer 2004-05-07
  • 打赏
  • 举报
回复
if you look at the source code in IE, you will see the name/id are empty for theose MenuItemButton's, the problem is that those control were never part of the Controls hierarchy, try to modify MenuBar.cs to something like


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

namespace WebControlLibrary
{
/// <summary>
/// MenuBar
/// </summary>
[DefaultProperty("Text"),
ToolboxData("<{0}:MenuBar runat=server></{0}:MenuBar>")]
public class MenuBar : System.Web.UI.WebControls.WebControl,System.Web.UI.IPostBackEventHandler,System.Web.UI.INamingContainer
{

private WebControlCollection webControlCollection=new WebControlCollection();
/// <summary>
/// MenuBarItem集合
/// </summary>
[Bindable(true),
Category("Appearance"),
DefaultValue(typeof(WebControlCollection))]
public WebControlCollection MenuBarItems
{
get{return webControlCollection;}
set
{

webControlCollection=value;
this.EnsureChildControls();
}
}


private string strWidth="100%";
/// <summary>
/// 宽度
/// </summary>
[Bindable(true),
Category("Appearance"),
DefaultValue("100%")]
public new string Width
{
get{return strWidth;}
set
{
strWidth=value;
this.EnsureChildControls();
}
}

private string strHeight="20";
/// <summary>
/// 高度
/// </summary>
[Bindable(true),
Category("Appearance"),
DefaultValue("")]
public new string Height
{
get{return strHeight;}
set
{

strHeight=value;
this.EnsureChildControls();
}
}

protected override void CreateChildControls()
{
foreach(WebControl wtl in webControlCollection)
{
this.Controls.Add(wtl);
}
}
/// <summary>
/// 将此控件呈现给指定的输出参数。
/// </summary>
/// <param name="output"> 要写出到的 HTML 编写器 </param>
protected override void Render(HtmlTextWriter output)
{
output.Write(GetBeginHtmlSource());
foreach(WebControl wtl in webControlCollection)
{
wtl.RenderControl(output);
}
output.Write(" </tr> </tbody></table>");

}


/// <summary>
/// 获取开始输出的Html源
/// </summary>
/// <returns>Html源</returns>
private string GetBeginHtmlSource()
{
StringBuilder sb=new StringBuilder();
sb.Append("<table bgcolor=#ECEAE6 border=1 bordercolordark=#808080 ");
sb.Append(" bordercolorlight=#ffffff cellpadding=0 cellspacing=0 width=\""+strWidth+"\" height=\""+strHeight+"\">");
sb.Append(" <tbody>");
sb.Append(" <tr bordercolordark=#ECEAE6 bordercolorlight=#ECEAE6> ");
return sb.ToString();
}

#region Implementation of IPostBackEventHandler
public void RaisePostBackEvent(string eventArgument)
{

}
#endregion


}
}

SVG 2004-05-03
  • 打赏
  • 举报
回复
现在楼主是用靓态控件来实现 submit 的, 就好比使用 script __doPostBack 一样来响服务事件.
一旦页面有不同的 type=submit 的提交, 使用静态控件就当然不知道是哪个 handler 了.
所以不要使用静态 submit 控件, 而使用 asp:button
lllyg 2004-04-30
  • 打赏
  • 举报
回复
protected override void Render(HtmlTextWriter output)
{
output.Write("<INPUT TYPE = submit name = " + this.UniqueID +
" Value = 'Click Me' />");
}
---------------------------
up,好像要修改上面
supermarrio 2004-04-30
  • 打赏
  • 举报
回复
UP
saucer 2004-04-30
  • 打赏
  • 举报
回复
if you add your control to TestButton, what does your Render() look like?

also try to implement INamingContainer

public class TestButton: System.Web.UI.WebControls.WebControl, IPostBackEventHandler,INamingContainer

saucer 2004-04-30
  • 打赏
  • 举报
回复
I assume you were saying the event is never raised, where are you creating those controls? make sure they are created in Page_Load event or before, if you are using CreateChildControls(), try to call EnsureChildControls()
cyp503 2004-04-30
  • 打赏
  • 举报
回复
就是点击MenuBar后,不能确定是哪个MenuButton引起页面回发的
cyp503 2004-04-30
  • 打赏
  • 举报
回复
我再说说我为什么要新增另一个自定义控件

我要实现的是一个MenuBar

而MenuBar是可以添加自定义的button的
vzxq 2004-04-30
  • 打赏
  • 举报
回复
学习,UP
cyp503 2004-04-30
  • 打赏
  • 举报
回复
??

To:SVG(ben)

能详细一点吗?小弟愚质
zhengyi2002grade 2004-04-30
  • 打赏
  • 举报
回复
up
SVG 2004-04-30
  • 打赏
  • 举报
回复
不能判断是由于哪个控件引起

因为你有
"<INPUT TYPE = submit name = " + this.UniqueID + " Value = 'Click Me' />"
和你另一个 button 控件不知道是谁触发 postback 的.

所以, 建议 "<INPUT TYPE = submit name = " + this.UniqueID + " Value = 'Click Me' />" 不要是 response.write 了崃, 是要 new button() 出来. 再与 new button .click 的 event 挂上 eventhandler 就行了.

这时, 也无需实现 IPostBackEventHandler
cyp503 2004-04-30
  • 打赏
  • 举报
回复
都实现了
张新林 2004-04-30
  • 打赏
  • 举报
回复
试着给子控件加ID。
张新林 2004-04-30
  • 打赏
  • 举报
回复
MenuBar实现INamingContainer接口了吗?
加载更多回复(1)

62,244

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

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