我有一个数据转发器,它绑定到页面上的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
答案 0 :(得分:1)
您无法使用Repeater控件执行此操作:它不会保留绑定到的对象的副本。它不会进行双向绑定。
但其他控件确实如此。查看FormView,GridView和DetailsView。有关该主题的完整处理,请参阅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来实现所需的输出。