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

3
如果我有两个列表框,它们之间有一个按钮,如果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来更新DataSource?
编辑:
好的,为了澄清一些问题:
- 两个列表框都绑定到唯一的数据(SqlDataSource)。 - 当用户单击按钮时,我想将项目从ListBox1添加到ListBox2,反之亦然。 - 我希望能够向ListBox中添加多个项目(假设已打开多选功能)。 - 我希望这会触发DataSource上的UpdateCommand。
到目前为止,我唯一能够实现这一点的方法是手动从第一个listBox中取出每个项目,并将其作为参数添加到DataSource的UpdateCommand中,然后手动调用SqlDataSource.Update()方法。 这样可以解决问题,但这意味着我需要传递带分隔符的字符串以进行多个选择或打开多个连接。 我正在寻找的是一种在ListBox上更新DataSource的方法,并在完全更新后调用Bind / Update并将数据持久保存到数据库中。

以下的想法可行吗?当用户想要将一个值从第一个ListBox移动到第二个时,实际上是在数据库中插入到第二个控件所提取的位置,然后重新绑定第二个控件。然后,如果用户想要从第二个ListBox中删除一个值,则在数据库上执行删除命令。这种方法可以让您保留所有其他代码。如果将控件放在UpdatePanel中,甚至可以在不重新加载页面的情况下移动ListBox中的项目。 - Justin C
3个回答

3
第一个问题是,你想要添加的项目是否在绑定的数据源之外,并且是静态还是动态的。如果你要添加一些永远都是相同的项目,比如“无”选项,那么你可以将它作为ListItem添加到ASP中,并将AppendToDataSource属性设置为True。
如果你想要动态地插入值和数据绑定的值一起,那么你可以将你的数据源值设置为C#函数,不设置你的DataSourceID。代码如下:
<asp:ListBox runat="server" ID="ListBox2" DataSource='<%# myFunc() %>'
 DataTextField="Name" DataValueField="ID" SelectionMode="Multiple" />

在您的C#代码文件中,您需要这样写:
    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;    
         }

这将使您能够保留任何已开发的DataBind调用功能,因为每次调用对象的DataBind方法时都会调用此函数。

这给了我一个想法,但我不确定它是否太有帮助了。 我想要DataBound项,但当调用UI命令时,我想从单独的源中添加更多项到原始数据中,然后将其持久化到数据库中。 我已更新问题,我认为我解释得不太好。 - Chris Nicol
Chris - 我看到了你对Sam的回复,那也有所帮助。我现在很忙,但我可以稍后编辑我的答案以提供更好的记录,但我认为你已经明白了。您可以随意更改DataSource属性,并只需调用Bind()函数即可重新填充。只要记住,如果您在前端使用DataSourceID,那么当您切换到后端的DataSource时,还要清除DataSourceID属性。 - Justin C

0

无论您的列表框是否绑定到数据上下文,都应该使用它并不重要。

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();

我已经尝试过这个,但在调用DataBind方法后,它并没有调用UpdateCommand。因此,数据库没有得到我添加的新项目。 - Chris Nicol
添加项目后执行ListBox1.Update(); // 或者 validate(); 不要执行 Databind(); 这样,如果您想将添加的项添加到数据中,可以在Person类构造函数中提供此功能,在我之前提到的情况下,我的意思是每当您新建一个人时,将其添加到数据库中,如果您不想将其添加到数据库中,只想显示它,您可以像我之前说的那样使用它,只需删除第二行代码(DataBind()),让最终的DataBind()保留。让我知道发生了什么。 - Nasser Hadjloo
我正在尝试使用DataSource解决“只需添加到数据库”部分。我想在列表框上使用数据源进行双向绑定(一次性进行多个更新)。我不想在构造函数中将项目添加到数据库中,我只想从一个数据源传输到另一个数据源。 - Chris Nicol
好的,那么我理解你有一个绑定到ListBox的列表,它也可以绑定到GridView或其他控件,所以你应该将项目添加到将绑定到ListBox或其他控件的列表中,而不是将项目添加到ListBox1.Items中,像这样——list myMailList = new list(); myMailList.Add("Chris Nicol"); 如果您的列表是通用类型,则应该有List<Person> myMailList = new myMailList<Person>(); myMailList.Item.add(new Person(1,"Chris","Nichol"); 所以无论何时想要添加项目,都应该将其添加到列表中而不是ListBox或GridView。 - Nasser Hadjloo
注意:每当您向列表中添加一个项时,您需要执行ListBox1.Update(); // 或者 ListBox1.Invalidate(); -- 如果不更新ListBox,则添加的项将不会出现在列表中。如果问题仍然存在,请告诉我。 - Nasser Hadjloo

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

当按钮被点击时,我需要能够添加数据。如果在ListBox1中有1、2、3,在ListBox2中有4、5、6...然后用户选择“2”并单击添加...我希望能够更新ListBox2中的数据以包括“2”,并运行DataSource上的UpdateCommand。 - Chris Nicol

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接