Возможно, «отлично» вызовет много критики, но я думаю, что это действительно хорошо. Я просмотрел около 20 связанных раскрывающихся списков без обновления, и в Firefox я почти сделал два. , как сохранить значение второго списка после отправки формы, потому что если вы добавите записи в раскрывающийся список через js, его состояние не будет сохранено. Тестовая платформа: ie6, firefox.
Функция: связь второго уровня без обновления. Возможности: кросс-браузер; отправьте форму, чтобы получить значение второго раскрывающегося списка; данные поступают из базы данных; используйте xmlhttp для отправки запросов для выполнения запросов без обновления: если вы можете. найдите лучший метод, пожалуйста. Скажите мне, большое спасибо, ваша критика и предложения - большая поддержка для меня.
вебформ1.aspx:
<%@ Page Language="c#" Codebehind="WebForm1.aspx.cs" AutoEventWireup="false" Inherits="drop.WebForm1" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
<HTML>
<ГОЛОВКА>
<title>WebForm1</title>
<meta name="GENERATOR" Content="Microsoft Visual Studio .NET 7.1">
<meta name="CODE_LANGUAGE" Content="C#">
<meta name="vs_defaultClientScript" content="JavaScript">
<meta name="vs_targetSchema" content=" http://schemas.microsoft.com/intellisense/ie5 ">
<script Language="JavaScript">
//Функция jb инициализирует объект xmlhttp в соответствии с разными браузерами
функция jb()
{
вар А = ноль;
пытаться
{
A = новый ActiveXObject("Msxml2.XMLHTTP");
}
поймать(е)
{
пытаться
{
A = новый ActiveXObject("Microsoft.XMLHTTP");
}
поймать(ок)
{
А=ноль
}
}
if ( !A && typeof XMLHttpRequest != "не определено" )
{
A = новый XMLHttpRequest()
}
вернуть А
}
//Следующая функция Go вызывается, когда родительский список изменяется, а параметром является выбранный элемент.
функция Go(obj)
{
//Получаем значение раскрывающегося списка поля выбора
вар svalue = obj.value;
//Определяем страницу для обработки данных
var weburl = "webform1.aspx?parent_id="+svalue;
//Инициализируем объект xmlhttp
вар xmlhttp = jb();
//Отправляем данные, первый параметр предпочтительно get, а третий параметр желательно true
xmlhttp.open("get",weburl,true);
// оповещение(xmlhttp.responseText);
//Если данные были успешно возвращены
xmlhttp.onreadystatechange=функция()
{
if(xmlhttp.readyState==4)//4 представляет успешный возврат данных
{
var result = xmlhttp.responseText;//Получаем данные, возвращаемые сервером
//Сначала очищаем все раскрывающиеся элементы dListChild
document.getElementById("dListChild").length = 0;
//Добавить все модели в dListChild. Обратите внимание, что опция не является опцией.
document.getElementById("dListChild").options.add(new Option("Все модели","0"));
if(result!="")//Если возвращаемые данные не пусты
{
//Разбиваем полученную строку на массивы согласно
var allArray = result.split(",");
//Зацикливаем этот массив, обратите внимание, что он начинается с 1, поскольку первый символ полученной строки равен ,, поэтому первый массив после разделения пуст
for(var i=1;i<allArray.length;i++)
{
//Разобьем эту строку на массивы согласно |
var thisArray = allArray[i].split("|");
//Добавляем записи в dListChild
document.getElementById("dListChild").options.add(new Option(thisArray[1].toString(),thisArray[0].toString()));
}
}
}
}
//Отправляем данные, обратите внимание на порядок и параметры. Параметры должны быть нулевыми или "".
xmlhttp.send(ноль);
}
</скрипт>
</HEAD>
<body MS_POSITIONING="GridLayout">
<form id="Form1" метод="post" runat="server">
<asp:DropDownList onchange="Go(this)" id="dListParent" style="Z-INDEX: 101; СЛЕВА: 248 пикселей; ПОЛОЖЕНИЕ: абсолютное; ВЕРХ: 40 пикселей"
runat="сервер">
<asp:ListItem Value="100">Моторола</asp:ListItem>
<asp:ListItem Value="101">Nokia</asp:ListItem>
</asp:DropDownList>
<asp:DropDownList id="dListChild" style="Z-INDEX: 102; СЛЕВА: 248 пикселей; ПОЛОЖЕНИЕ: абсолютное; ВЕРХ: 104 пикселей"
runat="server"></asp:DropDownList>
<asp:Button id="Button1" style="Z-INDEX: 103; СЛЕВА: 256 пикселей; ПОЛОЖЕНИЕ: абсолютное; СВЕРХУ: 176 пикселей" runat="server"
Text="Button"></asp:Button>
</форма>
</тело>
</HTML>
Серверная часть webform1.aspx.cs:
использование системы;
использование System.Collections;
использование System.ComponentModel;
использование System.Data;
использование System.Drawing;
использование System.Web;
использование System.Web.SessionState;
использование System.Web.UI;
использование System.Web.UI.WebControls;
использование System.Web.UI.HtmlControls;
использование System.Configuration;
пространства имен
System.Data.SqlClient;
{
/// <сводка>
/// Краткое описание WebForm1.
/// </сводка>
общедоступный класс WebForm1: System.Web.UI.Page
{
защищенный System.Web.UI.WebControls.DropDownList dListParent;
защищенный System.Web.UI.WebControls.Button Button1;
защищенный System.Web.UI.WebControls.DropDownList dListChild;
частная пустота Page_Load (отправитель объекта, System.EventArgs e)
{
//Поместите сюда пользовательский код для инициализации страницы
//если(!IsPostBack)
//{
BindDrop();//Если он не отправлен обратно, привяжите поле списка
//}
}
protected void BindDrop()
{
//Прежде всего, я хочу, чтобы родительский раскрывающийся список также был привязан к базе данных, но я не думаю, что это необходимо в дальнейшем.
//если(!IsPostBack)
//{
//Привязываем родительский dListParent
//БиндРодитель();
//}
//Получаем переданное значение Parent_id, если это первый запрос, то оно будет нулевым
строка str = Request.QueryString["parent_id"];
строка str1 = dListParent.SelectedValue;;
Ответ.Запись(str1);
//Если str добавляет строку!=исходную строку, это означает, что было запущено событие onchange dListParent
if((str+"abc")!="abc")
{
//Привязываем элемент управления dListChild
BindChild(str);//Используем переданное значение родительского DropDownList в качестве параметра
}
еще
BindParent(str1);
}
защищенная пустота BindParent (строка ул)
{
//Если это первый запрос или страница обновлена, она будет выбрана на основе значения dListParent.
//Преобразуем параметры в int
int я = Convert.ToInt32(str);
dListChild.Items.Clear();
dListChild.Items.Add(new ListItem("Все модели","0"));
//Получаем строку подключения к базе данных
строка connStr = ConfigurationSettings.AppSettings["ConnString"].ToString();
//Инициализируем объект подключения
SqlConnection conn = новый SqlConnection (connStr);
//оператор базы данных
string commStr = string.Format("выберите type_value,type_text из phone_type, где родительский_id={0}",i);
//Создаем объект команды базы данных
SqlCommand comm = новый SqlCommand(commStr,conn);
//Открываем базу данных
конн.Открыть();
//Выполняем команду
SqlDataReader dr = comm.ExecuteReader();
// Цикл Dr и добавление записей в dListParent
в то время как (доктор.Read())
{
dListChild.Items.Add(new ListItem(dr[1].ToString(),dr[0].ToString()));
//Это также может быть так
//dListParent.Items.Add(new ListItem(dr["phone_text"].ToString(),dr["phone_value"].ToString()));
}
dListParent.Items[0].Selected = true;
//Добавление следующего означает, что состояние второго dListChild может быть сохранено при нажатии кнопки отправки для отправки формы.
dListChild.SelectedValue = Request.Form["dListChild"];
доктор.Закрыть();
конн.Закрыть();
}
защищенный void BindChild (строка str)
{
//Содержимое, добавленное через js в любой элемент управления, включая раскрывающийся список, не будет сохранено.
//Преобразуем параметры в int
int я = Convert.ToInt32(str);
//Определяем строку для сохранения данных, возвращаемых из базы данных
строковый результат = "";
//Сначала очищаем вывод
Ответ.Очистить();
строка connStr = ConfigurationSettings.AppSettings["ConnString"].ToString();
SqlConnection conn = новый SqlConnection (connStr);
SqlCommand comm = conn.CreateCommand();
string commStr = string.Format("выберите type_value,type_text из phone_type, где родительский_id = {0}",i);
comm.CommandText = commStr;
конн.Открыть();
SqlDataReader dr = comm.ExecuteReader();
в то время как (доктор.Read())
{
результат += ","+dr[0].ToString() +"|" + dr[1].ToString();
//dListChild.Items.Add(new ListItem(dr[1].ToString(),dr[0].ToString()));
}
//Выводим клиенту информацию, полученную из базы данных
Ответ.Запись(результат);
//Закрываем ответ после завершения вывода, чтобы избежать ненужного вывода
Ответ.Смыв();
Ответ.Закрыть();
доктор.Закрыть();
конн.Закрыть();
}
#region Код, созданный дизайнером веб-форм
переопределить защищенную пустоту OnInit (EventArgs e)
{
//
// CODEGEN: этот вызов необходим разработчику веб-форм ASP.NET.
//
ИнициализироватьКомпонент();
base.OnInit(е);
}
/// <сводка>
/// Конструктор поддерживает необходимые методы — не используйте редактор кода для изменения
/// Содержимое этого метода.
/// </сводка>
частная пустота InitializeComponent()
{
this.Button1.Click += новый System.EventHandler(this.Button1_Click);
this.Load += новый System.EventHandler(this.Page_Load })
;
#endregion
Private void Button1_Click(отправитель объекта, System.EventArgs e)
{
Response.Write(Request.Form["dListChild"].ToString());
}
}
}
Техническая спецификация:
Идентификатор первичного ключаparent_id(int) type_value(int) type_text(varchar)
int увеличивает значение родительского раскрывающегося списка. Значение раскрывающегося списка. Текст раскрывающегося списка.