现在的项目中,有个搜索部分,需要对搜索结果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
.selected)
{
if (test(lbfieldsselect,lbfields.options.value))
{
//已经选择该字段
continue;
}
lbfieldsselect.options.add(document.createelement("option"));
lbfieldsselect.options[lbfieldsselect.length-1].text=lbfields.options.text;
lbfieldsselect.options[lbfieldsselect.length-1].value=lbfields.options.value;
hidden1.value = hidden1.value + "#" + lbfields.options.text + "@" + lbfields.options.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.selected)
{
lbfieldsselect.options.add(document.createelement("option"));
lbfieldsselect.options[lbfieldsselect.length-1].text=lbfields.options.text;
lbfieldsselect.options[lbfieldsselect.length-1].value=lbfields.options.value;
hidden1.value = hidden1.value + "#" + lbfields.options.text + "@" + lbfields.options.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 == null sfield =="") continue;
datarow row = dtfield.newrow();
row[0] = sfield.split('@')[0];
row[1] = sfield.split('@')[1];
dtfield.rows.add(row);
}
lbfieldsselect.datasource = dtfield;
lbfieldsselect.datatextfield = "sdisplayname";
lbfieldsselect.datavaluefield = "sfieldname";
lbfieldsselect.databind();
}
这样的话,每次pageload时都根据hidden的状态更新listbox
我们项目的目标达到了(只需要listbox的item,不需要考虑选定等)
如果需要处理选定项,可能需要再多一个hidden吧。