none
MultiViewの入れ子は可能ですか(Webフォームの確認画面を実装) RRS feed

  • 質問

  • 氏名(姓),(名)を登録するWebフォーム(FormView)を作成しております。
    以下のようなインターフェースを実装したいです。
    -------
    ▼View1(フォーム入力画面)
    氏名(姓)「TextBox」
    氏名(名)「TextBox」
    ボタン「確認画面へ」
    -------
    ▼View2(フォーム確認画面)
    氏名(姓)「Label」
    氏名(名)「Label」
    ボタン「入力画面へ戻る」
    ボタン「登録」
    -------

    入力画面と確認画面を、MultiViewで切り替えをしようとしています。
    しかし確認画面の「登録」ボタンが作動しません。
    (ブラウザで同じ画面をリロードはしますが、DBには格納されず・・・)

    MultiViewの配置のしかたに悪戦苦闘をしております。
    以下がソースとなるのですが、MultiViewの入れ子のような事は出来ないでしょうか?
    もしくは「InsertButton」「UpdateButton」ボタンを確認画面に配置したいのですが。

    何かアドバイス頂きたいです。
    どうぞ宜しくお願い致します。

    ※実装方法はMultiViewでなくもかまわないです。(戻るボタンは必要ですが。)

    ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
    ▼WebForm.aspx
    <asp:MultiView ID="MultiView1" runat="server" ActiveViewIndex="0">
    <asp:View ID="View1" runat="server">
        <asp:FormView ID="FormView1" runat="server"
            DataSourceID="SqlDataSource1"
            DefaultMode="Edit">
    ----------------------------------------------------
            <EditItemTemplate>
                <table>
                <tr><th>氏名(姓)</th><td>
                <asp:TextBox ID="NameSeiTextBox" runat="server" Text='<%# Bind("NameSei") %>' /></td></tr>
                <tr><th>氏名(名)</th><td>
                <asp:TextBox ID="NameSeiTextBox" runat="server" Text='<%# Bind("NameSei") %>' /></td></tr>
                </table>
                <br>
                <asp:ValidationSummary ID="ValidationSummary1" runat="server"/>
    <asp:View ID="View2" runat="server">
                <asp:Button ID="UpdateButton" runat="server" CausesValidation="True" CommandName="Update" Text="登録"/>
    </asp:View>
            </EditItemTemplate>
    ----------------------------------------------------
            <InsertItemTemplate>
                <table>
                <tr><th>氏名(姓)</th><td>
                <asp:TextBox ID="NameSeiTextBox" runat="server" Text='<%# Bind("NameSei") %>' /></td></tr>
                <tr><th>氏名(名)</th><td>
                <asp:TextBox ID="NameSeiTextBox" runat="server" Text='<%# Bind("NameSei") %>' /></td></tr>
                </table>
                <asp:ValidationSummary ID="ValidationSummary1" runat="server"/>
    <asp:View ID="View2" runat="server">
                <asp:Button ID="InsertButton" runat="server" CausesValidation="True" CommandName="Insert" Text="登録"/>
    </asp:View>
            </InsertItemTemplate>
    ----------------------------------------------------
            <ItemTemplate>
                <table>
                <tr><th>氏名(姓)</th><td>
                <asp:TextBox ID="NameSeiTextBox" runat="server" Text='<%# Bind("NameSei") %>' /></td></tr>
                <tr><th>氏名(名)</th><td>
                <asp:TextBox ID="NameSeiTextBox" runat="server" Text='<%# Bind("NameSei") %>' /></td></tr>
                </table>
                ~ReadOnlyのため登録ボタンは配置しない~
            </ItemTemplate>
        </asp:FormView>
    ----------------------------------------------------
        <asp:SqlDataSource ID="SqlDataSource1" runat="server"
            ConflictDetection="CompareAllValues"
            ConnectionString="<%$ ConnectionStrings:xxxConnectionString %>"
            InsertCommand="~~~Insert文~~~"
            OldValuesParameterFormatString="original_{0}"
            SelectCommand="~~~Select文~~~"
            UpdateCommand="~~~Update文~~~">
            <InsertParameters>
                <asp:Parameter Name="NameSei" Type="String" />
                <asp:Parameter Name="NameMei" Type="String" />
            </InsertParameters>
            <SelectParameters>
                <asp:QueryStringParameter Name="Id" QueryStringField="Id" Type="Int32" />
            </SelectParameters>
            <UpdateParameters>
                <asp:Parameter Name="NameSei" Type="String" />
                <asp:Parameter Name="NameMei" Type="String" />
            </UpdateParameters>
        </asp:SqlDataSource>
        <asp:Button ID="Button4" runat="server" onclick="Button2_Click" Text="確認画面へ" />
    </asp:View>
    ----------------------------------------------------
    <asp:View ID="View2" runat="server">
                <asp:Label ID="Label_NameSei" runat="server" Text="Label"></asp:Label>
                <asp:Label ID="Label_NameMei" runat="server" Text="Label"></asp:Label>
                <asp:Button ID="Button1" runat="server" onclick="Button1_Click" Text="入力画面へ戻る" />
                <asp:Button ID="InsertButton" runat="server" CausesValidation="True" CommandName="Insert" Text="登録"/>
    </asp:View>
    </asp:MultiView>

    ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
    ▼aspx.cs
            //MultiView入力画面の表示
            protected void Button1_Click(object sender, EventArgs e)
            {
                MultiView1.ActiveViewIndex = 0;
            }

            //MultiView確認画面の表示
            protected void Button2_Click(object sender, EventArgs e)
            {
                MultiView1.ActiveViewIndex = 1;
            }
    ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■

    2012年6月15日 5:33

