gridview 模板列中 可否用 <img> ?  开始用的是 asp:imageButton 
如图:
现在功能都实现了, 点击 imgbtn 后  这一行的数据被读取到下面textbox 中。(gv 中有隐藏的列,也读到textbox 中了)
问题:
   发现,点击imgbtn 后 由于是服务端控件, 会有提交动作, 而我填textbox 不需要读取数据库,而且,每次刷新,用户体验也不好。所以想到,完全可以使用无刷新技术。 当点击 img / imgbtn 的时候, 就把数据填到 textbox 中。想到的方法有: js     ajax    ICallbackEventHandler决定使用 ICallbackEventHandler 实现这个功能。但写程序时遇到点问题, 如果我还用 imgbtn   ICallbackEventHandler 就没有意义, 只要是服务端控件,就一定会提交 刷新页面,
 如果用 html 的 img  那我又怎样获得 gridview 中被点击的 image  所在的行号呢?function CallServer()
 { 
     var arg = "Cognizant";
    <%= Page.ClientScript.GetCallbackEventReference(this, "arg", "ReceiveServerData", null)%>; 
}
        
function ReceiveServerData(alertContent) 
 {
    alert(alertContent);
 }       .ascx
<asp:GridView ID="gvMaintainApplicationMessages" runat="server"                             OnRowDataBound="gvMaintainApplicationMessages_RowDataBound">
   <Columns>
      <asp:TemplateField ShowHeader="False">
         <itemtemplate>
<img id="imgBridge" onclick="CallServer()" src="../Images/Bridge.gif" alt="..." /> 
</itemtemplate>
       </asp:TemplateField>
   Columns>
</asp:GridView>.cs
  private string CallBackValue = string.Empty;    #region ICallbackEventHandler Members
    string ICallbackEventHandler.GetCallbackResult()
    {
        //  System.Threading.Thread.Sleep(2000);
        return CallBackValue + ", C World!";
    }    void ICallbackEventHandler.RaiseCallbackEvent(string eventArgument)
    {
        this.CallBackValue = eventArgument;
    }
    #endregion
我现在是没有思路:----首先   根据无刷新操作的需求, gridview 模板列是否可以用 服务端控件  能的话  怎么控制不刷新
其次   如果不能用服务端控件, 用 html img 控件的话   单击 img  会调用 js CallServer()  在 CallServer 中, 我怎么获得 当前单击的行是哪一行? 如果得不到 gridview 的行号, 我也无法填下方的textbox。

解决方案 »

  1.   

    想实现什么功能?
    点gridview 中当前行中的img 后  gridview下方text显示行号?<%#Container.DataItemIndex+1 %> 为gridview当前行号
      

  2.   

    谢谢关注  明天继续  先谢谢Sandy945   明日讨论好了。 下班!
      

  3.   

    问题比较乱,主要是没有点出重点。1. 使用ICallbackEventHandler 并不需要写一行javascript代码。很可能你看到的“教材”误导了你。使用 GetCallbackEventReference就直接输出了触发客户端回调的代码,就像GetPostEventReference 方法直接输出出发客户端回发的代码一样,无需写一行javascript。2. 并不是"只要是服务端控件,就一定会提交 刷新页面",原来支持回发的控件与客户端回调根本不冲突。如果你想让imagebutton点击时在后台触发gridview的SelectIndexChanged事件怎么做?把GetPostEventReference 的输出写入imageButton的OnClientClick
    属性就行了(如果不放心,后边可以写上 +"return;")。那么同样,让后台触发某个控件的回调,只要使用GetCallbackEventReference输出触发任何目标控件的语句就行了。看来你没有在程序中使用GetPostEventReference 的经历。3. 必须自己写javascript代码将GetCallbackResult 返回的字符串变为客户端的新界面。简单的做法是可以从字符串中解析出目标控件的UniqueID和html,然后修改html对象的innerHTML属性。不过不是仅仅处理服务器端发过来的html,还要处理服务器端发过来的javascript程序。4. 之所以很少使用客户端回调,是因为它无法更新ViewState。从而,下一个回调或者回发时,后台得到的页面上某个控件状态都是页面最初被显示时的状态,而不是最近客户端操作的结果。这使得客户端回发不得不废弃,它只是asp.net ajax成熟之前的权宜之计。
      

  4.   

    在asp.net ajax正式发布之前一两年,gridview就已经提供EnableSortingAndPagingCallbacks这个属性,它是使用客户端回调的。同样,treeview也有属性可以使用客户端回调来完成ajax。你自己写,就不要使用客户端回调了,因为你不是那个有钱的微软可以比你自己写和调试相关代码多100倍的工资来找人试探着开发,你应该使用成本最低的东西,使用asp.net ajax而不是客户端回调技术。
      

  5.   

    另外要知道,客户端回调也是在服务器端重新构造整个页面的,尽管你仅仅使用GetCallbackResult 返回一个简单的字符串,你在页面上设计时用鼠标拖拉上去的所有内容(包括服务器控件以及html代码)都需要还原为服务器控件(html都是解析为一种html控件的),之后才调用你的icallbackeventhandler中的方法。唯一的不同,只是不调用Render方法输出html而已。所以,使用客户端回调并不省什么服务器资源。如果提高效率,应该使用页面页面缓存或者片段缓存,使得服务器端根本不解析和重建相关的对象,使用客户端回调没有多大好处。
      

  6.   

    GetPostEventReference   -->  GetPostbackEventReference 
      

  7.   

    谢谢关注, 决定重新看下 ICallbackEventHandler  不论这个项目用不用它 还是多掌握一点儿的好, 何况有益无害。改学下ajax了。。谢谢两位! 目前分数还没加。 准备等有了分加上后就结贴!