Работа с выпадающим списком в C # ASP.NET - PullRequest
0 голосов
/ 24 июня 2011

У меня есть 3 выпадающих списка и одно изображение.Сначала ddl (марки: BMW, AUDI, VAZ) получает свои данные из SQL Server и устанавливает selectedIndex = 0.Второй ddl (модели: A6, TT, Z4, X5 и т. Д.) Зависит от первого ddl.Если пользователь выбирает index = 0 (AUDI) в первом ddl, то второй ddl показывает A6 и TT.Третий ddl (цвета) зависит от второго ddl.Если пользователь select index = 0 (AUDI) в первом ddl и select index = 1 (TT) во втором ddl, то третий ddl показывает синий и серебристый цвета.Изображение зависит от всех трех ddl.Как это реализовать?

Мой код:

пространство имен DynamicWebApplication {открытый частичный класс RentForm: System.Web.UI.Page {открытый статический флаг bool = false;IBLClient frontEnd = new FrontEnd ();

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!this.IsPostBack)
        {
            StampOfCarsDropDownList.DataSource = SqlDataSource1;
            StampOfCarsDropDownList.DataValueField = "Stamp";
            StampOfCarsDropDownList.DataTextField = "Stamp";
            StampOfCarsDropDownList.DataBind();

            if (StampOfCarsDropDownList.SelectedIndex == -1)
            {
                StampOfCarsDropDownList.SelectedIndex = 0;
                ModelOfCarsDropDownList.SelectedIndex = 0;
                ColorOfCarsDropDownList.SelectedIndex = 0;
            }

            ListItem stampOfCar = StampOfCarsDropDownList.Items[StampOfCarsDropDownList.SelectedIndex];
            string stamp = stampOfCar.Text;
            foreach (RentCar c in frontEnd.GetListOfModels(stamp))
            {
                ListItem temp = new ListItem(c.Model);
                if (!ModelOfCarsDropDownList.Items.Contains(temp))
                    ModelOfCarsDropDownList.Items.Add(temp);
            }

            ListItem modelOfCar = ModelOfCarsDropDownList.Items[ModelOfCarsDropDownList.SelectedIndex];
            string model = modelOfCar.Text;
            foreach (RentCar c in frontEnd.GetListOfModels(stamp))
            {
                ListItem temp = new ListItem(c.Color);
                if ((c.Model == model) && (!ColorOfCarsDropDownList.Items.Contains(temp)))
                    ColorOfCarsDropDownList.Items.Add(temp);
            }

            //UploadImage(stamp, model, ColorOfCarsDropDownList.Items[ColorOfCarsDropDownList.SelectedIndex].Text);
        }
    }

    protected void ColorOfCarsDropDownList_SelectedIndexChanged(object sender, EventArgs e)
    {
        ListItem stampOfCar = StampOfCarsDropDownList.Items[StampOfCarsDropDownList.SelectedIndex];
        string stamp = stampOfCar.Text;
        ListItem modelOfCar = ModelOfCarsDropDownList.Items[ModelOfCarsDropDownList.SelectedIndex];
        string model = modelOfCar.Text;
        ListItem colorOfCar = ColorOfCarsDropDownList.Items[ColorOfCarsDropDownList.SelectedIndex];
        string color = colorOfCar.Text;

        //UploadImage(stamp, model, color);
    }

    protected void ModelOfCarsDropDownList_SelectedIndexChanged(object sender, EventArgs e)
    {
        ColorOfCarsDropDownList.Items.Clear();
        ColorOfCarsDropDownList.SelectedIndex = 0;
        ListItem stampOfCar = StampOfCarsDropDownList.Items[StampOfCarsDropDownList.SelectedIndex];
        string stamp = stampOfCar.Text;
        ListItem modelOfCar = ModelOfCarsDropDownList.Items[ModelOfCarsDropDownList.SelectedIndex];
        string model = modelOfCar.Text;

        foreach (RentCar c in frontEnd.GetListOfModels(stamp))
        {
            ListItem temp = new ListItem(c.Color);
            if (c.Model == model)
                ColorOfCarsDropDownList.Items.Add(temp);
        }

        //UploadImage(stamp, model, ColorOfCarsDropDownList.Items[ColorOfCarsDropDownList.SelectedIndex].Text);
    }

    protected void StampOfCarsDropDownList_SelectedIndexChanged(object sender, EventArgs e)
    {
        ModelOfCarsDropDownList.Items.Clear();
        ModelOfCarsDropDownList.SelectedIndex = 0;
        ColorOfCarsDropDownList.Items.Clear();
        ColorOfCarsDropDownList.SelectedIndex = 0;

        ListItem stampOfCar = StampOfCarsDropDownList.Items[StampOfCarsDropDownList.SelectedIndex];
        string stamp = stampOfCar.Text;
        foreach (RentCar c in frontEnd.GetListOfModels(stamp))
        {
            ListItem temp = new ListItem(c.Model);
            if (!ModelOfCarsDropDownList.Items.Contains(temp))
                ModelOfCarsDropDownList.Items.Add(temp);
        }

        ListItem modelOfCar = ModelOfCarsDropDownList.Items[ModelOfCarsDropDownList.SelectedIndex];
        string model = modelOfCar.Text;
        foreach (RentCar c in frontEnd.GetListOfModels(stamp))
        {
            ListItem temp = new ListItem(c.Color);
            if (c.Model == model)
                ColorOfCarsDropDownList.Items.Add(temp);
        }

    //    UploadImage(stamp, model, ColorOfCarsDropDownList.Items[ColorOfCarsDropDownList.SelectedIndex].Text);
    }

    //protected void UploadImage(string stamp, string model, string color)
    //{
    //    byte[] fileBytes;
    //    foreach (RentCar c in frontEnd.GetListOfModels(stamp))
    //    {
    //        if ((c.Model == model) && (c.Stamp == stamp) && (c.Color == color))
    //        {
    //            fileBytes = (byte[])c.CarImage.ToArray();
    //            Stream msIn = new MemoryStream(fileBytes);
    //            msIn.Write(fileBytes, 0, fileBytes.Length);
    //            System.Drawing.Image im = System.Drawing.Image.FromStream(msIn);
    //            im.Save("C:/Users/Nickolay/Documents/Visual Studio 2010/Projects/RentCars/DynamicWebApplication/DBImages/CarImage" + c.Stamp + c.Model + c.Color + ".jpeg");
    //            carImage.ImageUrl = "DBImages/CarImage" + c.Stamp + c.Model + c.Color + ".jpeg";
    //        }
    //    }
    //}

}

}

