現在的項目中,有個搜尋部分,需要對搜尋結果Grid顯示欄位讓用戶選擇
於是用2個ListBox分別列示所有可顯示欄位和已選擇顯示欄位
並在前台用js控制2個Listbox之間項目的增刪和移動
(沒辦法,測試mm說後台事件有刷新的看著不舒服...)
於是搞2個html button
事件如下:(先別管Hidden1)
function Test( lbFieldsSelect,value)
{
for (j = 0;j<lbFieldsSelect.length; j++)
{
if (lbFieldsSelect.options[j].value == value) return true;
}
return false;
}
function 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 (Test(lbFieldsSelect,lbFields.options[i].value))
{
//已經選擇該字段
continue;
}
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;
}
}
}
function UnSelectField()
{
var lbFields = document.getElementById("lbFields");
var lbFieldsSelect = document.getElementById("lbFieldsSelect");
var Hidden1 = document.getElementById("Hidden1");
for (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都沒有了仔細想想,肯定是asp.net沒有在回發時加上ListBox客戶端改變後的ViewState
其實不能怪ms,連Table都沒有ViewState(按照ms的說法,table只是個容器,table裡面的控制才有必要維持ViewState)
ListBox這種客戶端難得改變一次的東西顯然是更不需要了沒辦法,只好自己弄一個可以維持viewstate的東西來放listBox的Item了於是有了上面的Hidden1
伺服器端相應代碼:
private void RestorelbFieldsSelect()
{
string[] sField =Hidden1.Value.Split('#');
//lstShowField.Items.Clear();
DataTable dtField = new 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] =="") continue;
DataRow row = dtField.NewRow();
row[0] = sField[i].Split( '@')[0 ];
row[1] = sField[i].Split( '@')[1 ];
dtField.Rows.Add(row);
}
lbFieldsSelect.DataSource = dtField;
lbFieldsSelect.DataTextField = "sDisplayName";
lbFieldsSelect.DataValueField = "sFieldName";
lbFieldsSelect.DataBind();
}
這樣的話,每次pageload時都根據hidden的狀態更新ListBox
我們專案的目標達到了(只需要ListBox的Item,不需要考慮選定等)
如果需要處理選定項,可能需要再多一個Hidden吧。
http://www.cnblogs.com/calmzeal/archive/2006/07/26/460068.html