如何在ASP.NET ListBox上处理SqlDataSource的双向绑定

如何在ASP.NET ListBox上处理SqlDataSource的双向绑定,asp.net,listbox,datasource,databound,databound-controls,Asp.net,Listbox,Datasource,Databound,Databound Controls,如果我有两个列表框,它们之间有一个按钮,如果ListBox2的项目是数据绑定的,我如何更新ListBox2的项目 <asp:ListBox runat="server" ID="ListBox1" DataSourceID="DataSource1" DataTextField="Name" DataValueField="ID" SelectionMode="Multiple" /> <asp:Button runat="server" ID="addButton

如果我有两个列表框,它们之间有一个按钮,如果ListBox2的项目是数据绑定的,我如何更新ListBox2的项目

<asp:ListBox runat="server" ID="ListBox1" DataSourceID="DataSource1"
     DataTextField="Name" DataValueField="ID" SelectionMode="Multiple" />

<asp:Button runat="server" ID="addButton" onClick="addButton_Click" />

<asp:ListBox runat="server" ID="ListBox2" DataSourceID="DataSource2"
     DataTextField="Name" DataValueField="ID" SelectionMode="Multiple" />

另外,如果我使用SelectionMode=“Multiple”,我是否能够使用每次只接受一项的UpdateCommand更新数据源

编辑:

好的,补充一些澄清:

  • 两个列表框都被数据绑定到唯一数据(SqlDataSource)
  • 当用户单击按钮时,我想将项目从ListBox1添加到ListBox2,反之亦然
  • 我希望能够将多个项目添加到列表框(假设启用了“多个选择”)
  • 我想让它在数据源上触发UpdateCommand

到目前为止,我能够做到这一点的唯一方法是从第一个列表框中手动获取每个项,并将其作为参数添加到数据源的UpdateCommand中,然后手动调用SqlDataSource.Update()方法。这是可行的,但这意味着我需要为多个选择传递一个带分隔符的字符串,或者打开多个连接。我正在寻找一种方法来更新ListBox上的数据源,一旦它完全更新,然后调用Bind/update并将数据持久化回DB。

为ListBox2的数据绑定事件添加一个事件处理程序。这将在SQL数据绑定后触发,并为您提供添加其他数据的机会。

是否应使用绑定到datacontext的列表框并不重要

ListBox1.Items.Add(/*your listBox Item*/);// for example if you have a person listbox you should have - ListBox1.Items.Add(new Person(1,"Nasser","Hajloo");
记住,你应该在绑定后添加项目

ListBox1.DataSource = myDBList;
ListBox1.DataBind();
//some other code 
ListBox1.Items.Add(new Person(1,"Nasser","Hajloo");
ListBox1.DataBind();

第一个问题是,要添加的项是在绑定数据源之外的静态项还是动态项。如果要添加的两个项目始终相同,如“无”选项,则可以将其作为列表项目添加到ASP中,并将AppendToDataSource属性设置为True

如果希望动态插入值和数据绑定值,则可以将数据源值设置为C#函数,而不设置数据源ID。看起来是这样的

<asp:ListBox runat="server" ID="ListBox2" DataSource='<%# myFunc() %>'
 DataTextField="Name" DataValueField="ID" SelectionMode="Multiple" />

这将允许您保留可能已经开发的任何数据绑定调用功能,因为每次调用对象的数据绑定方法时都会调用此函数。

单击按钮时,我需要能够添加数据。如果列表框1中有1,2,3,列表框2中有4,5,6。。。然后用户选择“2”并单击添加。。。我希望能够更新ListBox2中的数据以包含“2”,并让它在数据源上运行UpdateCommand。我已经尝试过这个方法,但在调用DataBind方法后,它不会调用UpdateCommand。因此,DB不会获得我添加的新项。添加项后,执行ListBox1.update();//或验证();并且不进行数据绑定();所以在那之后,如果你想添加你的数据,你可以在Person类cnstructor中提供这个,在我前面提到的情况下,我的意思是当你新建一个人时,你可以将它添加到数据库中,如果你不喜欢添加数据库,只是想显示它,你可以像我之前说的那样使用它,只需删除第二行代码(DataBind())并保留最后的DataBind()。让我知道发生了什么,这是我试图通过数据源解决的“仅添加到数据库”部分。我想与列表框上的数据源进行双向绑定(一次调用中有多个更新)。我不想在构造函数中将项添加到数据库中。我只想从一个数据源传输到另一个数据源。好的,正如我所说,您有一个列表,它绑定到一个列表框,它可能绑定到一个GridView或其他什么东西,因此,您不需要将项添加到ListBox1。然后,您应该将项添加到您的列表中,该列表将绑定到列表框或其他类似的东西------list myMailList=new list();myMailList.Add(“Chris Nicol”);-----如果您的列表是通用列表,那么您应该有list myMailList=new myMailList();--myMailList.Item.Add(new Person(1,“Chris”,“Nichol”);---因此,无论何时要添加项目,都应该将其添加到列表中,而不是ListBox或GridView。注意:无论何时向列表中添加项目,都必须执行ListBox1.Update();//或ListBox1.Invalidate();--如果不更新()在列表框中,adddedItem不显示在列表中,请告诉我您的问题是否仍然存在。这给了我一个想法,但我不确定它是否有多大帮助。我想删除数据绑定项,但当调用UI命令时,我想从单独的源向原始数据添加更多项,然后将其保留到数据库。我已更新了问题关于,我认为我没有很好地解释它。Chris-我看到了你对Sam的反应,这也有助于解释。我现在非常生气,但我可以稍后编辑我的答案以提供更好的记录,但我认为你已经做到了。你可以随意更改DataSource属性,只需调用Bind()函数重新填充。请记住,如果您在前端使用DataSourceID,当您切换到后端的DataSource时,您也会清除DataSourceID属性。以下想法行得通吗?当用户希望将值从第一个列表框移动到第二个列表框时,您实际上会在数据库中插入他从第二个控件中提取,然后重新绑定第二个控件。然后,如果用户希望从第二个列表框中删除一个值,您可以对数据库执行删除命令。这种方法将允许您保留所有其他代码。如果您将控件放在UpdatePanel中,您甚至可以在不使用页面rel的情况下将项目移入和移出列表框大卡车。
    protected ListItem[] myFunc()
        {
          ListItem[] retVals;

          //write your code here to get your data from DataSource2 and whatever other sources you need

          //then create a ListItem for each row of data you want to show, 
          //set the text and the value attributes and return an array of all the values in the order you want

          return retVals;    
         }