Как изменить пользовательский объект в ASP.NET FormView на основе нажатия кнопки? - PullRequest
0 голосов
/ 22 апреля 2010

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 и т. Д.) Работают нормально. Тем не менее, я хочу включить кнопку, которая будет изменять состояние DataItem на основе некоторой очень простой логики. Не существует элемента управления формой, который мог бы управлять этим изменением в беспорядочной форме.

В действительности у меня есть форма для ввода адреса. Адрес может быть «стандартным» австралийским адресом (улица № и название, штатный пригород и почтовый индекс) или «нестандартным», что означает, что он имеет 3 адресные строки перед пригородом (для людей с более конкретными требованиями к адресу). Мне нужна кнопка с надписью «добавить больше строк», и нажатие на нее изменит объект с AddressLines.StandardAustralian на AddressLines.NonStandardAustralian. Для нестандартных адресов будет еще одна кнопка с надписью «Удалить лишние строки» и щелчком, который перевернет процесс.

Итак, я попытался добавить Button и изменить состояние DataItem в коде. Но проблема, с которой я сталкиваюсь, состоит в том, что DataItem объекта FormView является нулем / ничем. После прочтения этого SO вопроса кажется, что проблема заключается в том, что элемент не привязан к данным, когда происходит событие Click кнопки.

Итак, вопрос; Можно ли получить DataItem для FormView во время события нажатия кнопки? , а если нет: каковы мои варианты реализации этого?

Заранее спасибо.

Код сзади:

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>

1 Ответ

1 голос
/ 28 апреля 2010

Хорошо, у меня это работает. Возможно, не лучшим образом это можно сделать, это работает.

По сути, я добавил скрытое поле, связанное со значением, которое я хотел изменить. Затем в методе события нажатия кнопки я изменил значение скрытого поля и позволил FormView обновить пользовательский класс. Это вместо того, чтобы получить DataItem из FormView и изменить его напрямую, как я пытался в начале.

...