【问题标题】:How can I modify a custom object in an ASP.NET FormView based on a button click?如何根据按钮单击修改 ASP.NET FormView 中的自定义对象?
【发布时间】:2010-04-22 02:46:31
【问题描述】:

NB. I am going to be away until Tuesday next week. So all help is appreciated but I will be unable to comment/respond until then.

我有一个修改自定义类实例的 FormView。各种表单控件(TextBox、DropDownList 等)工作正常。但是,我想包含一个 Button,它将根据一些非常简单的逻辑修改 DataItem 的状态。没有任何表单控件可以以一种简单易懂的方式控制这种变化。

实际情况是我有一个输入地址的表格。地址可能是“标准”澳大利亚地址(街道编号和名称、郊区州和邮政编码),也可能是“非标准”,这意味着它在郊区之前有 3 个地址行(适用于有更具体地址要求的人)。我想要一个显示“添加更多行”的按钮,单击它会将对象从AddressLines.StandardAustralian 更改为AddressLines.NonStandardAustralian。对于非标准地址,会有另一个按钮显示“删除多余的行”,单击该按钮将反转该过程。

所以我尝试在代码隐藏中添加一个按钮并修改 DataItem 的状态。但我遇到的问题是 FormView 的 DataItem 为空/无。从阅读此SO question 来看,问题似乎是在触发 Button 的 Click 事件时,该项目未进行数据绑定。

所以,问题; 是否可以在 Button 的 Click 事件期间获取 FormView 的 DataItem? 如果不能:我有哪些实施方案?

提前致谢。

代码背后:

Private ReadOnly Property addressView() As AddressView
    Get
        Return CType(FormView1.DataItem, AddressView) ' <-- But DataItem is Nothing when called from lbMakeNonStd_Click
    End Get
End Property

Protected Sub lbMakeNonStd_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles lbMakeNonStd.Click
    If addressView IsNot Nothing Then

        Select Case addressView.NonStd
            Case AddressLines.StandardAustralian
                addressView.NonStd = AddressLines.NonStandardAustralian

            Case AddressLines.NonStandardAustralian
                addressView.NonStd = AddressLines.StandardAustralian

            Case Else
                ' Other cases ignored, shouldn't change address lines
        End Select
    End If
End Sub

aspx:

<asp:FormView ID="FormView1" runat="server" DataKeyNames="IDNO, AddressType" DataSourceID="ObjectDataSource1" EnableViewState="true" >
<ItemTemplate>
    ...
</ItemTemplate>
<EditItemTemplate>
    <fieldset>
    <legend>Address</legend>
    <asp:UpdatePanel ID="upAddressFields" runat="server" UpdateMode="Conditional">
    <Triggers>
        <asp:AsyncPostBackTrigger controlid="txtPostcode" eventname="TextChanged" />
    </Triggers>
    <ContentTemplate>
    <asp:Table ID="tblForm" runat="server">
        <asp:TableRow ID="trName" runat="server">
            <asp:TableHeaderCell ID="TableCell1" runat="server">
                Name
            </asp:TableHeaderCell>
            <asp:TableCell ID="TableCell2" runat="server">
                <asp:TextBox ID="tbName" runat="server" Text='<%# Bind("AlternateName") %>' MaxLength="30"></asp:TextBox>
            </asp:TableCell>
        </asp:TableRow>
        <asp:TableRow ID="TableRow2" runat="server" Cs>
            <asp:TableHeaderCell ID="TableCell3" runat="server">
                Number and Street
            </asp:TableHeaderCell>
            <asp:TableCell ID="TableCell4" runat="server">
                <asp:TextBox ID="tbLine1" runat="server" Text='<%# Bind("Line1") %>' MaxLength="30"></asp:TextBox>
                <asp:PlaceHolder ID="phMakeNonStdButton" runat="server">(<asp:LinkButton ID="lbMakeNonStd" runat="server" Text="Add more lines..." />)</asp:PlaceHolder>
            </asp:TableCell>
        </asp:TableRow>
        <asp:TableRow ID="trLine2" runat="server" CssClass="tablerowbg_light">
            <asp:TableHeaderCell ID="TableCell5" runat="server">
                Line 2
            </asp:TableHeaderCell>
            <asp:TableCell ID="TableCell6" runat="server">
                <asp:TextBox ID="tbLine2" runat="server" Text='<%# Bind("Line2") %>' MaxLength="30"></asp:TextBox>
                <br /><asp:LinkButton ID="lbMakeStd" runat="server" Text="Use fewer lines..." />
            </asp:TableCell>
        </asp:TableRow>
    </asp:Table>
    </ContentTemplate>
    </asp:UpdatePanel>
    <asp:LinkButton ID="lbUpdate" runat="server" CommandName="Update" ValidationGroup="ResidentialAddress" Font-Bold="true">Save Changes</asp:LinkButton> |
    <asp:LinkButton ID="lbCancel" runat="server" CommandName="Cancel" CausesValidation="false">Cancel</asp:LinkButton>
</EditItemTemplate>

【问题讨论】:

  • 为 FormView 和 DataSource 的按钮单击方法和 aspx 源添加了代码隐藏。让我知道是否还有其他可能有用的代码。

标签: asp.net data-binding formview


【解决方案1】:

好的,所以我有这个工作。也许不是最好的方法。

基本上,我添加了一个隐藏字段,绑定到我想要更改的值。然后在按钮的点击事件方法中我修改了隐藏字段的值,让FormView更新自定义类。这不是从 FormView 获取 DataItem 并直接修改它,就像我在开始时尝试的那样。

【讨论】:

    猜你喜欢
    • 2020-06-14
    • 1970-01-01
    • 2020-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-30
    • 1970-01-01
    相关资源
    最近更新 更多