1

誰かがこれで私を助けることができるのだろうか. 私は答えを探していて、これまでのところ得ていますが、何かが足りないと思います。

動的データを使用して作成された FormView があります。その FormView 内には、ItemCosts、AdditionalCosts、TotalCosts の 3 つのフィールドがあります。ItemsCosts と AdditionalCosts を一緒に追加して TotalCosts テキストボックスに表示するボタンをフォームに配置できるようにしたいと考えています。十分に単純な...そう私は思った。

FormView はポストバック時にこのコマンドを使用するため、ItemCommand を使用する必要があることがわかりました。これは私が書いたものです:

HTML

 <asp:Panel ID="DetailsPanel" runat="server">
                <br /><br />
                <asp:FormView ID="FormView1" runat="server" DataSourceID="DetailsDataSource" RenderOuterTable="false"
                    OnPreRender="FormView1_PreRender" OnModeChanging="FormView1_ModeChanging" OnItemUpdated="FormView1_ItemUpdated"
                    OnItemInserted="FormView1_ItemInserted" OnItemDeleted="FormView1_ItemDeleted" OnItemCommand="FormView1_ItemCommand" OnDataBinding="FormView1_DataBind">
                    <HeaderTemplate>
                        <table id="detailsTable" class="DDDetailsTable" cellpadding="6">
                    </HeaderTemplate>
                    <ItemTemplate>
                    <tr class="td">
                        <td class="DDLightHeader">Order No</td>
                        <td><asp:DynamicControl ID="OrderNo" runat="server" DataField="OrderNo" /></td>
                    </tr>
                    <tr class="td">
                        <td class="DDLightHeader">Item Costs</td>
                        <td><asp:DynamicControl runat="server" DataField="ItemCosts" /></td>
                    </tr>
                    <tr class="td">
                        <td class="DDLightHeader">AdditionalCosts</td>
                        <td><asp:DynamicControl runat="server" DataField="AdditionalCosts" /></td>
                    </tr>
                    <tr class="td">
                        <td class="DDLightHeader">Total Costs</td>
                        <td><asp:DynamicControl runat="server" DataField="TotalCosts" /></td>
                    </tr>
                    <tr class="td">
                           <td colspan="2">
                                <asp:LinkButton ID="LinkButton1" runat="server" CommandName="Edit" Text="Edit" />
                                <asp:LinkButton ID="LinkButton2" runat="server" CommandName="Delete" Text="Delete"
                                    OnClientClick='return confirm("Are you sure you want to delete this item?");' />  
 </td>
                        </tr>
                    </ItemTemplate>
                    <EditItemTemplate>
                     <tr class="td">
                        <td class="DDLightHeader">Order No</td>
                        <td><asp:DynamicControl ID="OrderNo" runat="server" DataField="OrderNo" Mode="ReadOnly"/></td>
                    </tr>
                    <tr class="td">
                        <td class="DDLightHeader">Item Costs</td>
                        <td><asp:DynamicControl runat="server" DataField="ItemCosts" Mode="Edit" /></td>
                    </tr>
                    <tr class="td">
                        <td class="DDLightHeader">Additional Costs</td>
                        <td><asp:DynamicControl runat="server" DataField="AdditionalCosts" Mode="Edit" /></td>
                    </tr>
                    <tr class="td">
                        <td class="DDLightHeader">Total Costs</td>
                        <td><asp:DynamicControl runat="server" DataField="TotalCosts" Mode="Edit"  /></td>
                        <td><asp:Button runat="server" ID="btnCalculateTotalCosts" Text="Calculate total costs" CommandName="Calculate" /></td>
                    </tr>                    
                    <tr class="td">
                        <td class="DDLightHeader">View Items</td>
                        <td><asp:DynamicControl runat="server" DataField="tblCateringOrdersDetailsItems" Mode="Edit" /></td>
                    </tr>
                       <tr class="td">
                            <td colspan="2">
                                <asp:LinkButton ID="LinkButton4" runat="server" CommandName="Update" Text="Update" />
                                <asp:LinkButton ID="LinkButton5" runat="server" CommandName="Cancel" Text="Cancel" CausesValidation="false" />
                            </td>
                        </tr>
                    </EditItemTemplate>
                    <InsertItemTemplate>
                        <asp:DynamicEntity ID="DynamicEntity3" runat="server" Mode="Insert" />
                        <tr class="td">
                            <td colspan="2">
                                <asp:LinkButton ID="LinkButton6" runat="server" CommandName="Insert" Text="Insert" />
                                <asp:LinkButton ID="LinkButton7" runat="server" CommandName="Cancel" Text="Cancel" CausesValidation="false" />
                            </td>
                        </tr>
                    </InsertItemTemplate>
                    <FooterTemplate>
                        </table>
                    </FooterTemplate>
                </asp:FormView>

                <asp:EntityDataSource ID="DetailsDataSource" runat="server" EnableDelete="true" EnableInsert="true" EnableUpdate="true" />

                <asp:QueryExtender ID="QueryExtender1" TargetControlID="DetailsDataSource" runat="server">
                    <asp:ControlFilterExpression ControlID="GridView1" />
                </asp:QueryExtender>
            </asp:Panel>

