首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > asp.net >

可多选ListBox数据绑定后,为何Selected始终为第一项?解决方法

2012-04-15 
可多选ListBox数据绑定后,为何Selected始终为第一项?一、问题背景描述:从数据库调出数据:人名,电话(DataSet

可多选ListBox数据绑定后,为何Selected始终为第一项?
一、问题背景描述:

从数据库调出数据:人名,电话(DataSet)绑定到ListBox1(支持多选)。

多选后,点击按钮Button1,期望:能够把ListBox1的选中项全部移到ListBox2。

二、问题症状:

当点击Button1时,只能够把第一项放入TextBox2,不管选的是什么,永远是将第一项移过去!


二、几个说明:

1. 数据绑定部分已经放入if(!IsPostBack),不是页面回发问题

2. 如果不用数据绑定的方式,而用手动直接设置ListBox1的项或者用编程方式添加ListBox1项都可以正常将选中的多个元素移动到ListBox2。

三、附部分代码

Page_Load
  if (!IsPostBack)
  {
  //直接调用自定方法BindTextBox1().
  BindTextBox1(); //只要绑定上去的就无法按要求移动数据

  //这样写入是能够按要求将TextBox1中的被选项移到TextBox2中的,但只要用绑定数据就不行。
  //this.ListBox1.Items.Add(new ListItem("a","a"));
  //this.ListBox1.Items.Add(new ListItem("b","b"));
  //this.ListBox1.Items.Add(new ListItem("c","c"));
  }

BindTextBox1()
{
  myDs = myDataBase.GetDataSet(sql,conn);//数据集取得没有任何问题
  this.ListBox1.DataSource = myDs;
  this.ListBox1.DataTextField = "姓名_电话";
  this.ListBox1.DataValueField = "联系电话1";
  this.ListBox1.DataBind();
}

Button1_Click

  //无论使用注释内的for还是后面的while都不能成功将数据绑定后的TextBox1数据按要求转移到TextBox2内
  //for (int i = 0; i < ListBox1.Items.Count; i++)
  //{
  // if (ListBox1.Items[i].Selected)
  // { 
  // ListBox2.Items.Add(new ListItem(ListBox1.Items[i].Text,ListBox1.Items[i].Value));
  // ListBox1.Items.RemoveAt(i);
  // i--;
  // }
  //}

  while (ListBox1.SelectedIndex > -1)
  {
  if (ListBox1.SelectedItem.Selected)
  {
  ListBox2.Items.Add(ListBox1.SelectedItem);
  }
  ListBox1.Items.Remove(ListBox1.SelectedItem);
  }

四、问题何在?

  是什么问题?不出任何错,就是无法达到我的要求。

[解决办法]

C# code
 while (ListBox1.SelectedIndex > -1)            {                if (ListBox1.SelectedItem.Selected)                {                    ListBox2.Items.Add(ListBox1.SelectedItem);                }                ListBox1.Items.Remove(ListBox1.SelectedItem);            }            foreach 判断每个选择项是否被选上
[解决办法]
可以的啊
例子
HTML code
<%@ Page Language="C#" %><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><script runat="server">  protected void Button1_Click(object sender, EventArgs e)  {    ListBox2.Items.Clear();    for (int i = 0; i < ListBox1.Items.Count; i++)    {      if (ListBox1.Items[i].Selected)      {        ListBox2.Items.Add(ListBox1.Items[i].Value);      }    }  }  void BindTextBox1()  {    //模拟下    ListBox1.Items.Add("A");    ListBox1.Items.Add("B");    ListBox1.Items.Add("C");    ListBox1.Items.Add("D");    ListBox1.Items.Add("E");  }  protected void Page_Load(object sender, EventArgs e)  {    if (!IsPostBack)    {      BindTextBox1();    }  }</script><head>  <title></title></head><body>  <form id="form1" runat="server">  <asp:ListBox ID="ListBox1" runat="server" SelectionMode="Multiple"></asp:ListBox>  <asp:ListBox ID="ListBox2" runat="server" SelectionMode="Multiple"></asp:ListBox>  <asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="Button" />  </form></body></html> 


[解决办法]
for (int i = 0; i < ListBox1.Items.Count; i++)这样循环删除就不对,应该倒着删

for (int i = ListBox1.Items.Count-1; i >=0; i--)

测试,点击按钮后,不会返回到第一个选中,而是选中的那个显示在视觉上的第一个
[解决办法]
你一会i++,一会又i--
[解决办法]
你绑定的时候用for 循环dataset
add到ListBox里
不要用DataSource 看看
[解决办法]
因为看见 text不同,但是value 相同

热点排行