本帖最后由 woshizhangxinhan 于 2009-06-19 10:33:33 编辑

解决方案 »

  1.   

    似乎AJAX只能返回一个字符串……直接返回一个dataset似乎没见过……
      

  2.   

    UPDATEPANEL,还有个叫什么PROCESS的,都是AJAX控件,很简单的
      

  3.   

    先在后台绑定datalist,然后用datalist的RenderControl方法向客户端js发送内容
      

  4.   

    吧你的datalist放在updatepanel里邊就會自動部分刷新,而不會提交頁面
      

  5.   

    返回的都是字符串
    但是你的dataset可以在后台绑定 然都render一下就是字符串(html) 然后用JS跟制定的标签赋值
    这个表格就显示出来了 
      

  6.   


    <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>&nbsp;&nbsp;", 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();
            }
        }
      

  7.   

    楼主看不懂8楼的代码?
    浪费我时间贴了
    我贴子8楼的代码不就是利用RenderControl方法像客户端发送内容?
      

  8.   

    UPDATEPANEL 听说才不好呢 我不想用 5555 楼上很可爱 我遇见你几次叻 呵呵 
      

  9.   


    呵呵,不知道你是听谁说不好的,他说的不好是因为用UpdatePanel要生成很多脚本吗?但即使你自己在前台写ajax,也是要很多脚本的,而且你是要绑定DataList,就更不好写了
      

  10.   


    用过,不过别人说UpdatePanel效率很低 建议不要使用 我后来就没用了8楼那个方法很帅我刚刚试验,成功了,不过我不知道是什么原理希望有人能加我Q 给我讲讲 郁闷
      

  11.   

    本帖最后由 Sandy945 于 2011-12-14 15:26:35 编辑
      

  12.   

    干嘛要我加你啊?
    UpdatePanel比较简单,但个人觉得加载的东西比较多,如果是前端web页面,追求性能比较高,会有点影响
    我说的那个方法主要2点,一个是继承ICallbackEventHandler接口,还有就是RaiseCallbackEvent方法
    通过rendercontrol重新加载控件
      

  13.   


    那ICallbackEventHandler跟ajax的区别是什么
      

  14.   

    这个我解释不了,问ojlovecd
    ICallbackEventHandler是.NET提供的一个接口,他包含2个方法,一获取客户端的数据,一个向客户端发送数据
    区别嘛,我也不清楚
      

  15.   


    那你这么说我,都用ICallbackEventHandler就好了哇,因为ajax好麻烦的
      

  16.   

    ajax相对来说相当,容易上手
    微软的ajax控件,已经算相当傻瓜化了
    视情况,有时用Updatepanel也不错哦。
      

  17.   

    不要 用UpdatePanel啊,你用Ajax去请求服务器,返回XML,再在页面(JS)上去解析XML,手动的生成Table不是更好吗>..
      

  18.   

    一般情况下少用那些AJAX控件,那些控件效率实在不敢恭维......
      

  19.   

    ajax鬼了,拖杂ajax控件就喊ajax实现无刷新;宝气了,ajax控件在服务端会动态生成很多jscript;加载时会增加页面的加载速度,有种自己在jscript里面拼好像datalist一样的效果然后把它赋值给div;当然咯div你的把它转为服务控件。