【问题标题】:How to handle two-way binding of a SqlDataSource on a ASP.NET ListBox如何在 ASP.NET ListBox 上处理 SqlDataSource 的双向绑定
【发布时间】:2010-01-04 01:11:01
【问题描述】:

如果我有两个列表框,它们之间有一个按钮,如果 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。

标签: asp.net listbox datasource databound databound-controls


【解决方案1】:

第一个问题是您要添加的项目在绑定的 DataSource 静态或动态之外。如果您有几个要添加的项目始终相同,例如“无”选项,那么您可以将其作为 ListItem 添加到您的 ASP 中,并将 AppendToDataSource 属性设置为 True。

如果您想动态插入值以及数据绑定值,则可以将 DataSource 值设置为 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 - 我看到了你对 Sam 的回复,这也有助于解释。我现在很受打击,但我可以稍后编辑我的答案以提供更好的记录,但我认为你有它。您可以根据需要更改 DataSource 属性,只需调用 Bind() 函数即可重新填充。请记住,如果您在前端使用 DataSourceID,那么当您在后端切换到 DataSource 时,您也会清除 DataSourceID 属性。
【解决方案2】:

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

【讨论】:

  • 我需要能够在单击按钮时添加数据。如果您在 ListBox1 中有 1、2、3,在 ListBox2 中有 4、5、6 ...然后用户选择“2”并单击添加 ...我希望能够更新 ListBox2 中的数据以包含“2”并让它在 DataSource 上运行 UpdateCommand。
【解决方案3】:

您的列表框是否绑定到数据上下文并不重要

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。所以数据库没有得到我添加的新项目。
  • 添加Item后做ListBox1.Updat(); // 或 validate();并且不要 Databind();因此,如果你想添加添加的 Itm t 你的数据,你可以在我之前提到的案例中的 Person 类 cnstructor 中提供这个,我的意思是当你新建一个 Person 时,你将它添加到数据库中,如果你不喜欢要添加数据库,就像展示它一样,您可以像我之前所说的那样使用它,只需删除第二行代码 (DataBinde()) 并保留最终的 DataBind()。让我知道发生了什么
  • 这是我试图用数据源弄清楚的“只是添加到数据库”部分。我想对列表框上的数据源进行双向绑定(一次调用中有多个更新)。我不想在构造函数中将该项目添加到数据库中。我只想从一个数据源转移到另一个。
  • 好的,所以我知道你有一个列表,它绑定到一个 ListBox,它可能绑定到一个 GridView 或其他东西,所以不要将项目添加到 ListBox1.Items 然后你应该添加你的列表中的项目女巫将绑定到 ListBox 或其他任何东西,就像这样 ----- list myMailList = new list(); myMailList.Add("克里斯尼科尔"); ---- 如果您的列表是通用列表,那么您应该拥有 List myMailList = new myMailList(); -- myMailList.Item.add(new Person(1,"Chris","Nichol"); --- 所以每当你想添加一个项目时,你应该将它添加到你的列表而不是 ListBox 或 GridView
  • 请注意,每当您将 anItem 添加到列表时,您都必须执行 ListBox1.Update(); // 或 ListBox1.Invalidate(); -- 如果不 Update() ListBox,adddedItem 不会出现在 list 中,如果您的问题仍然存在,请告诉我
猜你喜欢
  • 2018-01-07
  • 2015-02-20
  • 1970-01-01
  • 2016-09-09
  • 1970-01-01
  • 2011-01-27
  • 1970-01-01
  • 2012-12-06
  • 2011-03-26
相关资源
最近更新 更多