回调实现无刷新级联下拉框(.net)
以northwind数据库为例。选择分类下拉框的一项后,无刷新更改产品下拉框的显示。
前台代码:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" > <head runat="server"> <title>无标题页</title> <script type="text/javascript"> function CallServer(args,context) { context.innerHTML = "Loading..."; <%= ClientScript.GetCallbackEventReference(this,"args","GetServerData","context") %> } function GetServerData(result,context) { context.innerHTML = result; } </script> </head> <body> <form id="form1" runat="server"> <div> <asp:DropDownList ID="ddlCategory" runat="server"></asp:DropDownList> <span id="pnlProduct"> <asp:DropDownList ID="ddlProduct" runat="server"></asp:DropDownList> </span> </div> </form> </body> </html>
后台代码:
using System; using System.Data; using System.Data.SqlClient; using System.IO; using System.Configuration; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Web.UI.HtmlControls; public partial class _Default : System.Web.UI.Page,ICallbackEventHandler { protected string callbackResult; protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { BindToCategory(); this.ddlCategory.Attributes.Add("onchange", "CallServer(this.value,pnlProduct)"); this.ddlProduct.Items.Add(new ListItem("--产品--", "-1")); } } /// <summary> /// 绑定分类 /// </summary> private void BindToCategory() { SqlConnection conn = new SqlConnection("Server=(local);database=northwind;uid=sa;pwd=123"); SqlDataAdapter sda = new SqlDataAdapter("SELECT categoryID,categoryName FROM categories", conn); DataTable dt = new DataTable(); sda.Fill(dt); this.ddlCategory.DataSource = dt; this.ddlCategory.DataTextField = "categoryName"; this.ddlCategory.DataValueField = "categoryID"; this.ddlCategory.DataBind(); this.ddlCategory.Items.Insert(0, new ListItem("--分类--", "-1")); } private void BindToProduct(int categoryID) { SqlConnection conn = new SqlConnection("Server=(local);database=northwind;uid=sa;pwd=123"); SqlDataAdapter sda = new SqlDataAdapter("SELECT productID,productName FROM products WHERE categoryID=" + categoryID, conn); DataTable dt = new DataTable(); sda.Fill(dt); this.ddlProduct.DataSource = dt; this.ddlProduct.DataTextField = "productName"; this.ddlProduct.DataValueField = "productID"; this.ddlProduct.DataBind(); if (ddlProduct.Items.Count == 0) { this.ddlProduct.Items.Add(new ListItem("--产品--", "-1")); } } private string RenderElement(Control control) { StringWriter writer = new StringWriter(); HtmlTextWriter output = new HtmlTextWriter(writer); control.RenderControl(output); output.Flush(); output.Close(); string htmlCode = writer.ToString(); writer.Close(); return htmlCode; } void ICallbackEventHandler.RaiseCallbackEvent(string str) { this.callbackResult = str; } string ICallbackEventHandler.GetCallbackResult() { int categoryID = Convert.ToInt32(callbackResult); BindToProduct(categoryID); callbackResult = RenderElement(this.ddlProduct); return callbackResult; } }