ajax返回dataset绑定给datalist怎么实现? 本帖最后由 woshizhangxinhan 于 2009-06-19 10:33:33 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 似乎AJAX只能返回一个字符串……直接返回一个dataset似乎没见过…… UPDATEPANEL,还有个叫什么PROCESS的,都是AJAX控件,很简单的 先在后台绑定datalist,然后用datalist的RenderControl方法向客户端js发送内容 吧你的datalist放在updatepanel里邊就會自動部分刷新,而不會提交頁面 返回的都是字符串但是你的dataset可以在后台绑定 然都render一下就是字符串(html) 然后用JS跟制定的标签赋值这个表格就显示出来了 <script> function turnPage(pageIndex){ CallServer(pageIndex,'content'); } function ReceiveCallback(arg,context){ var container = document.getElementById(context); //alert(arg + " " + context); container.innerHTML = arg; } </script><div id="content"> <asp:Repeater ID="List" runat="server" OnItemDataBound="List_ItemDataBound"> <ItemTemplate> <div> 用户名:<asp:Label ID="NickName" runat="server"></asp:Label> QQ号:<asp:Label ID="QNumber" runat="server"></asp:Label> </div> </ItemTemplate> </asp:Repeater> </div> <asp:Literal ID="Pager" runat="server"></asp:Literal>using System.Text;using System.IO;using System.Globalization;public partial class Ajax1 : System.Web.UI.Page, System.Web.UI.ICallbackEventHandler { //每页显示记录数 static int PAGESIZE = 4; DataTable dt = null; private int currentPageIndex; protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { BindList(1, true); //获取用于回调的 string callbackReference = ClientScript.GetCallbackEventReference(this, "arg", "ReceiveCallback", "context", false); string callbackScript = string.Format("function CallServer(arg,context){{ {0} }}", callbackReference); ClientScript.RegisterClientScriptBlock(this.GetType(), "CallServer", callbackScript, true); } } /**/ /// <summary> /// 绑定列表 /// </summary> /// <param name="pageIndex">翻页页码</param> /// <param name="needRender">是否需要重画分页面码</param> protected void BindList(int pageIndex, bool needRender) { DataTable dt = GetData(); //计算总页数 int pages = (dt.Rows.Count % PAGESIZE == 0) ? dt.Rows.Count / PAGESIZE : (dt.Rows.Count / PAGESIZE) + 1; if (needRender) RenderPager(pages); if (pageIndex > pages) pageIndex = pages; else if (pageIndex < 1) pageIndex = 1; int startId = (pageIndex - 1) * PAGESIZE + 1; int endId = pageIndex * PAGESIZE; DataRow[] rows = dt.Select(string.Format("id>={0} and id<={1}", startId, endId)); List.DataSource = rows; List.DataBind(); } /**/ /// <summary> /// 画出分页页码 /// </summary> /// <param name="pages"></param> protected void RenderPager(int pages) { StringBuilder sb = new StringBuilder(); int pageIndex = 1; do { sb.AppendFormat("<a href='javascript:turnPage({0});'>{0}</a> ", pageIndex); } while (pageIndex++ < pages); Pager.Text = sb.ToString(); } /**/ /// <summary> /// 初始化一个DataTable作数据源 /// </summary> protected DataTable GetData() { if (null == Cache["Data"]) { dt = new DataTable(); dt.Columns.Add("ID", typeof(int)); dt.Columns.Add("NickName", typeof(string)); dt.Columns.Add("QNumber", typeof(string)); DataRow row = dt.NewRow(); row["ID"] = 1; row["NickName"] = "人物1"; row["QNumber"] = "21243468"; dt.Rows.Add(row); row = dt.NewRow(); row["ID"] = 2; row["NickName"] = "人物2"; row["QNumber"] = "9058307"; dt.Rows.Add(row); row = dt.NewRow(); row["ID"] = 3; row["NickName"] = "人物3"; row["QNumber"] = "21243468"; dt.Rows.Add(row); row = dt.NewRow(); row["ID"] = 4; row["NickName"] = "人物4"; row["QNumber"] = "22526451"; dt.Rows.Add(row); row = dt.NewRow(); row["ID"] = 5; row["NickName"] = "人物5"; row["QNumber"] = "254852182"; dt.Rows.Add(row); row = dt.NewRow(); row["ID"] = 6; row["NickName"] = "人物6"; row["QNumber"] = "81461006"; dt.Rows.Add(row); row = dt.NewRow(); row["ID"] = 7; row["NickName"] = "人物7"; row["QNumber"] = "375772376"; dt.Rows.Add(row); row = dt.NewRow(); row["ID"] = 8; row["NickName"] = "人物8"; row["QNumber"] = "153534649"; dt.Rows.Add(row); row = dt.NewRow(); row["ID"] = 9; row["NickName"] = "人物9"; row["QNumber"] = "619468"; dt.Rows.Add(row); row = dt.NewRow(); row["ID"] = 10; row["NickName"] = "人物10"; row["QNumber"] = "83223563"; dt.Rows.Add(row); Cache["Data"] = dt; } else { dt = Cache["Data"] as DataTable; } return dt; } #region 实现ICallbackEventHandler 成员RaiseCallbackEvent public void RaiseCallbackEvent(string eventArgument) { currentPageIndex = Convert.ToInt32(eventArgument); BindList(currentPageIndex, false); } public string GetCallbackResult() { //返回再次绑定后的Repeater的表现内容 return RenderControl(List); } #endregion protected void List_ItemDataBound(object sender, RepeaterItemEventArgs e) { if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) { Label NickName = e.Item.FindControl("NickName") as Label; Label QNumber = e.Item.FindControl("QNumber") as Label; DataRow row = e.Item.DataItem as DataRow; NickName.Text = row["NickName"].ToString(); QNumber.Text = row["QNumber"].ToString(); } } /**/ /// <summary> /// 获取指定控件重画的内容 /// </summary> /// <param name="control"></param> /// <returns></returns> private string RenderControl(Control control) { StringWriter writer1 = new StringWriter(CultureInfo.InvariantCulture); HtmlTextWriter writer2 = new HtmlTextWriter(writer1); control.RenderControl(writer2); writer2.Flush(); writer2.Close(); return writer1.ToString(); } } 楼主看不懂8楼的代码?浪费我时间贴了我贴子8楼的代码不就是利用RenderControl方法像客户端发送内容? UPDATEPANEL 听说才不好呢 我不想用 5555 楼上很可爱 我遇见你几次叻 呵呵 呵呵,不知道你是听谁说不好的,他说的不好是因为用UpdatePanel要生成很多脚本吗?但即使你自己在前台写ajax,也是要很多脚本的,而且你是要绑定DataList,就更不好写了 用过,不过别人说UpdatePanel效率很低 建议不要使用 我后来就没用了8楼那个方法很帅我刚刚试验,成功了,不过我不知道是什么原理希望有人能加我Q 给我讲讲 郁闷 本帖最后由 Sandy945 于 2011-12-14 15:26:35 编辑 干嘛要我加你啊?UpdatePanel比较简单,但个人觉得加载的东西比较多,如果是前端web页面,追求性能比较高,会有点影响我说的那个方法主要2点,一个是继承ICallbackEventHandler接口,还有就是RaiseCallbackEvent方法通过rendercontrol重新加载控件 那ICallbackEventHandler跟ajax的区别是什么 这个我解释不了,问ojlovecd吧ICallbackEventHandler是.NET提供的一个接口,他包含2个方法,一获取客户端的数据,一个向客户端发送数据区别嘛,我也不清楚 那你这么说我,都用ICallbackEventHandler就好了哇,因为ajax好麻烦的 ajax相对来说相当,容易上手微软的ajax控件,已经算相当傻瓜化了视情况,有时用Updatepanel也不错哦。 不要 用UpdatePanel啊,你用Ajax去请求服务器,返回XML,再在页面(JS)上去解析XML,手动的生成Table不是更好吗>.. 一般情况下少用那些AJAX控件,那些控件效率实在不敢恭维...... ajax鬼了,拖杂ajax控件就喊ajax实现无刷新;宝气了,ajax控件在服务端会动态生成很多jscript;加载时会增加页面的加载速度,有种自己在jscript里面拼好像datalist一样的效果然后把它赋值给div;当然咯div你的把它转为服务控件。 标准表达式中数据类型不匹配问题 如何消除相对定位所占据的位置 vb.net作的asp.net系统,数据库 asp.net 网站的格式控制,控件布局和数据库联接的资料.....急,资料一经采用,立即加分,骗你我是你耷拉孙 现在大家用的VS.NET 2005都是什么版本的,今天发布的是什么版本的? 怎样实现广告点击记录 在更新数据库的一个表时,总出现这样的错误,??? 请给初学者举treeview一例 求救!!!!关于Remoting中的问题 不大不小的问题,这个东西是怎么出来的啊? 怎么限制每个用户只能“顶一下”文章? 在线等 c# .net 2008 如何用owc Excel
但是你的dataset可以在后台绑定 然都render一下就是字符串(html) 然后用JS跟制定的标签赋值
这个表格就显示出来了
<script>
function turnPage(pageIndex){
CallServer(pageIndex,'content');
}
function ReceiveCallback(arg,context){
var container = document.getElementById(context);
//alert(arg + " " + context);
container.innerHTML = arg;
}
</script>
<div id="content">
<asp:Repeater ID="List" runat="server" OnItemDataBound="List_ItemDataBound">
<ItemTemplate>
<div>
用户名:<asp:Label ID="NickName" runat="server"></asp:Label>
QQ号:<asp:Label ID="QNumber" runat="server"></asp:Label>
</div>
</ItemTemplate>
</asp:Repeater>
</div>
<asp:Literal ID="Pager" runat="server"></asp:Literal>
using System.Text;
using System.IO;
using System.Globalization;
public partial class Ajax1 : System.Web.UI.Page, System.Web.UI.ICallbackEventHandler
{ //每页显示记录数
static int PAGESIZE = 4;
DataTable dt = null;
private int currentPageIndex;
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
BindList(1, true);
//获取用于回调的
string callbackReference = ClientScript.GetCallbackEventReference(this, "arg", "ReceiveCallback", "context", false);
string callbackScript = string.Format("function CallServer(arg,context){{ {0} }}", callbackReference);
ClientScript.RegisterClientScriptBlock(this.GetType(), "CallServer", callbackScript, true); }
} /**/
/// <summary>
/// 绑定列表
/// </summary>
/// <param name="pageIndex">翻页页码</param>
/// <param name="needRender">是否需要重画分页面码</param>
protected void BindList(int pageIndex, bool needRender)
{
DataTable dt = GetData();
//计算总页数
int pages = (dt.Rows.Count % PAGESIZE == 0) ? dt.Rows.Count / PAGESIZE : (dt.Rows.Count / PAGESIZE) + 1;
if (needRender)
RenderPager(pages); if (pageIndex > pages)
pageIndex = pages;
else if (pageIndex < 1)
pageIndex = 1;
int startId = (pageIndex - 1) * PAGESIZE + 1;
int endId = pageIndex * PAGESIZE; DataRow[] rows = dt.Select(string.Format("id>={0} and id<={1}", startId, endId));
List.DataSource = rows;
List.DataBind();
} /**/
/// <summary>
/// 画出分页页码
/// </summary>
/// <param name="pages"></param>
protected void RenderPager(int pages)
{
StringBuilder sb = new StringBuilder();
int pageIndex = 1;
do
{
sb.AppendFormat("<a href='javascript:turnPage({0});'>{0}</a> ", pageIndex);
} while (pageIndex++ < pages); Pager.Text = sb.ToString();
} /**/
/// <summary>
/// 初始化一个DataTable作数据源
/// </summary>
protected DataTable GetData()
{
if (null == Cache["Data"])
{
dt = new DataTable();
dt.Columns.Add("ID", typeof(int));
dt.Columns.Add("NickName", typeof(string));
dt.Columns.Add("QNumber", typeof(string)); DataRow row = dt.NewRow();
row["ID"] = 1;
row["NickName"] = "人物1";
row["QNumber"] = "21243468";
dt.Rows.Add(row); row = dt.NewRow();
row["ID"] = 2;
row["NickName"] = "人物2";
row["QNumber"] = "9058307";
dt.Rows.Add(row); row = dt.NewRow();
row["ID"] = 3;
row["NickName"] = "人物3";
row["QNumber"] = "21243468";
dt.Rows.Add(row); row = dt.NewRow();
row["ID"] = 4;
row["NickName"] = "人物4";
row["QNumber"] = "22526451";
dt.Rows.Add(row); row = dt.NewRow();
row["ID"] = 5;
row["NickName"] = "人物5";
row["QNumber"] = "254852182";
dt.Rows.Add(row); row = dt.NewRow();
row["ID"] = 6;
row["NickName"] = "人物6";
row["QNumber"] = "81461006";
dt.Rows.Add(row); row = dt.NewRow();
row["ID"] = 7;
row["NickName"] = "人物7";
row["QNumber"] = "375772376";
dt.Rows.Add(row); row = dt.NewRow();
row["ID"] = 8;
row["NickName"] = "人物8";
row["QNumber"] = "153534649";
dt.Rows.Add(row); row = dt.NewRow();
row["ID"] = 9;
row["NickName"] = "人物9";
row["QNumber"] = "619468";
dt.Rows.Add(row); row = dt.NewRow();
row["ID"] = 10;
row["NickName"] = "人物10";
row["QNumber"] = "83223563";
dt.Rows.Add(row); Cache["Data"] = dt;
}
else
{
dt = Cache["Data"] as DataTable;
}
return dt;
} #region 实现ICallbackEventHandler 成员RaiseCallbackEvent public void RaiseCallbackEvent(string eventArgument)
{
currentPageIndex = Convert.ToInt32(eventArgument);
BindList(currentPageIndex, false);
} public string GetCallbackResult()
{
//返回再次绑定后的Repeater的表现内容
return RenderControl(List);
}
#endregion protected void List_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
{
Label NickName = e.Item.FindControl("NickName") as Label;
Label QNumber = e.Item.FindControl("QNumber") as Label; DataRow row = e.Item.DataItem as DataRow;
NickName.Text = row["NickName"].ToString();
QNumber.Text = row["QNumber"].ToString();
}
} /**/
/// <summary>
/// 获取指定控件重画的内容
/// </summary>
/// <param name="control"></param>
/// <returns></returns>
private string RenderControl(Control control)
{
StringWriter writer1 = new StringWriter(CultureInfo.InvariantCulture);
HtmlTextWriter writer2 = new HtmlTextWriter(writer1); control.RenderControl(writer2);
writer2.Flush();
writer2.Close(); return writer1.ToString();
}
}
浪费我时间贴了
我贴子8楼的代码不就是利用RenderControl方法像客户端发送内容?
呵呵,不知道你是听谁说不好的,他说的不好是因为用UpdatePanel要生成很多脚本吗?但即使你自己在前台写ajax,也是要很多脚本的,而且你是要绑定DataList,就更不好写了
用过,不过别人说UpdatePanel效率很低 建议不要使用 我后来就没用了8楼那个方法很帅我刚刚试验,成功了,不过我不知道是什么原理希望有人能加我Q 给我讲讲 郁闷
UpdatePanel比较简单,但个人觉得加载的东西比较多,如果是前端web页面,追求性能比较高,会有点影响
我说的那个方法主要2点,一个是继承ICallbackEventHandler接口,还有就是RaiseCallbackEvent方法
通过rendercontrol重新加载控件
那ICallbackEventHandler跟ajax的区别是什么
ICallbackEventHandler是.NET提供的一个接口,他包含2个方法,一获取客户端的数据,一个向客户端发送数据
区别嘛,我也不清楚
那你这么说我,都用ICallbackEventHandler就好了哇,因为ajax好麻烦的
微软的ajax控件,已经算相当傻瓜化了
视情况,有时用Updatepanel也不错哦。