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など)が正常に機能しています。ただし、非常に単純なロジックに基づいてDataItemの状態を変更するButtonを含めたいと思います。紛らわしくない方法でこの変更を制御できるフォーム制御はありません。

実は、住所を入力するためのフォームがあります。住所は「標準」のオーストラリアの住所(番地と名前、郊外の州と郵便番号)の場合もあれば、「非標準」の場合もあります。つまり、郊外の前に3つの住所行があります(より具体的な住所要件がある場合)。「行を追加」というボタンが欲しいのですが、それをクリックするとオブジェクトがからに変わりAddressLines.StandardAustralianますAddressLines.NonStandardAustralian。非標準アドレスの場合、「余分な行を削除」という別のボタンがあり、それをクリックするとプロセスが逆になります。

そこで、ボタンを追加して、コードビハインドのDataItemの状態を変更してみました。しかし、私が遭遇する問題は、FormViewのDataItemがnull/nothingであるということです。このSOの質問を読んだところ、ボタンの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>

4

1 に答える 1

1

わかりました、それで私はこれを機能させています。おそらくそれが機能する最善の方法ではありません。

基本的に、変更したい値にバインドされた非表示フィールドを追加しました。次に、ボタンのクリックイベントメソッドで、非表示フィールドの値を変更し、FormViewにカスタムクラスを更新させました。これは、FormViewからDataItemを取得して、最初に試したように直接変更する代わりです。

于 2010-04-28T04:13:29.463 に答える