Я не понимаю, что здесь не так.Я использовал AutoPostBack.Если я выбираю пункт из ddl, я получаю пустые ddls.

Извините за мой вопрос.Я нашел решение своей проблемы.Это была маленькая вещь.Я забыл установить EnableViewState = "true" на главной странице :( Поэтому я получил пустые ddls, когда выбранные элементы (ddls не запускают события)

Ответы [ 3 ]

1 голос
/ 24 июня 2011

Вы должны использовать свойства AutoPostBack и OnSelectedIndexChanged элемента управления DropDownList.

Пример

Разметка

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="default.aspx.cs" Inherits="Test.Default" %>
<!DOCTYPE html>
<html>
    <head runat="server">
        <title>Test</title>
    </head>
    <body>
        <form runat="server">
            <h1>Test</h1>
            <asp:DropDownList ID="First"
                              AutoPostBack="true"
                              DataTextField="FieldA"
                              DataValueField="FieldB"
                              OnSelectedIndexChanged="First_SelectedIndexChanged"
                              runat="server" />
            <asp:DropDownList ID="Second"
                              AutoPostBack="true"
                              DataTextField="FieldA"
                              DataValueField="FieldB"
                              OnSelectedIndexChanged="Second_SelectedIndexChanged"
                              runat="server" />
        </form>
    </body>
</html>

Код позади

namespace Test
{
    using System;
    using System.Web.UI;
    using System.Web.UI.WebControls;

    public partial class Default : Page
    {
        protected void Page_Load(Object sender, EventArgs e)
        {
            if (!this.IsPostBack)
            {
                this.First.DataSource = null;

                this.First.DataBind();
            }
        }

        protected void First_SelectedIndexChanged(Object sender, EventArgs e)
        {
            String selectedValue = (sender as DropDownList).SelectedValue;

            // Use dataValue when getting the data for the second drop down.
            this.Second.DataSource = null;

            this.Second.DataBind();
        }

        protected void Second_SelectedIndexChanged(Object sender, EventArgs e)
        {
            // Do things here.
        }
    }
}
0 голосов
/ 24 июня 2011

Все, что вам нужно, это каскадные выпадающие списки. Вы можете использовать Ajax Control Toolkit, который имеет Каскадный элемент управления раскрывающегося списка , или вы можете использовать событие Выбранное изменение индекса в раскрывающемся списке, чтобы достичь того, чего вы хотите, взгляните на эту статью it дает весь код.

0 голосов
/ 24 июня 2011

Как идея:

Поместите эти ddls в UpdatePanel и установите для AutoPostBack значение true.Затем в обработчике события OnChange для каждого из двух первых ddl очистите коллекцию элементов следующего:

Заполните элементы в ddl в событии OnPreRender - но только если список пуст - и создайте содержимоезаполняется в соответствии с выбранным пунктом предыдущего ddl.

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