目的:一个链接控件<a>,想让它有引发事件功能。过程:
1。查看linkbutton,在html页面会有_dopost 和2个隐藏的input
2。了解自定义控件的事件引发概念
3。一下子没可能搞的太清__EVENTTARGET在.net内部工作过程。
4。所以自己模拟生成js代码控件cs:using System;
using System.Collections.Generic;
using System.Text;
using System.Web;
using System.Web.UI;
namespace controla
{
public class Class1 : Control, IPostBackEventHandler
{
protected override void Render(HtmlTextWriter writer)
{
writer.Write("<a href='javascript:" + this.UniqueID + "_doPost(" + this.UniqueID + ")' name='" + this.UniqueID + "'>apost</a>");
base.Render(writer);
} public delegate void EventPageIndex(Object sender, EventArgs e); public event EventPageIndex PageChange; //页更改事件 public virtual void HEREPageChange(Object sender, EventArgs e)
{
if (PageChange != null)
{
PageChange(this, e);
} } public void RaisePostBackEvent(string eventArgument)
{
int i = 9;
HEREPageChange(this, new EventArgs());
//this.CurPage = Int32.Parse(System.Web.HttpContext.Current.Request.Form[this.UniqueID].ToString());
//PageArgs e = new PageArgs();
//e.CurPage = CurPage;
//OnPageChange(this, e);
} protected override void OnPreRender(EventArgs e)
{
base.OnPreRender(e);
string dopost = "<div>\n";
dopost += " <input type=\"hidden\" name=\"" + this.UniqueID + "\" id='" + this.UniqueID + "' value=\"\" />\n";
dopost += "</div>\n";
dopost += "<script type=text/javascript>\n";
dopost += " function " + this.UniqueID + "_doPost(cutomArg){\n";
dopost += " document.forms['form1']." + this.UniqueID + ".value = cutomArg;\n";
dopost += " document.forms['form1'].submit();\n";
dopost += " }\n";
dopost += "</script>\n";
Page.ClientScript.RegisterClientScriptBlock(this.GetType(), this.UniqueID, dopost);
}
}
}aspx:<body>
<form id="form1" runat="server" method="post">
<div>
<cc1:Class1 ID="Class1_1" runat="server" OnPageChange="tt">
</cc1:Class1>
<cc1:Class1 ID="Class1_2" runat="server" OnPageChange="tt2">
</cc1:Class1>
</div>
</form>
</body>
aspx.cs
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;namespace fffff
{
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
Response.Write("first");
}
else
{ Response.Write("second");
}
} protected void tt(object sender, EventArgs e)
{
Response.Write("fire!");
} protected void tt2(object sender, EventArgs e)
{
Response.Write("fire2!");
}
}
}结果:页面拖2个控件,可是不管点哪个都只能引发 tt2 这个目标函数。希望说说怎么解决呢?
不在我的代码上修改也可以,只要能解决,多个连接引发各自的事件就可以。
但是因为我的实际需要原因控件类不要继承linkbutton。只要继承 Control, IPostBackEventHandler这2个类。
请解答。谢谢。
1。查看linkbutton,在html页面会有_dopost 和2个隐藏的input
2。了解自定义控件的事件引发概念
3。一下子没可能搞的太清__EVENTTARGET在.net内部工作过程。
4。所以自己模拟生成js代码控件cs:using System;
using System.Collections.Generic;
using System.Text;
using System.Web;
using System.Web.UI;
namespace controla
{
public class Class1 : Control, IPostBackEventHandler
{
protected override void Render(HtmlTextWriter writer)
{
writer.Write("<a href='javascript:" + this.UniqueID + "_doPost(" + this.UniqueID + ")' name='" + this.UniqueID + "'>apost</a>");
base.Render(writer);
} public delegate void EventPageIndex(Object sender, EventArgs e); public event EventPageIndex PageChange; //页更改事件 public virtual void HEREPageChange(Object sender, EventArgs e)
{
if (PageChange != null)
{
PageChange(this, e);
} } public void RaisePostBackEvent(string eventArgument)
{
int i = 9;
HEREPageChange(this, new EventArgs());
//this.CurPage = Int32.Parse(System.Web.HttpContext.Current.Request.Form[this.UniqueID].ToString());
//PageArgs e = new PageArgs();
//e.CurPage = CurPage;
//OnPageChange(this, e);
} protected override void OnPreRender(EventArgs e)
{
base.OnPreRender(e);
string dopost = "<div>\n";
dopost += " <input type=\"hidden\" name=\"" + this.UniqueID + "\" id='" + this.UniqueID + "' value=\"\" />\n";
dopost += "</div>\n";
dopost += "<script type=text/javascript>\n";
dopost += " function " + this.UniqueID + "_doPost(cutomArg){\n";
dopost += " document.forms['form1']." + this.UniqueID + ".value = cutomArg;\n";
dopost += " document.forms['form1'].submit();\n";
dopost += " }\n";
dopost += "</script>\n";
Page.ClientScript.RegisterClientScriptBlock(this.GetType(), this.UniqueID, dopost);
}
}
}aspx:<body>
<form id="form1" runat="server" method="post">
<div>
<cc1:Class1 ID="Class1_1" runat="server" OnPageChange="tt">
</cc1:Class1>
<cc1:Class1 ID="Class1_2" runat="server" OnPageChange="tt2">
</cc1:Class1>
</div>
</form>
</body>
aspx.cs
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;namespace fffff
{
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
Response.Write("first");
}
else
{ Response.Write("second");
}
} protected void tt(object sender, EventArgs e)
{
Response.Write("fire!");
} protected void tt2(object sender, EventArgs e)
{
Response.Write("fire2!");
}
}
}结果:页面拖2个控件,可是不管点哪个都只能引发 tt2 这个目标函数。希望说说怎么解决呢?
不在我的代码上修改也可以,只要能解决,多个连接引发各自的事件就可以。
但是因为我的实际需要原因控件类不要继承linkbutton。只要继承 Control, IPostBackEventHandler这2个类。
请解答。谢谢。
{
protected override void Render(HtmlTextWriter writer)
{
// writer.Write(" <a href='javascript:" + this.UniqueID + "_doPost(" + this.UniqueID + ")' name='" + this.UniqueID + "'>apost </a>");
writer.Write(" <a href=\"javascript:" +this.Page.ClientScript.GetPostBackEventReference(this,"") + "\">apost </a>");
base.Render(writer);
} public delegate void EventPageIndex(Object sender, EventArgs e); public event EventPageIndex PageChange; //页更改事件 public virtual void HEREPageChange(Object sender, EventArgs e)
{
if (PageChange != null)
{
PageChange(this, e);
} } public void RaisePostBackEvent(string eventArgument)
{
int i = 9;
HEREPageChange(this, new EventArgs());
//this.CurPage = Int32.Parse(System.Web.HttpContext.Current.Request.Form[this.UniqueID].ToString());
//PageArgs e = new PageArgs();
//e.CurPage = CurPage;
//OnPageChange(this, e);
} protected override void OnPreRender(EventArgs e)
{
base.OnPreRender(e);
//string dopost = " <div>\n";
//dopost += " <input type=\"hidden\" name=\"" + this.UniqueID + "\" id='" + this.UniqueID + "' value=\"\" />\n";
//dopost += " </div>\n";
//dopost += " <script type=text/javascript>\n";
//dopost += " function " + this.UniqueID + "_doPost(cutomArg){\n";
//dopost += " document.forms['form1']." + this.UniqueID + ".value = cutomArg;\n";
//dopost += " document.forms['form1'].submit();\n";
//dopost += " }\n";
//dopost += " </script>\n";
//Page.ClientScript.RegisterClientScriptBlock(this.GetType(), this.UniqueID, dopost);
}
}
<head><title>
无标题页
</title></head>
<body>
<form name="form1" method="post" action="default.aspx" id="form1">
<div>
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwUKMTA2NjM0NTAwMGRkxa9KCfTPbvgCZdCDarnFIyug5yQ=" />
</div> <div>
<a href='javascript:__doPostBack('Class1_1','tt')' name="Class1_1">apost </a>
<a href='javascript:__doPostBack('Class1_2','tt')' name="Class1_2">apost </a>
</div>
<div> <input type="hidden" name="__EVENTTARGET" id="__EVENTTARGET" value="" />
<input type="hidden" name="__EVENTARGUMENT" id="__EVENTARGUMENT" value="" />
</div>
<script type="text/javascript">
<!--
var theForm = document.forms['form1'];
if (!theForm) {
theForm = document.form1;
}
function __doPostBack(eventTarget, eventArgument) {
if (!theForm.onsubmit || (theForm.onsubmit() != false)) {
theForm.__EVENTTARGET.value = eventTarget;
theForm.__EVENTARGUMENT.value = eventArgument;
theForm.submit();
}
}
// -->
</script></form>
</body>
</html>
谢谢。你的方法是可以的。
但是为什么我在这里
writer.Write(" <a href='javascript:"+this.GetPostBackEventReference(this,"") + "'>apost </a>");
加上了
name='" + this.UniqueID + "'
却不引发了了?
其他类型就不需要了。js的__doPostBack(eventTarget, eventArgument) 包含了控件id。
谢谢。
结帖。