使用ObjectDataSource和Repeater时获取更新的对象

时间:2013-02-04 14:45:46

标签: asp.net vb.net webforms .net-4.5

我有一个数据转发器,它绑定到页面上的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

3 个答案:

答案 0 :(得分:1)

您无法使用Repeater控件执行此操作:它不会保留绑定到的对象的副本。它不会进行双向绑定。

但其他控件确实如此。查看FormViewGridViewDetailsView。有关该主题的完整处理,请参阅here

答案 1 :(得分: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

您可以查看here有关如何使用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

答案 2 :(得分:0)

使用您所遵循的方法无法做到这一点。

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