需求是这样的,自定义了一个用户控件,类似百度搜索时的智能搜索,用到了AjaxControlToolkit,想要的效果就是为这个这个控件选择完成后声明一个事件,在使用这个控件的地方,定制这个事件,绑定数据
相关代码<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="Mytxt.ascx.cs" Inherits="WebMemberManage.WebUserControl.Mytxt" %><script type="text/javascript">
function itemSelected(source, eventArgs)
{
var txtManager = document.getElementById(source.get_element().id); //获得当前编辑的对象
txtManager.value=txtManager.value.split('(')[0];
loadXMLDoc("~/Default.aspx",txtManager.value);//此处想通过Ajax实现 没有成功 因为是个用户控件,这里到了
//具体的使用处,相对路径就变化了,只能使用相对于网站根目录
//的"绝对路径" 但是调试起来是404 找不到
}
var xmlhttp;
function loadXMLDoc(url,selectedValue)
{
if (window.XMLHttpRequest)
{// code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp=new XMLHttpRequest();
}
else
{// code for IE6, IE5
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.onreadystatechange=getReturn
xmlhttp.open("GET",url +"?t="+selectedValue,true);
xmlhttp.send();
}
function getReturn()
{
if (xmlhttp.readyState==4)
{
alert(xmlhttp.status);
if( xmlhttp.status==200)
{
alert("Ajax")
}
}
}
</script><%@ Register Assembly="AjaxControlToolkit" Namespace="AjaxControlToolkit" TagPrefix="cc1" %>
<asp:UpdatePanel ID="UpdatePanel1" runat="server">
<ContentTemplate>
<asp:TextBox ID="txtManager" runat="server" Width="350px"></asp:TextBox>
<cc1:AutoCompleteExtender ID="txtManager_AutoCompleteExtender" runat="server" TargetControlID="txtManager"
ServicePath="~/MyWebService.asmx" ServiceMethod="GetSimilarMemberByName" MinimumPrefixLength="1"
CompletionSetCount="10" EnableCaching="true" CompletionInterval="5" OnClientItemSelected="itemSelected">
</cc1:AutoCompleteExtender>
</ContentTemplate>
</asp:UpdatePanel>
public delegate void MyDel(); [System.Web.Script.Services.ScriptService]
public partial class Mytxt : System.Web.UI.UserControl
{
/// <summary>
/// 选择完成后触发的事件
/// </summary>
public event MyDel GetText;
protected void Page_Load(object sender, EventArgs e)
{
}
public string Text
{
get
{
return txtManager.Text;
}
set
{
txtManager.Text = value;
}
}
/// <summary>
/// 本控件调用事件
/// </summary>
protected void DoMyEvent()
{
if (GetText != null)
GetText();
}
}1.直接用<%#=……%>就不要提了,那个不和要求
2. xmlhttp.open("GET",url +"?t="+selectedValue,true);这个方法的第二个参数要用相对根目录的路径应该肿么写
相关代码<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="Mytxt.ascx.cs" Inherits="WebMemberManage.WebUserControl.Mytxt" %><script type="text/javascript">
function itemSelected(source, eventArgs)
{
var txtManager = document.getElementById(source.get_element().id); //获得当前编辑的对象
txtManager.value=txtManager.value.split('(')[0];
loadXMLDoc("~/Default.aspx",txtManager.value);//此处想通过Ajax实现 没有成功 因为是个用户控件,这里到了
//具体的使用处,相对路径就变化了,只能使用相对于网站根目录
//的"绝对路径" 但是调试起来是404 找不到
}
var xmlhttp;
function loadXMLDoc(url,selectedValue)
{
if (window.XMLHttpRequest)
{// code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp=new XMLHttpRequest();
}
else
{// code for IE6, IE5
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.onreadystatechange=getReturn
xmlhttp.open("GET",url +"?t="+selectedValue,true);
xmlhttp.send();
}
function getReturn()
{
if (xmlhttp.readyState==4)
{
alert(xmlhttp.status);
if( xmlhttp.status==200)
{
alert("Ajax")
}
}
}
</script><%@ Register Assembly="AjaxControlToolkit" Namespace="AjaxControlToolkit" TagPrefix="cc1" %>
<asp:UpdatePanel ID="UpdatePanel1" runat="server">
<ContentTemplate>
<asp:TextBox ID="txtManager" runat="server" Width="350px"></asp:TextBox>
<cc1:AutoCompleteExtender ID="txtManager_AutoCompleteExtender" runat="server" TargetControlID="txtManager"
ServicePath="~/MyWebService.asmx" ServiceMethod="GetSimilarMemberByName" MinimumPrefixLength="1"
CompletionSetCount="10" EnableCaching="true" CompletionInterval="5" OnClientItemSelected="itemSelected">
</cc1:AutoCompleteExtender>
</ContentTemplate>
</asp:UpdatePanel>
public delegate void MyDel(); [System.Web.Script.Services.ScriptService]
public partial class Mytxt : System.Web.UI.UserControl
{
/// <summary>
/// 选择完成后触发的事件
/// </summary>
public event MyDel GetText;
protected void Page_Load(object sender, EventArgs e)
{
}
public string Text
{
get
{
return txtManager.Text;
}
set
{
txtManager.Text = value;
}
}
/// <summary>
/// 本控件调用事件
/// </summary>
protected void DoMyEvent()
{
if (GetText != null)
GetText();
}
}1.直接用<%#=……%>就不要提了,那个不和要求
2. xmlhttp.open("GET",url +"?t="+selectedValue,true);这个方法的第二个参数要用相对根目录的路径应该肿么写
loadXMLDoc("/Default.aspx",
这个是相对目录吧 根目录是通过“~”来寻找的吧
02.
03.<script type="text/javascript">
04.
05. function itemSelected(source, eventArgs)
06. {
07. var txtManager = document.getElementById(source.get_element().id); //获得当前编辑的对象
08. txtManagertxtManager.value=txtManager.value.split('(')[0];
09. var a=document.getElementById("<%=lkb_Submit.ClientID %>");
10. if(a==null)
11. {
12. alert("null");
13. return;
14. }
15. a.click();
16.
17. }
18.
19.</script>
20.
21.<%@ Register Assembly="AjaxControlToolkit" Namespace="AjaxControlToolkit" TagPrefix="cc1" %>
22.<asp:UpdatePanel ID="UpdatePanel1" runat="server">
23. <ContentTemplate>
24. <asp:TextBox ID="txtManager" runat="server" Width="350px"></asp:TextBox>
25. <asp:LinkButton
26. ID="lkb_Submit" runat="server" onclick="lkb_Click"></asp:LinkButton>
27. <cc1:AutoCompleteExtender ID="txtManager_AutoCompleteExtender" runat="server" TargetControlID="txtManager"
28. ServicePath="~/MyWebService.asmx" ServiceMethod="GetSimilarMemberByName" MinimumPrefixLength="1"
29. CompletionSetCount="10" EnableCaching="true" CompletionInterval="5" OnClientItemSelected="itemSelected">
30. </cc1:AutoCompleteExtender>
31. </ContentTemplate>
32.</asp:UpdatePanel>
public delegate void MyDel();
06.
07. [System.Web.Script.Services.ScriptService]
08. public partial class Mytxt : System.Web.UI.UserControl
09. {
10. /// <summary>
11. /// 选择完成后触发的事件
12. /// </summary>
13. public event MyDel GetText;
14.
15. protected void lkb_Click(object sender, EventArgs e)
16. {
17. if (GetText != null)
18. GetText();
19. }
20.
21. protected void Page_Load(object sender, EventArgs e)
22. {
23.
24. }
25. public string Text
26. {
27. get
28. {
29. return txtManager.Text;
30. }
31. set
32. {
33. txtManager.Text = value;
34. }
35. }
36. }
再次谢谢飞哥
不过由于AjaxControlToolkit控件库中的东西在界面每次回传的时候 都Dispose了
所以在使用处 需要每次回发都要订制一遍
使用处 封装好的用户控件的id就叫做Mytxt1
01.protected void Page_Load(object sender, EventArgs e)
02. {
03. if (!IsPostBack)
04. {
05. //首次加载的时候 绑定的方法
06. }
07. Mytxt1.GetText += new WebMemberManage.WebUserControl.MyDel(Mytxt1_GetText);
08. }
09.
10. void Mytxt1_GetText()
11. {
12. //具体的绑定方法
13. }