回调实现无刷新级联下拉框(.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;
    }
}

 

posted @ 2008-01-22 14:56  CoderWayne  阅读(324)  评论(0编辑  收藏  举报