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。
如图:
现在功能都实现了, 点击 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。
点gridview 中当前行中的img 后 gridview下方text显示行号?<%#Container.DataItemIndex+1 %> 为gridview当前行号
属性就行了(如果不放心,后边可以写上 +"return;")。那么同样,让后台触发某个控件的回调,只要使用GetCallbackEventReference输出触发任何目标控件的语句就行了。看来你没有在程序中使用GetPostEventReference 的经历。3. 必须自己写javascript代码将GetCallbackResult 返回的字符串变为客户端的新界面。简单的做法是可以从字符串中解析出目标控件的UniqueID和html,然后修改html对象的innerHTML属性。不过不是仅仅处理服务器端发过来的html,还要处理服务器端发过来的javascript程序。4. 之所以很少使用客户端回调,是因为它无法更新ViewState。从而,下一个回调或者回发时,后台得到的页面上某个控件状态都是页面最初被显示时的状态,而不是最近客户端操作的结果。这使得客户端回发不得不废弃,它只是asp.net ajax成熟之前的权宜之计。