利用ICallbackEventHandler实现的ASP.NET非刷新交互页面.当给DataGrid中的任何控件添加客户端回调的调用时,整个页面的回调都会失效.
代码示例:1.后台代码
    public partial class StoreOut : UserControl,ICallbackEventHandler
    {
        protected string result;
        public void RaiseCallbackEvent(string strParam)
        {
            result = "AAA";
        }
        public string GetCallbackResult()
        {
            return result;
        }
    }2.页面Java脚本
<Script Language=JavaScript>
<!--
function PartSelect(strSrc,strDest)
{
document.getElementById(strDest).value=document.getElementById(strSrc).value;
<%=Page.ClientScript.GetCallbackEventReference(this,"document.getElementById(strDest)","SetClass","strDest")%>
}
function NameChanged(strSrc,nIndex,strDest)
{
//var arg=document.getElementById(strSrc).value;
//arg=arg+"_"+nIndex;
<%=Page.ClientScript.GetCallbackEventReference(this,"document.getElementById(strDest)","SetClass","strDest")%>
}
function SetClass(rValue,strDest)
{
alert("OOOOOO");
//ctrlDest=document.getElementById(strDest);
//ctrlDest.value=rValue;
}
//-->3.页面控件
<asp:DropDownList Width="80" CssClass="InputBox" ID="Ddl_Part" runat="server" />→<asp:TextBox Columns="16" CssClass="InputBox2" ID="Tb_Part" runat="server" /><asp:DataGrid id=Grid_StoreOut runat=server>
<Columns>
<asp:TemplateColumn  HeaderText="品名"><itemtemplate><asp:TextBox CssClass="InputBox2" Width="180" runat="server" /></itemtemplate></asp:TemplateColumn>
............................        
</Columns>
</asp:DataGrid>4.后台关键问题代码段
private void InitScript()
{
    Tb_SheetId.Attributes.Add("onchange", String.Format("PartSelect('{0}','{1}')", Ddl_Part.ClientID, Tb_Part.ClientID));
    Ddl_Part.Attributes.Add("onchange", String.Format("PartSelect('{0}','{1}')", Ddl_Part.ClientID, Tb_Part.ClientID));
    //((TextBox)Grid_StoreOut.Items[0].Cells[0].Controls[0]).Attributes.Add("onchange", String.Format("PartSelect('{0}','{1}')", Ddl_Part.ClientID, Tb_Part.ClientID));
}问题详细描述:
InitScript()中的第3句,取消注释"//"后,编译出来的页面包含正确的事件onchange=.....
但是,真个页面的回调完全失效.把第3句删除或注释掉时,之前的2个事件都能正确引发回调.