0

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 个地址行(适用于有更具体地址要求的人)。我想要一个按钮,上面写着“添加更多行”,单击它会将对象从 is 更改AddressLines.StandardAustralianAddressLines.NonStandardAustralian. 对于非标准地址,将有另一个按钮显示“删除多余的行”,单击该按钮将反转该过程。

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

所以,问题;是否可以在按钮的 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

ASP:

<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>

4

1 回答 1

1

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

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

于 2010-04-28T04:13:29.463 回答