현재 프로젝트에는 검색 부분이 있는데 사용자가 선택할 수 있도록 검색 결과 그리드에 필드를 표시해야 하므로
표시 가능한 모든 필드와 선택한 표시 필드를 각각 나열하는 데 두 개의 ListBox가 사용됩니다
. 두 목록 상자 사이의 항목을 제어하기 위한 전경입니다.
(말도 안되는 테스트 밀리에서 백그라운드 이벤트가 새로고침되어 불편해 보인다고 하더군요...)
그래서 html 버튼을 2개 만들었습니다
.
이벤트 내용은 다음과 같습니다. (당분간 Hidden1은 걱정하지 마세요.)
함수 테스트(lbFieldsSelect,value)
{
for (j = 0;j<lbFieldsSelect.length; j++)
{
if (lbFieldsSelect.options[j].value == value)는 true를 반환합니다.
}
거짓을 반환;
}
함수 SelectField()
{
var lbFields = document.getElementById("lbFields");
var lbFieldsSelect = document.getElementById("lbFieldsSelect");
var Hidden1 = document.getElementById("Hidden1");
for (i = 0;i<lbFields.length; i++)
{
if(lbFields.options[i].selected)
{
if (테스트(lbFieldsSelect,lbFields.options[i].value))
{
//필드가 선택되었습니다.
계속하다;
}
lbFieldsSelect.options.add(document.createElement("OPTION"));
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");
(i = 0;i<lbFieldsSelect.length; i++)에 대해
{
if (lbFieldsSelect.options[i].selected)
{
lbFieldsSelect.options.add(document.createElement("OPTION"));
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이 없어졌습니다. 곰곰히 생각해 보면 다시 게시할 때 ListBox 클라이언트 변경 후 asp.net에서 ViewState를 추가하지 않은 것 같습니다.
실제로 테이블에 ViewState가 없더라도 ms를 비난할 수는 없습니다. (ms에 따르면 테이블은 단지 컨테이너일 뿐이며 테이블의 컨트롤이 ViewState를 유지하는 데 필요합니다.)
클라이언트에 의해 거의 변경되지 않는 ListBox는 더 이상 필요하지 않습니다.. 항목을 listBox에 넣기 위해 viewstate를 유지할 수 있는 것을 만들 수밖에 없습니다. 그래서
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 ; i ++)
{
if (sField[i] == null || sField[i] == "") 계속;
DataRow 행 = dtField.NewRow();
행[0] = sField[i].Split( '@')[0 ];
행[1] = sField[i].Split( '@')[1 ];
dtField.Rows.Add(행);
}
lbFieldsSelect.DataSource = dtField;
lbFieldsSelect.DataTextField = "sDisplayName";
lbFieldsSelect.DataValueField = "sFieldName";
lbFieldsSelect.DataBind();
}
이 경우 페이지가 로드될 때마다 숨겨진 상태에 따라 ListBox가 업데이트됩니다.
우리 프로젝트의 목표가 달성되었습니다(ListBox의 항목만 필요하며 선택 등을 고려할 필요가 없습니다).
선택한 항목을 처리해야 하는 경우 또 다른 숨겨진 항목이 필요할 수 있습니다.
http://www.cnblogs.com/calmzeal/archive/2006/07/26/460068.html