ASP.net динамические выпадающие списки, как использовать вместо этого JQuery и AJAX? - PullRequest
1 голос
/ 08 октября 2009

Я написал некоторый код, который работает с использованием панелей обновления ASP.Net, C # и AJAX. Я создал этот пользовательский элемент управления, в котором ретранслятор заполняется содержимым таблицы данных BusinessTier. Для каждого бизнес-уровня существуют связанные бизнес-уровни, которые заполняют раскрывающийся список из таблицы данных BusinessLevel. Один бизнес-уровень является родительским для набора бизнес-уровней, и бизнес-уровень указывает, где в иерархии находится каждый набор бизнес-уровней. Уровень 1 - это Компания, а бизнес-уровень - это название компании. Уровень 2 - это бизнес, и каждый из связанных бизнес-уровней для уровня 2 будет содержать родительский бизнес-уровень, назначенный на уровне 1. И так далее. Я надеюсь это имеет смысл! Эти раскрывающиеся списки бизнес-уровня являются каскадными раскрывающимися списками. Однако элемент управления раскрывающегося списка AJAX нельзя использовать, поскольку при начальной загрузке формы многие из этих раскрывающихся списков будут назначены во время выполнения. Также количество выпадающих списков также динамически определяется во время выполнения, в зависимости от содержимого базы данных. Таким образом, для каждого события SelectedIndexChanged должна быть обратная передача, чтобы пересчитать новое содержимое выпадающих списков. Код ниже работает. Эти постбэки могут содержаться в панели обновлений, и элемент управления в порядке, я могу его использовать. Тем не мение ... Должен быть лучший способ использования AJAX и JQuery, и при этом вообще не иметь всех этих обратных передач? Если так, то как? Я хочу узнать больше об AJAX и JQuery, поэтому, если у вас есть решение, я буду рад его увидеть. Код ниже;

<%@ Control Language="C#" AutoEventWireup="true" 
     CodeBehind="BusinessLevelSelection.ascx.cs" 
                Inherits="TestLinq.BusinessLevelSelection" %>
<div id="mainleft">
  <fieldset style="width:200px;padding:3px">
      <legend>Business Level</legend>  
      <asp:UpdatePanel runat="server" ID="updBusinessLevels">
      <ContentTemplate>
      <asp:Repeater runat="server" ID="rpDropDowns" 
        OnItemDataBound="rpDropDowns_OnItemDataBound"
        >
        <ItemTemplate>
            <h2><%#  DataBinder.Eval(Container.DataItem, "NameFull")%></h2>
            <div>
                <asp:DropDownList runat="server" ID="ddlBusinessLevels" 
                 AutoPostBack="true" 
                    OnSelectedIndexChanged="ddlBusinessLevels_SelectedIndexChanged"
                    ToolTip='<%#  DataBinder.Eval(Container.DataItem, "NameFull")%>'
                />
            </div>
        </ItemTemplate>
      </asp:Repeater></ContentTemplate></asp:UpdatePanel>
  </fieldset>

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using ClassLibraryBusinessLevels;

namespace TestLinq
{
    public partial class BusinessLevelSelection : System.Web.UI.UserControl
    {
        public int SelectedBusinessLevelId
        {
            get;
            set;
        }

        public int? ParentBusinessLevelId
        {
            get;
            set;
        }

        protected void Page_Load(object sender, EventArgs e)
        {
            if (IsPostBack == false)
                LoadData();
        }

        private void LoadData()
        {
            BOL.GetBusinessLevelTiers();
            LoadDataLatest();
        }

        /// <summary>
        /// LoadDataLatest() - Loads the latest data, either from the initial load, 
        ///                     or from the change in the business level selection event
        /// </summary>
        private void LoadDataLatest()
        {
            BOL.GetBusinessLevels(this.SelectedBusinessLevelId);

            this.ParentBusinessLevelId = null;

            rpDropDowns.DataSource = BOL.blTiers;
            rpDropDowns.DataBind();
        }

        protected void rpDropDowns_OnItemDataBound(Object Sender, RepeaterItemEventArgs e)
        {
            // Execute the following logic for Items and Alternating Items.
            if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
            {
                PopulateDropDownList(e.Item.FindControl("ddlBusinessLevels") as DropDownList, e.Item.ItemIndex);
            }
        }

        private void PopulateDropDownList(DropDownList ddlBusinessLevels, int index)
        {
            if (index <= BOL.blCollection.Count)
            {
                ddlBusinessLevels.DataSource =
                    BOL.GetBusinessLevelsForDropDowns(index, this.ParentBusinessLevelId);
                ddlBusinessLevels.DataValueField = "BusinessLevelId";
                ddlBusinessLevels.DataTextField = "BusinessLevelName";
                ddlBusinessLevels.DataBind();

                if (index < BOL.blCollection.Count)
                {
                    ddlBusinessLevels.SelectedValue = BOL.blCollection[index].BusinessLevelId.ToString();
                    this.ParentBusinessLevelId = BOL.blCollection[index].BusinessLevelId;
                }
            }
            ddlBusinessLevels.Items.Insert(0, new ListItem("Please enter your selection", "0"));
        }

        protected void ddlBusinessLevels_SelectedIndexChanged(object sender, EventArgs e)
        {
            DropDownList ddlBusinessLevels = (DropDownList)sender;
            this.SelectedBusinessLevelId = Convert.ToInt32(ddlBusinessLevels.SelectedValue);
            this.LoadDataLatest();
        }
    }
}

1 Ответ

0 голосов
/ 09 октября 2009

Вот как использовать jQuery с каскадными списками DropDownLists: http://www.mikesdotnetting.com/Article/97/Cascading-DropDownLists-with-jQuery-and-ASP.NET

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...