none
FormViewを挿入モードで開く RRS feed

  • 質問

  • GridViewに選択ボタンを付けて、FormViewに詳細がでてくるように画面を作りました。

    FormViewには、編集、削除、新規作成のリンクがあります。

    新規作成を押せばレコードの挿入ができました。

    でも新規作成したいときはGridViewを選択する必要はありません。

    そこで新しく新規作成ボタンを作って、ボタン押下でFormViewの挿入画面がでてくるようにしたいと考えました。

    どうやったらできるのでしょうか。

    ボタン押下時に

    FormView1.DefaultModeをFormViewMode.Insertにすると

    GridViewの選択押下でも新規作成になってしまいます。

     

    htmlソース

    <%@ Page Title="" Language="VB" MasterPageFile="~/Sample2/Site.master" AutoEventWireup="false" CodeFile="MultiView.aspx.vb" Inherits="Sample5_MultiView" %>

    <asp:Content ID="Content1" ContentPlaceHolderID="HeadContent" Runat="Server">
    </asp:Content>
    <asp:Content ID="Content2" ContentPlaceHolderID="MainContent" Runat="Server">
        <asp:MultiView ID="MultiView1" runat="server" ActiveViewIndex="0">
            <asp:View ID="View1" runat="server">
                <asp:Button ID="Button2" runat="server" CommandName="NextView" Text="新規作成" />
                <asp:GridView ID="GridView1" runat="server" AllowPaging="True"
                    AllowSorting="True" AutoGenerateColumns="False" BackColor="White"
                    BorderColor="#DEDFDE" BorderStyle="None" BorderWidth="1px" CellPadding="4"
                    DataKeyNames="isbn" DataSourceID="sds" ForeColor="Black"
                    GridLines="Vertical" PageSize="3">
                    <AlternatingRowStyle BackColor="White" />
                    <Columns>
                        <asp:CommandField ShowDeleteButton="True" ShowEditButton="True"
                            ShowSelectButton="True" />
                        <asp:BoundField DataField="isbn" HeaderText="isbnコード" ReadOnly="True"
                            SortExpression="isbn" />
                        <asp:BoundField DataField="title" HeaderText="書名" SortExpression="title" />
                        <asp:BoundField DataField="price" HeaderText="価格" SortExpression="price" />
                        <asp:BoundField DataField="publish" HeaderText="出版社"
                            SortExpression="publish" Visible="False" />
                        <asp:BoundField DataField="published" HeaderText="発売日"
                            SortExpression="published" />
                        <asp:CheckBoxField DataField="cdrom" HeaderText="CR-ROM" SortExpression="cdrom"
                            Visible="False" />
                    </Columns>
                    <FooterStyle BackColor="#CCCC99" />
                    <HeaderStyle BackColor="#6B696B" Font-Bold="True" ForeColor="White" />
                    <PagerStyle BackColor="#F7F7DE" ForeColor="Black" HorizontalAlign="Right" />
                    <RowStyle BackColor="#F7F7DE" />
                    <SelectedRowStyle BackColor="#CE5D5A" Font-Bold="True" ForeColor="White" />
                    <SortedAscendingCellStyle BackColor="#FBFBF2" />
                    <SortedAscendingHeaderStyle BackColor="#848384" />
                    <SortedDescendingCellStyle BackColor="#EAEAD3" />
                    <SortedDescendingHeaderStyle BackColor="#575357" />
                </asp:GridView>
                <asp:SqlDataSource ID="sds" runat="server"
                    ConnectionString="<%$ ConnectionStrings:ASPNET10MDFConnectionString %>"
                    DeleteCommand="DELETE FROM [Book] WHERE [isbn] = @isbn"
                    InsertCommand="INSERT INTO [Book] ([isbn], [title], [price], [publish], [published], [cdrom]) VALUES (@isbn, @title, @price, @publish, @published, @cdrom)"
                    SelectCommand="SELECT [isbn], [title], [price], [publish], [published], [cdrom] FROM [Book] ORDER BY [isbn]"
                    UpdateCommand="UPDATE [Book] SET [title] = @title, [price] = @price, [publish] = @publish, [published] = @published, [cdrom] = @cdrom WHERE [isbn] = @isbn">
                    <DeleteParameters>
                        <asp:Parameter Name="isbn" Type="String" />
                    </DeleteParameters>
                    <InsertParameters>
                        <asp:Parameter Name="isbn" Type="String" />
                        <asp:Parameter Name="title" Type="String" />
                        <asp:Parameter Name="price" Type="Int32" />
                        <asp:Parameter Name="publish" Type="String" />
                        <asp:Parameter DbType="Date" Name="published" />
                        <asp:Parameter Name="cdrom" Type="Boolean" />
                    </InsertParameters>
                    <UpdateParameters>
                        <asp:Parameter Name="title" Type="String" />
                        <asp:Parameter Name="price" Type="Int32" />
                        <asp:Parameter Name="publish" Type="String" />
                        <asp:Parameter DbType="Date" Name="published" />
                        <asp:Parameter Name="cdrom" Type="Boolean" />
                        <asp:Parameter Name="isbn" Type="String" />
                    </UpdateParameters>
                </asp:SqlDataSource>
            </asp:View>
            <asp:View ID="View2" runat="server">
                新規作成ではチェックが動きます。<br /> isbnコードに必須チェック、発売日に日付型チェックです。<br />
                <asp:FormView ID="FormView1" runat="server" AllowPaging="True"
                    BackColor="White" BorderColor="#DEDFDE" BorderStyle="None" BorderWidth="1px"
                    CellPadding="4" DataKeyNames="isbn" DataSourceID="sds0" ForeColor="Black"
                    GridLines="Vertical" Height="154px">
                    <EditItemTemplate>
                        isbnコード:
                        <asp:Label ID="isbnLabel1" runat="server" Text='<%# Eval("isbn") %>' />
                        <br />
                        書名:
                        <asp:TextBox ID="titleTextBox" runat="server" Text='<%# Bind("title") %>' />
                        <br />
                        単価:
                        <asp:TextBox ID="priceTextBox" runat="server" Text='<%# Bind("price") %>' />
                        <br />
                        出版社:
                        <asp:TextBox ID="publishTextBox" runat="server" Text='<%# Bind("publish") %>' />
                        <br />
                        発売日:
                        <asp:TextBox ID="publishedTextBox" runat="server"
                            Text='<%# Bind("published") %>' />
                        <br />
                        CD-ROM:
                        <asp:CheckBox ID="cdromCheckBox" runat="server"
                            Checked='<%# Bind("cdrom") %>' />
                        <br />
                        <asp:LinkButton ID="UpdateButton" runat="server" CausesValidation="True"
                            CommandName="Update" Text="更新" />
                        &nbsp;<asp:LinkButton ID="UpdateCancelButton" runat="server"
                            CausesValidation="False" CommandName="Cancel" Text="キャンセル" />
                    </EditItemTemplate>
                    <EditRowStyle BackColor="#CE5D5A" Font-Bold="True" ForeColor="White" />
                    <FooterStyle BackColor="#CCCC99" />
                    <HeaderStyle BackColor="#6B696B" Font-Bold="True" ForeColor="White" />
                    <InsertItemTemplate>
                        isbnコード:
                        <asp:TextBox ID="isbnTextBox" runat="server" Text='<%# Bind("isbn") %>' />
                        <asp:RequiredFieldValidator ID="RequiredFieldValidator1" runat="server"
                            ControlToValidate="isbnTextBox" ErrorMessage="isbnは必須です。" ForeColor="Red"
                            ValidationGroup="MyValid">*</asp:RequiredFieldValidator>
                        <br />
                        書名:
                        <asp:TextBox ID="titleTextBox" runat="server" Text='<%# Bind("title") %>' />
                        <br />
                        価格:
                        <asp:TextBox ID="priceTextBox" runat="server" Text='<%# Bind("price") %>' />
                        <br />
                        出版社:
                        <asp:TextBox ID="publishTextBox" runat="server" Text='<%# Bind("publish") %>' />
                        <br />
                        発売日:
                        <asp:TextBox ID="publishedTextBox" runat="server"
                            Text='<%# Bind("published") %>' Height="19px" Width="148px" />
                        <asp:CompareValidator ID="CompareValidator1" runat="server"
                            ControlToValidate="publishedTextBox" ErrorMessage="発売日は日付形式で入力してください。"
                            ForeColor="Red" Operator="DataTypeCheck" Type="Date" ValidationGroup="MyValid">*</asp:CompareValidator>
                        <br />
                        CD-ROM:
                        <asp:CheckBox ID="cdromCheckBox" runat="server"
                            Checked='<%# Bind("cdrom") %>' />
                        <br />
                        <asp:LinkButton ID="InsertButton" runat="server" CausesValidation="True"
                            CommandName="Insert" Text="挿入"
                            onclientclick="return confirm('挿入しても良いですか?');" ValidationGroup="MyValid" />
                        &nbsp;<asp:LinkButton ID="InsertCancelButton" runat="server"
                            CausesValidation="False" CommandName="Cancel" Text="キャンセル" />
                    </InsertItemTemplate>
                    <ItemTemplate>
                        isbnコード:
                        <asp:Label ID="isbnLabel" runat="server" Text='<%# Eval("isbn") %>' />
                        <br />
                        書名:
                        <asp:Label ID="titleLabel" runat="server" Text='<%# Bind("title") %>' />
                        <br />
                        単価:
                        <asp:Label ID="priceLabel" runat="server" Text='<%# Bind("price") %>' />
                        <br />
                        出版社:
                        <asp:Label ID="publishLabel" runat="server" Text='<%# Bind("publish") %>' />
                        <br />
                        発売日:
                        <asp:Label ID="publishedLabel" runat="server" Text='<%# Bind("published") %>' />
                        <br />
                        CD-ROM:
                        <asp:CheckBox ID="cdromCheckBox" runat="server" Checked='<%# Bind("cdrom") %>'
                            Enabled="false" />
                        <br />
                        <asp:LinkButton ID="EditButton" runat="server" CausesValidation="False"
                            CommandName="Edit" Text="編集" />
                        &nbsp;<asp:LinkButton ID="DeleteButton" runat="server" CausesValidation="False"
                            CommandName="Delete" Text="削除" />
                        &nbsp;<asp:LinkButton ID="NewButton" runat="server" CausesValidation="False"
                            CommandName="New" Text="新規作成" />
                    </ItemTemplate>
                    <PagerStyle BackColor="#F7F7DE" ForeColor="Black" HorizontalAlign="Right" />
                    <RowStyle BackColor="#F7F7DE" />
                </asp:FormView>
                <asp:SqlDataSource ID="sds0" runat="server"
                    ConnectionString="<%$ ConnectionStrings:ASPConnectionString %>"
                    DeleteCommand="DELETE FROM [Book] WHERE [isbn] = @isbn"
                    InsertCommand="INSERT INTO [Book] ([isbn], [title], [price], [publish], [published], [cdrom]) VALUES (@isbn, @title, @price, @publish, @published, @cdrom)"
                    SelectCommand="SELECT [isbn], [title], [price], [publish], [published], [cdrom] FROM [Book] WHERE ([isbn] = @isbn) ORDER BY [isbn]"
                   
                    UpdateCommand="UPDATE [Book] SET [title] = @title, [price] = @price, [publish] = @publish, [published] = @published, [cdrom] = @cdrom WHERE [isbn] = @isbn">
                    <DeleteParameters>
                        <asp:Parameter Name="isbn" Type="String" />
                    </DeleteParameters>
                    <InsertParameters>
                        <asp:Parameter Name="isbn" Type="String" />
                        <asp:Parameter Name="title" Type="String" />
                        <asp:Parameter Name="price" Type="Int32" />
                        <asp:Parameter Name="publish" Type="String" />
                        <asp:Parameter DbType="Date" Name="published" />
                        <asp:Parameter Name="cdrom" Type="Boolean" />
                    </InsertParameters>
                    <SelectParameters>
                        <asp:ControlParameter ControlID="GridView1" Name="isbn"
                            PropertyName="SelectedValue" Type="String" />
                    </SelectParameters>
                    <UpdateParameters>
                        <asp:Parameter Name="title" Type="String" />
                        <asp:Parameter Name="price" Type="Int32" />
                        <asp:Parameter Name="publish" Type="String" />
                        <asp:Parameter DbType="Date" Name="published" />
                        <asp:Parameter Name="cdrom" Type="Boolean" />
                        <asp:Parameter Name="isbn" Type="String" />
                    </UpdateParameters>
                </asp:SqlDataSource>
                <br />
                <asp:ValidationSummary ID="ValidationSummary1" runat="server"
                    BorderStyle="Solid" BorderWidth="1px" HeaderText="エラーが発生しました。"
                    ValidationGroup="MyValid" />
                <asp:Button ID="Button1" runat="server" CommandName="PrevView" Text="一覧へ" />
            </asp:View>
        </asp:MultiView>
    </asp:Content>

     

    コード

    Partial Class Sample5_MultiView
        Inherits System.Web.UI.Page

        Protected Sub GridView1_SelectedIndexChanging(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewSelectEventArgs) Handles GridView1.SelectedIndexChanging
            'FormView1.DefaultMode = FormViewMode.ReadOnly
            MultiView1.ActiveViewIndex = 1
        End Sub


    End Class


    2011年3月25日 10:35

