В текущем проекте есть часть поиска. Необходимо отображать поля в сетке результатов поиска, чтобы пользователи могли выбирать.
Поэтому для отображения всех отображаемых полей и выбранных полей отображения используются два списка соответственно,
а в них используется js. передний план для управления элементами между двумя списками. Добавление, удаление и перемещение.
(Ни в коем случае, тест мм сказал, что фоновое событие обновляется и это выглядит неудобно...)
Поэтому я сделал 2 html-кнопки
События следующие: (Пока не беспокойтесь о Hidden1)
функция Test (lbFieldsSelect, значение)
{
for (j = 0;j<lbFieldsSelect.length; j++)
{
if (lbFieldsSelect.options[j].value == value) возвращает true;
}
вернуть ложь;
}
функция ВыбратьПоле()
{
var lbFields = document.getElementById("lbFields");
var lbFieldsSelect = document.getElementById("lbFieldsSelect");
var Hidden1 = document.getElementById("Hidden1");
for (i = 0;i<lbFields.length; i++)
{
если (lbFields.options[i].selected)
{
if (Test(lbFieldsSelect,lbFields.options[i].value))
{
//Поле выбрано
продолжать;
}
lbFieldsSelect.options.add(document.createElement("ОПЦИЯ"));
lbFieldsSelect.options[lbFieldsSelect.length-1].text=lbFields.options[i].text;
lbFieldsSelect.options[lbFieldsSelect.length-1].value=lbFields.options[i].value;
Hidden1.value = Hidden1.value + "#" + lbFields.options[i].text + "@" + lbFields.options[i].value;
}
}
}
функция UnSelectField()
{
var lbFields = document.getElementById("lbFields");
var lbFieldsSelect = document.getElementById("lbFieldsSelect");
var Hidden1 = document.getElementById("Hidden1");
for (i = 0;i<lbFieldsSelect.length; i++)
{
если (lbFieldsSelect.options[i].selected)
{
lbFieldsSelect.options.add(document.createElement("ОПЦИЯ"));
lbFieldsSelect.options[lbFieldsSelect.length-1].text=lbFields.options[i].text;
lbFieldsSelect.options[lbFieldsSelect.length-1].value=lbFields.options[i].value;
Hidden1.value = Hidden1.value + "#" + lbFields.options[i].text + "@" + lbFields.options[i].value;
}
}
}
Неожиданно при отправке в фоновый режим ListItem, добавленный на стойке регистрации, исчез. Если внимательно подумать, должно быть, asp.net не добавил ViewState после изменения клиента ListBox при обратной отправке.
На самом деле мс нельзя винить, даже у таблицы нет ViewState (по мнению мс, таблица — это всего лишь контейнер, и необходимо, чтобы элементы управления в таблице поддерживали ViewState)
ListBox, вещь, которая редко меняется клиентом, очевидно, больше не нужна. У меня нет другого выбора, кроме как создать что-то, что может поддерживать состояние просмотра для помещения элементов в listBox. Итак, у меня есть
соответствующий код на стороне сервера Hidden1. выше:
частная пустота RestorelbFieldsSelect()
{
string[] sField =Hidden1.Value.Split('#');
//lstShowField.Items.Clear();
DataTable dtField = новый DataTable();
dtField.Columns.Add("sDisplayName","".GetType());
dtField.Columns.Add("sFieldName","".GetType());
for (int i = 0; i <sField.Length; я ++)
{
if (sField[i] == null || sField[i] == "") продолжить;
Строка DataRow = dtField.NewRow();
row[0] = sField[i].Split( '@')[0 ];
row[1] = sField[i].Split( '@')[1 ];
dtField.Rows.Add(строка);
}
lbFieldsSelect.DataSource = dtField;
lbFieldsSelect.DataTextField = "sDisplayName";
lbFieldsSelect.DataValueField = "sFieldName";
lbFieldsSelect.DataBind();
}
В этом случае ListBox будет обновляться в соответствии со скрытым статусом каждый раз при загрузке страницы.
Цель нашего проекта достигнута (нужен только Item ListBox, нет необходимости учитывать выбор и т.д.)
Если вам нужно обработать выбранные элементы, вам может понадобиться еще один Hidden.
http://www.cnblogs.com/calmzeal/archive/2006/07/26/460068.html