打印

[asp.net教程] asp.net中在前台用js增删listbox的items

asp.net中在前台用js增删listbox的items

现在的项目中,有个搜索部分,需要对搜索结果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吧。

TOP

返回顶部
AYBlue

Processed in 0.051618 second(s), 7 queries.

当前时区 GMT+8, 现在时间是 2009-1-10 11:45 京ICP备06054220号

清除 Cookies - 联系我们 - 163K.com - Archiver - WAP