回答

  • ああ、ちゃんと見ずに適当なことかいちゃいけないな。。。

    えと、FormViewを使うなら、そのコントロールの使い方にあわせるべきだと思います。
    FormViewには入力確認画面なんかないので、確認画面がどうしても必要なら自分で一からつくるべきかと。

    とはいえ、上記のレベルであれば、MultiViewでもPanelでも場合によってはWizardコントロールでもいいかな?
    MultiViewやPanelの中に普通にTextBoxやLabelいれればいいでしょう。

    最初のViewにTextBoxいれて、確認用のViewではTextBoxの値をLabelに表示。
    戻るボタンで最初のViewに戻ったときはなにもしなくても最初に入力してた値が表示されるでしょうし、登録処理に進んだ場合は自分でSQL文書いて実行してデータ登録すればいいと思います。

    無理にコントロールの動きを変えようとするとむしろいろんなところにはまって遠回りになると思いますよ。


    あおい情報システム株式会社 小野修司(どっとねっとふぁん)

    • 回答としてマーク ミルズ 2012年6月15日 9:45
    2012年6月15日 9:28

すべての返信

  • Panel置いて、自分で表示非表示をコントロールしたらどうですかね?
    入れ子になっても問題ないはず。

    あおい情報システム株式会社 小野修司(どっとねっとふぁん)

    2012年6月15日 7:33
  • >小野様

    試しにPanelを配置してみました。

    <asp:Panel ID="Panel1" runat="server" >

       <asp:Button ID="UpdateButton" runat="server" CausesValidation="True" CommandName="Update" Text="登録"/>

    </asp:Panel>

    以下のようなエラーとなりました。

    「'System.Web.UI.WebControls.FormView' には 'Panel' というパブリック プロパティは含まれていません。」

    やはり実装方法として無理な事をしようとしているのでしょうか?

    ご見解あれば頂きたいと思っております。

    2012年6月15日 8:18
  • はっきり言ってメチャクチャって感じです。ちょっとコメントして
    直せるレベルではないです。

    FormView を使うのはやめて、TextBox を使ってはどうですか?

    2012年6月15日 9:27
  • ああ、ちゃんと見ずに適当なことかいちゃいけないな。。。

    えと、FormViewを使うなら、そのコントロールの使い方にあわせるべきだと思います。
    FormViewには入力確認画面なんかないので、確認画面がどうしても必要なら自分で一からつくるべきかと。

    とはいえ、上記のレベルであれば、MultiViewでもPanelでも場合によってはWizardコントロールでもいいかな?
    MultiViewやPanelの中に普通にTextBoxやLabelいれればいいでしょう。

    最初のViewにTextBoxいれて、確認用のViewではTextBoxの値をLabelに表示。
    戻るボタンで最初のViewに戻ったときはなにもしなくても最初に入力してた値が表示されるでしょうし、登録処理に進んだ場合は自分でSQL文書いて実行してデータ登録すればいいと思います。

    無理にコントロールの動きを変えようとするとむしろいろんなところにはまって遠回りになると思いますよ。


    あおい情報システム株式会社 小野修司(どっとねっとふぁん)

    • 回答としてマーク ミルズ 2012年6月15日 9:45
    2012年6月15日 9:28
  • ご指摘頂きありがとうございました。

    この実装で進めてきたのですが、だいぶトンチンカンな事をしていたようですね。

    お恥ずかしい限りです。

    おっしゃる通りに別の手法を検討しようと思います。

    コメントありがとうございました。

    2012年6月15日 9:44