2011-11-09 41 views
0

这个问题一直在唠叨我好几天了。这是的情况:使用AJAX和jQuery基于输入加载数据网格

我有一个DataGrid没有数据加载到它。我也有一个Input Text,它使用AJAXjQuery来显示用户在键入时可以选择的值的现有列表。这是一个搜索系统,将根据用户输入的内容提取所有记录。然后我有一个Input Button,按下时需要填入DataGrid。我需要的AJAX是为了刷新DataGrid每次按下按钮时不刷新整个页面,因此输入而不是asp。我的问题是让JavaScript/* jQuery *调用将要使用的方法。我也需要它来获得InputText的价值并将其用于搜索。这是我迄今为止(不完整,需要帮助完成)。

数据网格(这是从另一DataGrid使用相同的数据复制,只是缩短。可能是不正确的编码。)

<asp:DataGrid ID="Display" AutoGenerateColumns="false" ViewStateMode="Disabled" runat="server"> 
     <Columns> 
      <asp:TemplateColumn> 
       <HeaderTemplate> 
        Line</HeaderTemplate> 
       <ItemTemplate> 
        <asp:Label ID="LineNumber" Text='<%# DataBinder.Eval(Container.DataItem, "LineNumber") %>' 
         runat="server" /></ItemTemplate> 
      </asp:TemplateColumn> 
      <asp:TemplateColumn> 
       <HeaderTemplate> 
        Date</HeaderTemplate> 
       <ItemTemplate> 
        <asp:Label ID="CreateDate" Text='<%# DataBinder.Eval(Container.DataItem, "CreateDate", "{0: MM/dd/yyyy}") %>' 
         runat="server" /></ItemTemplate> 
      </asp:TemplateColumn> 
      <asp:TemplateColumn> 
       <HeaderTemplate> 
        Operator</HeaderTemplate> 
       <ItemTemplate> 
        <asp:Label ID="Operator" Text='<%# DataBinder.Eval(Container.DataItem, "Operator") %>' 
         runat="server" /></ItemTemplate> 
      </asp:TemplateColumn> 
     </Columns> 
    </asp:DataGrid> 

的JavaScript/jQuery的(这被放置在Button“的 “onclick” 事件。)

function refresh() { 
      $.ajax({ 
       type: "POST", 
       url: "WebForm1.aspx/PopulateGrid", 
       data: "{}", 
       contentType: "application/json; charset=utf-8", 
       dataType: "json", 
       error: function (result) { alert(result.status + ' ' + result.statusText); } 
      } 
      ); 
     }; 

代码背后(我想尝试和使用的代码是后但如果需要处理程序,请让我知道。)

[WebMethod] 
    protected void PopulateGrid() 
    { 
     using (Entities ent = new Entities(ConfigurationManager.ConnectionStrings["QCConnString"].ToString())) 
     { 
      string oper = Request.QueryString["getData"].ToString(); 
      AllDataSources ds = new AllDataSources(); 
      Display.DataSource = ds.refreshData(ent, oper); 
      Display.DataBind(); 
     } 
    } 

,因为我更接近答案,或者已经来到了一个解决方案,我会更新这个。我真的希望有人能帮我解决这个问题。我奋斗了这么久。

+0

难道你不能只把按钮和网格放在更新面板,并填充网格的方式? –

+0

我听说使用MS AJAX不是一个好主意..所以我想尽量避免这种情况。但我会认为这是最后的手段。 – SiSan

+0

你将需要一个异步回调来完成绑定,所以我认为你没有太多的选择。您无法绑定客户端上的DataGrid。如果MS AJAX是适合您的工作的工具,您应该使用它。 –

回答

0

这不能以你现在这样做的方式完成。你将不得不使用asp.net更新面板来以ajax化的方式加载asp:datagrid。

我经常使用的另一个解决方案是摆脱asp:datagrid(如果您需要更多的支持ajax的网格)并使用jqGrid这是一个支持ajax的网格。这样你可以可以使用jquery ajax发布一个调用你的webmethods,它必须返回一个xml或json数据集。这里有很多例子,例如this one是了解网格的一些基本知识的出发点。也不要忘了jqGrid的demo page

+0

呃,我真的不相信它不能做到。它可能无法做到这一点,但有另一种方式。不,我不会使用更新面板。我听说使用MS AJAX是一个很大的不,不,所以我想只用它作为最后的手段,如果可能的话。 我也不想从DataGrid改变。这是一个使用DataGrid的主要测试项目,我已经为该DataGrid启用了日期查找和分页功能。可悲的是,页面刷新,我不希望它。 但我一定会看看jqGrid。非常感谢你的建议。 :D – SiSan

+0

也许它可以做到,但以什么价格(时间,金钱,解决方法,黑客,约束)?我从来没有看到你想要的实现,快速搜索没有给我很多希望。事实是,asp:datagrid只是不能成为ajax控件。让我们知道,如果你找到一些东西! –

+0

是的,这很好,它使得很多东西(分页,搜索,更新,编辑等)变得容易很多,但是当涉及到AJAX时,它基本上是将AJAX翻转并离开。 XD但我会尝试更多的东西,我很固执。这个页面并不是那么大,所以如果说到这一点,让它完全刷新并不是什么大问题。 :) – SiSan

0

如果你要将下面的代码放在一个通用处理程序(.ashx)中,这基本上会生成你想要的HTML。我认为这是一个非常困难的方式去做你想做的事,但它会工作。

public void ProcessRequest(System.Web.HttpContext context) 
     { 
      context.Response.Clear(); 
      context.Response.ContentType = "text/plain"; 

      //Instead of making a new DataGrid from scratch, you could also load an in-memory 
      //instance of a page with the DataGrid on it. You'd then have to get the DataGrid from that page. 
      DataGrid dg = new DataGrid(); 

      //Set up your columns based on the form values here. 
      //Instead of a DataTable, you could use any IEnumerable data source. 
      DataTable dt = new DataTable(); 
      dt.Columns.Add("TestCol"); 

      DataRow dr = dt.NewRow(); 
      dr["TestCol"] = context.Request.Form["myData"].ToString(); 
      dt.Rows.Add(dr); 

      dg.DataSource = dt; 
      dg.DataBind(); 

      //Create an in-memory target Page, then add your DataGrid to it. 
      System.Web.UI.Page p = new System.Web.UI.Page(); 
      p.Controls.Add(dg); 

      //Create a StringWriter that will contain the HTML. 
      //Execute the page, and voila, you got your rendered DataGrid. 
      StringWriter writer = new StringWriter(); 
      context.Server.Execute(p, writer, false); 

      context.Response.Write(writer.ToString()); 
      context.Response.End(); 

     } 
+0

Baw,非常接近。不幸的是,DataGrid不想改变。为什么DataGrid? Whhhyyyyy? – SiSan