EditTemplate セクションに btnCalculateTotalCosts ボタンを追加しました。

コード ビハインドでは、ItemCommand コントロールを作成しました。

protected void FormView1_ItemCommand(object sender, FormViewCommandEventArgs e)
        {
            if (e.CommandName == "Calculate")
            {
                FormViewRow row = FormView1.Row;
                decimal itemCosts;
                decimal additionalCosts;

                TextBox itemsCostTextBox = (TextBox)row.FindControl("ItemCosts");
                TextBox additionalCostsTextBox = (TextBox)row.FindControl("AdditionalCosts");
                TextBox totalCostsTextBox = (TextBox)row.FindControl("TotalCosts");

                Decimal.TryParse(itemsCostTextBox.Text, out itemCosts);
                Decimal.TryParse(additionalCostsTextBox.Text, out additionalCosts);

                totalCostsTextBox.Text = (itemCosts + additionalCosts).ToString();
}

しかし、「オブジェクト参照がオブジェクトのインスタンスに設定されていません」というエラーが表示され続けます。最初にフィールドを FormView にバインドする必要があることを読んだので、次を作成しようとしました

 protected void FormView1_DataBind(object sender, EventArgs e)
        {
            if (FormView1.CurrentMode == FormViewMode.Edit)
            {
                TextBox itemsCostTextBox = (TextBox)FormView1.FindControl("ItemCosts");
                TextBox additionalCostsTextBox = (TextBox)FormView1.FindControl("AdditionalCosts");
                TextBox totalCostsTextBox = (TextBox)FormView1.FindControl("TotalCosts");
            }
        }

タグで DataBind を OnDataBinding="FormView1_DataBind" として参照しますが、これも機能せず、同じエラーが発生します。

私は実際にこれを解決しようとしましたが、FindControl が FormView のフィールドを「認識」していないことに気付きましたが、これを行う方法がわかりません。

どんな助けでも大歓迎ですありがとう

4

2 に答える 2

0

FindControl()ID探しているコントロールの を受け取ります。あなたが投稿した ASPX コードから、を使用して見つけようとしている sのIDプロパティを設定していることはわかりません。そのメソッドへのこの呼び出し:DynamicControlFindControl()

TextBox itemsCostTextBox = (TextBox)row.FindControl("ItemCosts");

DataFieldの代わりにプロパティ値を渡していますIDID検索するすべての にプロパティを追加DynamicControlします。

FindControl()が再帰検索を実行しないことも考慮してIDください。コントロールの子の間で指定されたコントロールのみを検索します。

于 2013-07-08T16:38:06.047 に答える