Work with dropdownlist in C# ASP.NET
I have 3 dropdownlists and one image. First ddl (Stamps: BMW, AUDI, VAZ) gets his data from SQL Server and sets selectedIndex = 0
. Second ddl (Models: A6, TT, Z4, X5 etc...) depends from first ddl. If User select index = 0
(AUDI) in first ddl then second ddl shows A6 and TT. Third ddl (Colors) depends from second ddl. If User select index = 0
(AUDI) in first ddl and select index = 1
(TT) in second ddl then third ddl shows Blue and Silver. Image depends from all three ddl. How to realize it?
My code:
namespace DynamicWebApplication { public partial class RentForm : System.Web.UI.Page { public static bool flag = 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(f开发者_Go百科ileBytes, 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";
// }
// }
//}
}
}
I don't understand what's wrong here. I used AutoPostBack. If I select item from ddl I get empty ddls.
Sorry for my question. I found solution to my problem. It was little thing. I forgot to set EnableViewState="true" in Master Page :( Therefore I got empty ddls when selected items (ddls not fire events)
You have to use the AutoPostBack
and OnSelectedIndexChanged
properties of the DropDownList
control.
An example
Markup
<%@ 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>
Code behind
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.
}
}
}
As an idea:
Put those ddls in an UpdatePanel and set AutoPostBack to true on them. Then in the OnChange event handler for each of the two first ddl's clear the items collection of the following.
Fill the items in the ddl's in the OnPreRender event - but only if the list is empty - and make the contents to be filled corresponding to the selected item of the previous ddl.
All you want is cascading Dropdownlists. You can either use Ajax Control Toolkit which has a Cascading dropdownlist control or you can use the Selected index change event of the dropdownlist to achieve what you want, have a look on this article it gives all the code.
精彩评论