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

steelfo 2012-04-13 01:03:34
一、问题背景描述:

从数据库调出数据:人名,电话(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);
}

四、问题何在?

是什么问题?不出任何错,就是无法达到我的要求。
...全文
206 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
孟子E章 2012-04-13
  • 打赏
  • 举报
回复
跟绑定没关系的
steelfo 2012-04-13
  • 打赏
  • 举报
回复
yeness:

======
一语中的!
steelfo 2012-04-13
  • 打赏
  • 举报
回复
我突然明白自己犯了一个很愚蠢的错误,因为数据项的值是相同的,所以就造成这样的问题?

容我验证一下,实在抱歉,耽误大家了。

照常结贴,给分。
xuan.ye 2012-04-13
  • 打赏
  • 举报
回复
因为看见 text不同,但是value 相同
dengchenlu 2012-04-13
  • 打赏
  • 举报
回复
你绑定的时候用for 循环dataset
add到ListBox里
不要用DataSource 看看
steelfo 2012-04-13
  • 打赏
  • 举报
回复
porenasckx

i--
是因为移掉了被选中移走的那一项。
不用i--的话,会超出数组范围的啊!

你所说那段代码没有问题的,已经测试成功的。
问题不在这儿,我用while或foreach不存在i++和i--但仍存在只能移动第一项的问题。

问题肯定是在数据绑定上面,但我不知道这几行里是不是少了什么?
myDs = myDataBase.GetDataSet(sql,conn);//数据集取得没有任何问题
this.ListBox1.DataSource = myDs;
this.ListBox1.DataTextField = "姓名_电话";
this.ListBox1.DataValueField = "联系电话1";
this.ListBox1.DataBind();
E次奥 2012-04-13
  • 打赏
  • 举报
回复
你一会i++,一会又i--
steelfo 2012-04-13
  • 打赏
  • 举报
回复
net_lover
(【孟子E章】):
是可以的,但问题是我一用数据绑定的办法就出现问题了! 数据不绑没问题的。是不是绑定时候还需要什么设置?

anzhiqiang_touzi
我认为原理上foreach,for,while效果是一样的,关键是如何判断是否选中?数据绑定后是不是会影响数据项能否被读到Items.Selected的值是否与显示的效果一致。

bdmh
无论循环方向如何,无论被选项是多少个,被移动的总是"视觉”上的第一个!怀疑只有第一项的Selected才为true!? 怪异。
bdmh 2012-04-13
  • 打赏
  • 举报
回复
for (int i = 0; i < ListBox1.Items.Count; i++)这样循环删除就不对,应该倒着删

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

测试,点击按钮后,不会返回到第一个选中,而是选中的那个显示在视觉上的第一个
孟子E章 2012-04-13
  • 打赏
  • 举报
回复
可以的啊
例子
<%@ 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>
anzhiqiang_touzi 2012-04-13
  • 打赏
  • 举报
回复
 while (ListBox1.SelectedIndex > -1)
{
if (ListBox1.SelectedItem.Selected)
{
ListBox2.Items.Add(ListBox1.SelectedItem);
}
ListBox1.Items.Remove(ListBox1.SelectedItem);
}
foreach 判断每个选择项是否被选上

62,268

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