回答

  • 新規作成ボタンを押したときだけ FormView1.DefaultModeをFormViewMode.Insert に設定すればいいと思いますけど。
    もしそれでどうしてもうまく動かないようなら、FormViewを2つ作っておいて、選択ボタンを押したときに表示するFormViewと新規作成ボタンを押したときに表示するFormViewを別にしておいてもいいと思います。


    あおい情報システム株式会社 小野修司(どっとねっとふぁん)
    2011年3月26日 6:05
  • > 前の状態が残っているのは、初期化みたいな処理が足りないからなのでしょうか。

    そうですね。
    FormView等のコントロールは自分の状態をViewStateに持つようになっていたりするのでその結果前の状態が保持されているんじゃないかと思います。
    初期化的な処理をいれたほうがいいのかもしれません。

    > 挿入時にはこのキーの値を取得する必要があります。どう取得するのがよいのでしょうか。

    asp.netで特別に便利な関数といったものは用意されていません。
    挿入時に利用するSQL文に追加されたIDを返す処理まで含めることができたと思います。
    そのようなSQL文を利用し、取得したIDをそのあとで利用するというのがよいかと思います。


    あおい情報システム株式会社 小野修司(どっとねっとふぁん)
    2011年3月28日 2:14

すべての返信

  • アップされたコードを問題を再現できる必要最小限に絞ってアップしなおし、
    もっと具体的に、ここをこう操作するとXXXになってしまうが、期待する
    動作は○○○というような説明を書くことはできませんか?
    2011年3月26日 5:36
  • 新規作成ボタンを押したときだけ FormView1.DefaultModeをFormViewMode.Insert に設定すればいいと思いますけど。
    もしそれでどうしてもうまく動かないようなら、FormViewを2つ作っておいて、選択ボタンを押したときに表示するFormViewと新規作成ボタンを押したときに表示するFormViewを別にしておいてもいいと思います。


    あおい情報システム株式会社 小野修司(どっとねっとふぁん)
    2011年3月26日 6:05
  • ありがとうございます。

    >新規作成ボタンを押したときだけ FormView1.DefaultModeをFormViewMode.Insert に設定すればいい

    もちろんやってみました。

    1回目に新規作成を押下したときは、挿入のFormが出てきます。

    何も操作せず一覧へボタン(自作)を押下して戻り、GridViewの選択を押下すると、また挿入のFormになってしまいます。

    一覧へボタン(自作)で何か工夫が必要なのでしょうか。

     

    FormViewは、編集モードでひらいたまま一覧へボタンを押下して戻り、違うレコードの選択を押下して表示させると

    選択したレコードが編集モードで表示されます。

    前の状態が残っているのは、初期化みたいな処理が足りないからなのでしょうか。

     

    うまくできなければ教えていただいた通り2つに分けようと思います。

    2つに分けた場合、挿入後読みと利用のFormに遷移させたいと思います。

    読み取り用のFormは、キー項目(挿入時に自動採番)を引数にしています。

    挿入時にはこのキーの値を取得する必要があります。どう取得するのがよいのでしょうか。

    DBがSQLServerの場合、直前のid取得みたいなSELECTで取れる気がしますが

    ほぼ同時にInsertされた場合にはうまく動作しなかった経験があります。

    asp.netでは便利な関数があるのでしょうか。


    2011年3月28日 0:25
  • > 前の状態が残っているのは、初期化みたいな処理が足りないからなのでしょうか。

    そうですね。
    FormView等のコントロールは自分の状態をViewStateに持つようになっていたりするのでその結果前の状態が保持されているんじゃないかと思います。
    初期化的な処理をいれたほうがいいのかもしれません。

    > 挿入時にはこのキーの値を取得する必要があります。どう取得するのがよいのでしょうか。

    asp.netで特別に便利な関数といったものは用意されていません。
    挿入時に利用するSQL文に追加されたIDを返す処理まで含めることができたと思います。
    そのようなSQL文を利用し、取得したIDをそのあとで利用するというのがよいかと思います。


    あおい情報システム株式会社 小野修司(どっとねっとふぁん)
    2011年3月28日 2:14
  • ありがとうございます。

    FormViewを2つにしてなんとか形にできました。

    2011年3月28日 2:22