0

我有一个绑定到页面上的 ObjectDataSource 的数据转发器。我有选择工作,但更新有问题。当我调用 Save 按钮时,我想做的是调用 UpdateMethod 中指定的函数并将其传递给转发器更改对象的参数。问题是我不知道如何将对象从中继器中取出。我不想将每个单独的字段指定为更新参数,因为这真的很笨拙并且违背了数据绑定的目的。对此的任何帮助都会很棒。

    <%@ Page Language="VB" %>
<html lang="en" xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" runat="server">
    <title></title>
</head>
<body>
<form id="form1" runat="server">
    <asp:Repeater ID="Repeater1" runat="server" DataSourceID="ObjectDataSource1" ItemType="CompanyObject">
        <ItemTemplate>      
    <asp:Label ID="Label2" runat="server" CssClass="clsLabel">Company:</asp:Label>  
    <asp:TextBox ID="txtCompany" runat="server" Text='<%# BindItem.Company%>'></asp:TextBox>
        </ItemTemplate>
     </asp:Repeater>
        <asp:ObjectDataSource ID="ObjectDataSource1" runat="server"
        SelectMethod="GetData" TypeName="WebApplication1.CompanyObject"
        UpdateMethod="UpdateCompany" DataObjectTypeName="CompanyObject"></asp:ObjectDataSource>
    </form>
</body>
</html>

这是我要调用的代码:

Public Function UpdateCompany(ByVal company As tblCompany)
'Save the Value here except that company is always null
End Function

Private Sub btnSave_Click(sender As Object, e As EventArgs) Handles btnSave.Click
    ObjectDataSource1.Update()
End Sub
4

3 回答 3

1

您不能使用Repeater 控件来做到这一点:它不会保留它所绑定的对象的副本。它不进行双向绑定。

但其他控件可以。查看FormViewGridViewDetailsView。有关该主题的完整处理,请参见此处

于 2013-02-10T03:15:49.307 回答
0

这对于您所遵循的方法是不可能的。

我们可以肯定地开发一个自定义的 Post Back 来实现所需的输出。

于 2013-02-11T10:59:39.640 回答
0

我不确定我是否完全了解这里发生的事情,而且我没有足够的声誉在评论中提问。你的保存按钮在哪里?我猜它在中继器之外。您是要保存中继器中出现的所有公司,还是只有一家公司?你想从中继器中取回什么?只是文本框中的公司名称?更多详细信息可能会提供您正在寻找的帮助。

OnUpdating此外,向您添加一个事件ObjectDataSource并在您的代码中处理它可能会有所帮助。

<asp:ObjectDataSource ID="ObjectDataSource1" runat="server"
SelectMethod="GetData" TypeName="WebApplication1.CompanyObject"
UpdateMethod="UpdateCompany" DataObjectTypeName="CompanyObject" 
OnUpdating="Company_Updating"></asp:ObjectDataSource>

然后是你的代码:

Private Sub Company_Updating(ByVal s As Object, ByVal e As ObjectDataSourceMethodEventArgs)
    ' use e.InputParameters here to pass in the values you need
End Sub

您可以在此处查看如何使用的示例InputParameters

更新

要回答您的问题,您应该能够使用以下内容从转发器的文本框中获取值:

Protected Sub Company_Updating(ByVal s As Object, ByVal e As ObjectDataSourceMethodEventArgs)
    If (Repeater1.Items.Count > 0) Then
        e.InputParameters.Add("CompanyName", CType(Repeater1.Items(0).FindControl("txtCompany"), TextBox).Text
    End If
End Sub

但我认为中继器对于您在这里尝试做的事情是不必要的。转发器通常用于显示项目的集合。如果你的目标是简单地展示一家公司,你不能在你的代码中设置控件的Text属性吗?TextBox

Protected Sub Page_Load(ByVal s As Object, ByVal e As EventArgs) Handles Me.Load
    If (Not Page.IsPostBack) Then
        txtCompany.Text = yourCompanyObject.Name
    End If
End Sub
于 2013-02-08T00:02:25.887 回答