none
LsitViewのSELECTのselectcommadの変更について RRS feed

  • 質問

  • たびたびすみません。ちいです。

    現在単票+帳票の注文伝票を作成しています。
    単票の部分はテキストボックスをたくさん作り作成し、帳票ではListViewを使い作成しています。
    質問の内容としては画面から伝票IDを入力してもらいデータベースのデータを検索する仕組みを作成したいのですが、
    単票の方はなんとか出来たのですが、ListViewのseletcommandを変更したいのですが、方法がわからず質問させて
    いただきました。

    コード

    '***********検索 *******************  

     Protected Sub D_k_dtn_Click(ByVal sender As Object, ByVal e As System.EventArgs)

            If (Page.IsValid = False) Then
                Exit Sub
            End If
           
           
            Dim setting As System.Configuration.ConnectionStringSettings = _
                       System.Configuration.ConfigurationManager.ConnectionStrings("MyDB")
           
            Using con As New SqlConnection(setting.ConnectionString)
               
                'クエリにSQL文を入れる
                Dim query As String = _
                ("SELECT Tchumon.伝票ID,Tchumon.日時,Tchumon.担当者id,Ttantou.担当者名," _
                & "Tchumon.お客様id,Tkokyaku.顧客名,Tkokyaku.町名,Tkokyaku.番地," _
                & "Tkokyaku.電話番号,Tkokyaku.顧客情報" _
                & " FROM ((Tchumon INNER JOIN Tkokyaku ON Tchumon.お客様id=Tkokyaku.顧客ID)" _
                & " INNER JOIN Ttantou ON Tchumon.担当者id=Ttantou.担当者ID)" _
                & " WHERE 伝票ID=@伝票ID")
               
               
               
                Dim da As New SqlDataAdapter(query, con)
                da.SelectCommand.Parameters.AddWithValue("@伝票ID", Convert.ToInt32(d_id.Text))
                   
                Dim dt As New DataTable()
                If (da.Fill(dt) = 0) Then
                    Label1.Text = "この伝票IDは検索出来ません。伝票IDを入力しなおしてください"
                    d_id.Text = ""
                Else
                    '親の伝票画面表示
                    D_time.Text = dt.Rows(0)("日時").ToString()
                    t_id.SelectedValue = CType(dt.Rows(0)("担当者id"), String)
                    D_t_mei.Text = dt.Rows(0)("担当者名").ToString()
                    D_k_id.SelectedValue = CType(dt.Rows(0)("お客様id"), String)
                    D_k_mei.Text = dt.Rows(0)("顧客名").ToString()
                    D_chomei.Text = dt.Rows(0)("町名").ToString()
                    D_banchi.Text = dt.Rows(0)("番地").ToString()
                    D_tel.Text = dt.Rows(0)("電話番号").ToString()
                    D_jyohou.Text = dt.Rows(0)("顧客情報").ToString()
                   
                    da.SelectCommand.CommandText = _
           "SELECT Tchumon_meisai.商品id," _
            & "Tsyohin.商品名, Tchumon_meisai.注文数, Tsyohin.単価, (Tchumon_meisai.注文数 * Tsyohin.単価)" _
            & "As 金額 FROM Tsyohin INNER JOIN Tchumon_meisai ON Tsyohin.商品ID = Tchumon_meisai.商品id " _
            & " WHERE 伝票id = @伝票ID"
                    
            Dim di As New DataTable()
                    
                    If (da.Fill(di) = 0) Then
                        Label1.Text = "明細がありません。"
                       
                    Else
                    ここで、ListViewのselectcommandに上記のcommandを入れたいと考えています。                    
                       

                    
                       
                   
                    End If
                End If
                   
            End Using
            End Sub

                <asp:ListView ID="ListView1" runat="server" DataSourceID="SqlDataSource11"
             InsertItemPosition="LastItem"
                onselectedindexchanged="ListView1_SelectedIndexChanged">
             
          
        
          
             
             
                <ItemTemplate>
                    <tr style="">
                        <td>
                            <asp:Label ID="商品コードLabel" runat="server" Text='<%# Eval("商品コード") %>' />
                        </td>
                        <td>
                            <asp:Label ID="商品名Label" runat="server" Text='<%# Eval("商品名") %>' />
                        </td>
                        <td>
                            <asp:Label ID="注文数Label" runat="server" Text='<%# Eval("注文数") %>' />
                        </td>
                        <td>
                            <asp:Label ID="単価Label" runat="server" Text='<%# Eval("単価") %>' />
                        </td>
                        <td>
                            <asp:Label ID="金額Label" runat="server" Text='<%# Eval("金額") %>' />
                        </td>
                    </tr>
                </ItemTemplate>
               
               
                <AlternatingItemTemplate>
                    <tr style="">
                        <td>
                            <asp:Label ID="商品コードLabel" runat="server" Text='<%# Eval("商品コード") %>' />
                        </td>
                        <td>
                            <asp:Label ID="商品名Label" runat="server" Text='<%# Eval("商品名") %>' />
                        </td>
                        <td>
                            <asp:Label ID="注文数Label" runat="server" Text='<%# Eval("注文数") %>' />
                        </td>
                        <td>
                            <asp:Label ID="単価Label" runat="server" Text='<%# Eval("単価") %>' />
                        </td>
                        <td>
                            <asp:Label ID="金額Label" runat="server" Text='<%# Eval("金額") %>' />
                        </td>
                    </tr>
                </AlternatingItemTemplate>
               
               
                <EmptyDataTemplate>
                    <table runat="server" style="">
                        <tr>
                            <td>
                                データは返されませんでした。</td>
                        </tr>
                    </table>
                </EmptyDataTemplate>
              
               
                <InsertItemTemplate>
                    <tr style="">
                      
                        <td>
                           
                           
                            <asp:DropDownList ID="商品コードDr" runat="server"
                                DataSourceID="SqlDataSource13" DataTextField="商品ID" DataValueField="商品ID"
                             AutoPostBack="true" OnSelectedIndexChanged="商品コードDr_SelectedIndexChenged"  />
                           
                            <asp:SqlDataSource ID="SqlDataSource13" runat="server" ConnectionString="<%$ ConnectionStrings:MyDB %>"
                              SelectCommand="SELECT [商品ID] FROM [Tsyohin]"></asp:SqlDataSource>
                       
                        </td>
                        <td>
                            <asp:TextBox ID="商品名TextBox" runat="server" Text='<%# Bind("商品名") %>'
                              ReadOnly="True"/>
                        </td>
                        <td>
                            <asp:TextBox ID="新注文数TextBox" runat="server" Text='<%# Bind("注文数") %>'
                              OnTextChanged="新注文数TextBox_TextChanged" AutoPostBack="True"/>
                        </td>
                        <td>
                            <asp:TextBox ID="単価TextBox" runat="server" Text='<%# Bind("単価") %>'
                              ReadOnly="True" />
                        </td>
                        <td>
                            <asp:TextBox ID="金額TextBox" runat="server" Text='<%# Bind("金額") %>'
                              ReadOnly="True" />
                        </td>
                     
                    
                     <td>
                            <asp:Button ID="InsertButton" runat="server" CommandName="Insert" Text="挿入" />
                            <asp:Button ID="CancelButton" runat="server" CommandName="Cancel" Text="クリア" />
                        </td>
                        <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>   
                  
                    </tr>
                </InsertItemTemplate>
               
               
                <LayoutTemplate>
                    <table runat="server">
                        <tr runat="server">
                            <td runat="server">
                                <table ID="itemPlaceholderContainer" runat="server" border="0" style="">
                                    <tr runat="server" style="">
                                          <th runat="server">商品コード</th>  
                                        <th runat="server">               商品名</th>
                                        <th runat="server">注文数</th>
                                        <th runat="server">単価</th>
                                        <th runat="server">金額</th>
                                    </tr>
                                    <tr ID="itemPlaceholder" runat="server">
                                    </tr>
                                </table>
                            </td>
                        </tr>
                        <tr runat="server">
                            <td runat="server" style="">
                            </td>
                        </tr>
                    </table>
                </LayoutTemplate>
               
                <EditItemTemplate>
                    <tr style="">
                        <td>
                            <asp:Button ID="UpdateButton" runat="server" CommandName="Update" Text="更新" />
                            <asp:Button ID="CancelButton" runat="server" CommandName="Cancel"
                                Text="キャンセル" />
                        </td>
                        <td>
                            <asp:TextBox ID="商品コードTextBox" runat="server" Text='<%# Bind("商品コード") %>' />
                        </td>
                        <td>
                            <asp:TextBox ID="商品名TextBox" runat="server" Text='<%# Bind("商品名") %>' />
                        </td>
                        <td>
                            <asp:TextBox ID="注文数TextBox" runat="server" Text='<%# Bind("注文数") %>' />
                        </td>
                        <td>
                            <asp:TextBox ID="単価TextBox" runat="server" Text='<%# Bind("単価") %>' />
                        </td>
                        <td>
                            <asp:TextBox ID="金額TextBox" runat="server" Text='<%# Bind("金額") %>' />
                        </td>
                    </tr>
                </EditItemTemplate>
               
                <SelectedItemTemplate>
                    <tr style="">
                        <td>
                            <asp:Label ID="商品コードLabel" runat="server" Text='<%# Eval("商品コード") %>' />
                        </td>
                        <td>
                            <asp:Label ID="商品名Label" runat="server" Text='<%# Eval("商品名") %>' />
                        </td>
                        <td>
                            <asp:Label ID="注文数Label" runat="server" Text='<%# Eval("注文数") %>' />
                        </td>
                        <td>
                            <asp:Label ID="単価Label" runat="server" Text='<%# Eval("単価") %>' />
                        </td>
                        <td>
                            <asp:Label ID="金額Label" runat="server" Text='<%# Eval("金額") %>' />
                        </td>
                    </tr>
                </SelectedItemTemplate>
            </asp:ListView>
            <asp:SqlDataSource ID="SqlDataSource11" runat="server"
                ConnectionString="<%$ ConnectionStrings:MyDB %>"
                SelectCommand="SELECT [商品コード], [商品名], [注文数], [単価], [金額] FROM [Tnew_meisai]"
              
               InsertCommand="INSERT INTO [Tchumon_meisai] ([伝票id], [行番号], [商品id], [商品名], [注文数]) VALUES (@伝票id, @行番号, @商品id, @注文数)" >
                
              <InsertParameters>
                <asp:Parameter Name="伝票id" Type="Int32" />
                <asp:Parameter Name="行番号" Type="Int32" />
                <asp:Parameter Name="商品id" Type="Int32" />
                <asp:Parameter Name="注文数" Type="Int32" />
            </InsertParameters>
            </asp:SqlDataSource>
        </p>
        <p style="height: 186px">
           

        

    2010年4月15日 7:51

回答


  • ちいさんに返信

    > 取得したデータをListViewにて画面に表示させたい。その方法が知りたいです。      

    ListView.DataSource に取得した DataTable をセットして DataBind したり

    ListView1.DataSourceID = Nothing
    ListView1.DataSource = di
    ListView1.DataBind()

    SqlDataSource.SelectCommand を書き換えて DataBind したりしてはいかがでし
    ょうか。

    SqlDataSource11.SelectCommand = da.SelectCommand.CommandText
    SqlDataSource11.SelectParameters.Clear()
    SqlDataSource11.SelectParameters.Add("伝票ID", DbType.Int32, d_id.Text)
    SqlDataSource11.DataBind()
    • 回答としてマーク ちい 2010年4月22日 7:23
    2010年4月16日 7:00

すべての返信

  • このような進め方ではゴールが遠そうです。

    ちょっと進むたびに問題にぶつかって質問するということを
    繰り返していますが、部分的にはそれで解決できたとしても、
    全体的に期待通り動くように完成するのはかなり難しそうで
    す。

    先にもお願いしましたが、部分的な問題点の解決方法を求め
    るだけでなく、問題のページだけでいいので、そのページ全
    体で、最初にまず何を表示して、ボタンクリックのイベント
    で、何をどのような手順でどうしたいのかなどのシナリオを
    書いていただけませんか。

    > ListViewのseletcommandを変更したいのですが

    と言われても、どうしたいのかぜんぜん分かりません。

    全体的なシナリオが分かると、部分的な問題解決だけでなく、
    ゴールに近づくためのお手伝いができるもしれません。

    2010年4月15日 12:47
  • SurferOnWwwさんへ

    返信ありがとうございます。
    全体的な話をしますと、ピザ屋のシステムを作っています。顧客が入力するものですなく、店側が管理するために使うシステムです。マスタとうしてテーブルが3つほどあります。Ttantou(担当者ID(主)・担当者名)/Tkokyaku(顧客ID・顧客名・町名・番地・電話・顧客情報)/Tsyohin(商品ID・商品名・単価)

    注文テーブル
    Tchumon(T伝票ID・日時・担当者id・お客様id)
    Tchumon_meisai(伝票ID(主キー)・行番号・商品id・注文数)
    というテーブルがあります。

    注文テーブルの2つのテーブルを使いボタンクリックにより検索・登録・修正・削除が一つの画面で出来る注文伝票を作りたいと思っています。
    単票部分と帳票部分をあわせて検索・登録・修正・削除が出来る仕組みにしたいと思っています。親(注文伝票)と子(注文伝票入力)という仕組みにしたいと思っています。

    *注文伝票(単票形式)
    画面としてはTchumonと以前に作成したテーブルTtanntou(担当者ID・担当者名)・Tkokyaku(顧客ID・顧客名・
    町名・番地・電話番号・顧客情報)を結合させて表示させています。
    画面の単票部分は伝票ID・日時・担当者ID(DropDownList)・担当者名・顧客ID(DropDownList)・顧客名・町名・番地・
    顧客情報を表示させます。記入がないものはすべてテキストボックスです。DropDownListの値を選んでもらってそれに応じた情報を表示する形になっています。例えば担当者IDの1を選択すると担当者名にサカタと表示(担当者名にそのIDの担当者名が表示される仕組みになっています。)顧客IDも同じ仕組みです。

    *注文伝票明細(帳票形式)
    帳票として注文明細画面があります。帳票の1レコードの登録・修正・削除が出来る仕組みが欲しいと思ってListViewを使うことを考えています。

    1つの画面で4つの機能を作ることを考えているので、最初の時にはListViewでは新規登録が出来る画面とレコード項目の
    表示だけをしたいと考えています。基本的に編集や削除をするときは注文伝票の伝票IDで検索してからやる場合と注文明細を打ち間違えたときに行いたいと思っています。

     [ 検索ボタン  ]  [削除ボタン ]
     
     伝票ID   [         ]  日時    [    ]
     担当者ID  [___]▼_]     担当者名 [    ]
     顧客ID   [___]▼_]     顧客名   [        ]
      町名     [            ]   番地    [        ]
      電話     [            [    顧客情報 [        ]

    +-------------------------------------------------------+
    |商品id      | 商品名  | 注文数  | 単価 | 金額   |
    ---------------------------------------------------------
    | [___]▼_] |              |             |         |            | [ 編集  ]  [削除 ]
    --------------------------------------------------------- 
    | [___]▼_] |              |             |         |            | [ 編集  ]  [削除 ]
    ---------------------------------------------------------
    | [___]▼_] |              |             |         |            | [ 編集  ]  [削除 ]
    +-------------------------------------------------------+
    | [___]▼_] |              |             |         |            | [ 編集  ]  [削除 ]
    ---------------------------------------------------------

    ---------------------------------------------------------
    | [___]▼_] | [         ]  | [       ]  | [    ] | [       ]  |   [  挿入ボタン] [ クリアボタン ]
    +-------------------------------------------------------+

     [ 編集ボタン ] [登録ボタン ]

    という画面を表示したのです。最初の画面の時にデータは何も表示されたないけど列名だけは表示したいと思っています。
    その書き方がわからずに、他の解る部分から始めようと上記の検索ボタンをクリックした場合のコードを書きました。そして検索した結果を伝票明細に表示する方法がわからずにとまってしまいました。

    *やりたいこと(検索ボタンクリック時)
    単票部分のデータベースを検索し、そのデータを表示する

    検索ボタンクリック時
    Protected Sub D_k_dtn_Click(ByVal sender As Object, ByVal e As System.EventArgs)
       
        If (Page.IsValid = False) Then
                Exit Sub
            End If
            
        ’データベース接続
            Dim setting As System.Configuration.ConnectionStringSettings = _
                       System.Configuration.ConfigurationManager.ConnectionStrings("MyDB")
           
            Using con As New SqlConnection(setting.ConnectionString)
               
                'クエリにSQL文を入れる
                Dim query As String = _
                ("SELECT Tchumon.伝票ID,Tchumon.日時,Tchumon.担当者id,Ttantou.担当者名," _
                & "Tchumon.お客様id,Tkokyaku.顧客名,Tkokyaku.町名,Tkokyaku.番地," _
                & "Tkokyaku.電話番号,Tkokyaku.顧客情報" _
                & " FROM ((Tchumon INNER JOIN Tkokyaku ON Tchumon.お客様id=Tkokyaku.顧客ID)" _
                & " INNER JOIN Ttantou ON Tchumon.担当者id=Ttantou.担当者ID)" _
                & " WHERE 伝票ID=@伝票ID")
                
                Dim da As New SqlDataAdapter(query, con)
                da.SelectCommand.Parameters.AddWithValue("@伝票ID", Convert.ToInt32(d_id.Text))
                   
                Dim dt As New DataTable()
                If (da.Fill(dt) = 0) Then
                    Label1.Text = "この伝票IDは検索出来ません。伝票IDを入力しなおしてください"
                    d_id.Text = ""
                Else
                    '親の伝票画面表示
                    D_time.Text = dt.Rows(0)("日時").ToString()
                    t_id.SelectedValue = CType(dt.Rows(0)("担当者id"), String)
                    D_t_mei.Text = dt.Rows(0)("担当者名").ToString()
                    D_k_id.SelectedValue = CType(dt.Rows(0)("お客様id"), String)
                    D_k_mei.Text = dt.Rows(0)("顧客名").ToString()
                    D_chomei.Text = dt.Rows(0)("町名").ToString()
                    D_banchi.Text = dt.Rows(0)("番地").ToString()
                    D_tel.Text = dt.Rows(0)("電話番号").ToString()
                    D_jyohou.Text = dt.Rows(0)("顧客情報").ToString()
       
       ここまでが、注文伝票の表示です。
       以下が注文伝票明細の部分です。注文明細でも同じ用にデータベースの伝票IDを元に検索した画面に表示したかったのですが、検索してDataTableにデータを取得した後どのようにListViewにデータを表示させれたらいいのかが解りませんでした。

        ’データベースからデータを取得 
        da.SelectCommand.CommandText = _
           "SELECT Tchumon_meisai.商品id," _
            & "Tsyohin.商品名, Tchumon_meisai.注文数, Tsyohin.単価, (Tchumon_meisai.注文数 * Tsyohin.単価)" _
            & "As 金額 FROM Tsyohin INNER JOIN Tchumon_meisai ON Tsyohin.商品ID = Tchumon_meisai.商品id " _
            & " WHERE 伝票id = @伝票ID"
                    
            Dim di As New DataTable()
                   
            '明細があるかどうかの確認
                    If (da.Fill(di) = 0) Then
                        Label1.Text = "明細がありません。"
                       
                    Else
                     取得したデータをListViewにて画面に表示させたい。その方法が知りたいです。             
                      
    End If
                End If
                   
            End Using
            End Sub
                            
          という流れにはなっているのですが、お分かりいただけたでしょうか?
       説明が下手でわかりにくくてすみません。             
                   
                         

    2010年4月16日 1:27

  • ちいさんに返信

    > 取得したデータをListViewにて画面に表示させたい。その方法が知りたいです。      

    ListView.DataSource に取得した DataTable をセットして DataBind したり

    ListView1.DataSourceID = Nothing
    ListView1.DataSource = di
    ListView1.DataBind()

    SqlDataSource.SelectCommand を書き換えて DataBind したりしてはいかがでし
    ょうか。

    SqlDataSource11.SelectCommand = da.SelectCommand.CommandText
    SqlDataSource11.SelectParameters.Clear()
    SqlDataSource11.SelectParameters.Add("伝票ID", DbType.Int32, d_id.Text)
    SqlDataSource11.DataBind()
    • 回答としてマーク ちい 2010年4月22日 7:23
    2010年4月16日 7:00
  • 詳しく書いていただき、有難うございました。ほぼ内容はわかりまし
    た。

    まず、全体的なシナリオを考えて、適切なコントロールを選ぶ必要が
    あると思います。このまま進めていくと、どこかで大幅な変更をせざ
    るを得なくなりそうな感じがします。

    たとえば「注文伝票(単票形式)」ですが、検索結果の表示だけでは
    なく、新規登録、修正、削除などの操作が必要ですよね? 今は検索
    結果の表示だけしか実装できてないようですが、新規登録、修正、削
    除はどうするのでしょう?

    FromView, SqlDataSource などの ASP.NET コントロールの持つ機能
    をフルに活用すれば、もっと簡単にできそうです。

    すみませんが、今日は時間がないので、明日案を考えて提案させてい
    ただきます。

    2010年4月16日 12:42
  • 案を考えてみました。

    先にレスしましたように、「注文伝票」は FormView + SqlDataSource で作
    るのがよさそうです。「注文伝票明細」は、ちいさんの案どおり ListView +
    SqlDataSource でよさそうです。

    DropDownList をページの一番上に追加して [注文ID] の一覧を表示し、ユー
    ザーがそれを選ぶと、「注文伝票」と「注文伝票明細」の両方に選択した
     [注文ID] のデータを表示するという案です。

    詳細を文章で説明するのは大変なので、骨格をコードにして、それをアップ
    します。

    DB のテーブルを作るのは大変なので、Ttantou, Tkokyaku, Tshohin は
    Microsoft が無償で提供しているサンプル DB の Northwind.mdf の中の
    Employees, Customers, Products を流用しました。

    Tchumon と Tchumon_meisai は、いただいた情報をもとに作りました(フィー
    ルド名は Northwind にあわせて英文です)。

    Northwinf.mdf を入手して、以下のスキーマの Tchumon, Tchumon_meisai テー
    ブルを追加すれば、サンプルは動くはずです。

    なお、入力の検証やエラー処理はしてませんので、それはご自分で検討してくだ
    さい。また、「注文伝票」のレコードを削除しても、それに相当する「注文伝票
    明細」のほうのレコードは削除されないなどの問題(ほかにもあるかも)も処置
    してませんので注意してください。

    /****** Object:  Table [dbo].[Tchumon_meisai]  ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Tchumon_meisai]') AND type in (N'U'))
    BEGIN
    CREATE TABLE [dbo].[Tchumon_meisai](
     [OrderID] [int] NOT NULL,
     [ItemNumber] [int] IDENTITY(1,1) NOT NULL,
     [ProductID] [int] NOT NULL,
     [Quantity] [int] NOT NULL,
     CONSTRAINT [PK_Tchumon_meisai] PRIMARY KEY CLUSTERED
    (
     [OrderID] ASC,
     [ItemNumber] ASC
    )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON)
    )
    END
    GO
    /****** Object:  Table [dbo].[Tchumon]  14:56:23 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Tchumon]') AND type in (N'U'))
    BEGIN
    CREATE TABLE [dbo].[Tchumon](
     [OrderID] [int] IDENTITY(1,1) NOT NULL,
     [OrderDate] [datetime] NOT NULL,
     [EmployeeID] [int] NOT NULL,
     [CustomerID] [nchar](5) COLLATE Japanese_CI_AS NOT NULL,
     CONSTRAINT [PK_Tchumon] PRIMARY KEY CLUSTERED
    (
     [OrderID] ASC
    )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON)
    )
    END

    aspx のコードは別掲します。

    2010年4月17日 6:32
  • <%@ Page Language="C#" %>

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

    <script runat="server">

        // 2010/4/17 MSDN フォーラム
        // http://social.msdn.microsoft.com/Forums/ja-JP/aspnetja/thread/d3711daa-453e-4da2-a73d-df5dc6abaf81
       
        protected void SqlDataSource2_Inserted(object sender, SqlDataSourceStatusEventArgs e)
        {
            int number = (int)e.Command.Parameters["@Scope_Ientity"].Value;
            DropDownList1.Items.Clear();
            DropDownList1.DataBind();
            DropDownList1.SelectedValue = number.ToString();
        }

        protected void SqlDataSource2_Deleted(object sender, SqlDataSourceStatusEventArgs e)
        {
            DropDownList1.Items.Clear();
            DropDownList1.DataBind();
        }

        protected void FormView1_DataBound(object sender, EventArgs e)
        {
            if (FormView1.CurrentMode == FormViewMode.Insert)
            {
                TextBox tb = (TextBox)FormView1.FindControl("OrderDateTextBox");
                tb.Text = DateTime.Now.ToString();
            }
        }

        protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e)
        {
            FormView1.ChangeMode(FormViewMode.ReadOnly);
        }

        protected void SqlDataSource5_Inserting(object sender, SqlDataSourceCommandEventArgs e)
        {
            // Insert の方は DropDownList に SelectedValue='<%# Bind("ProductID") %>' ではエラーになる。
            string productId = ((DropDownList)ListView1.InsertItem.FindControl("DropDownList6")).SelectedValue;
            e.Command.Parameters["@ProductID"].Value = productId;
        }
    </script>

    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <title></title>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
            <asp:SqlDataSource ID="SqlDataSource1" runat="server"
                ConnectionString="<%$ ConnectionStrings:Northwind %>"
                SelectCommand="SELECT [OrderID] FROM [Tchumon]">
            </asp:SqlDataSource>
            <asp:DropDownList ID="DropDownList1" runat="server"
                AutoPostBack="True"
                DataSourceID="SqlDataSource1"
                DataTextField="OrderID"
                DataValueField="OrderID"
                OnSelectedIndexChanged="DropDownList1_SelectedIndexChanged">
            </asp:DropDownList>
           
            <asp:SqlDataSource ID="SqlDataSource2" runat="server"
                ConnectionString="<%$ ConnectionStrings:Northwind %>"
                DeleteCommand="DELETE FROM Tchumon WHERE (OrderID = @OrderID)"
                InsertCommand="INSERT INTO Tchumon(OrderDate, EmployeeID, CustomerID)
                            VALUES (@OrderDate, @EmployeeID, @CustomerID);
                            SELECT @Scope_Ientity = SCOPE_IDENTITY()"
                SelectCommand="SELECT Tchumon.OrderID, Tchumon.OrderDate, Tchumon.EmployeeID,
                            Employees.FirstName, Tchumon.CustomerID, Customers.ContactName, Customers.Address,
                            Customers.City, Customers.Phone, Customers.PostalCode
                            FROM Tchumon
                            INNER JOIN Employees
                            ON Tchumon.EmployeeID = Employees.EmployeeID
                            INNER JOIN Customers
                            ON Tchumon.CustomerID = Customers.CustomerID
                            WHERE (Tchumon.OrderID = @OrderID)"
                UpdateCommand="UPDATE Tchumon
                            SET OrderDate = @OrderDate, EmployeeID = @EmployeeID, CustomerID = @CustomerID
                            WHERE (OrderID = @OrderID)"
                OnInserted="SqlDataSource2_Inserted"
                OnDeleted="SqlDataSource2_Deleted">
                <SelectParameters>
                    <asp:ControlParameter ControlID="DropDownList1" Name="OrderID"
                        PropertyName="SelectedValue" />
                </SelectParameters>
                <DeleteParameters>
                    <asp:Parameter Name="OrderID" />
                </DeleteParameters>
                <UpdateParameters>
                    <asp:Parameter Name="OrderDate" />
                    <asp:Parameter Name="EmployeeID" />
                    <asp:Parameter Name="CustomerID" />
                    <asp:Parameter Name="OrderID" />
                </UpdateParameters>
                <InsertParameters>
                    <asp:Parameter Name="OrderDate" />
                    <asp:Parameter Name="EmployeeID" />
                    <asp:Parameter Name="CustomerID" />
                    <asp:Parameter Name="Scope_Ientity" Type="Int32" Direction="Output" />
                </InsertParameters>
            </asp:SqlDataSource>
           
            <asp:SqlDataSource ID="SqlDataSource3" runat="server"
                ConnectionString="<%$ ConnectionStrings:Northwind %>"
                SelectCommand="SELECT [EmployeeID], [FirstName] FROM [Employees]">
            </asp:SqlDataSource>
           
            <asp:SqlDataSource ID="SqlDataSource4" runat="server"
                ConnectionString="<%$ ConnectionStrings:Northwind %>"
                SelectCommand="SELECT [CustomerID], [ContactName] FROM [Customers]">
            </asp:SqlDataSource>
           
            <asp:FormView ID="FormView1" runat="server"
                DataKeyNames="OrderID"
                DataSourceID="SqlDataSource2" OnDataBound="FormView1_DataBound">
                <EditItemTemplate>
                    伝票ID:
                    <asp:Label ID="OrderIDLabel1" runat="server" Text='<%# Eval("OrderID") %>' />
                    <br />
                    日時:
                    <asp:TextBox ID="OrderDateTextBox" runat="server"
                        Text='<%# Bind("OrderDate") %>' />
                    <br />
                    担当者名:
                    <asp:DropDownList ID="DropDownList2" runat="server"
                        DataSourceID="SqlDataSource3" DataTextField="FirstName"
                        DataValueField="EmployeeID" SelectedValue='<%# Bind("EmployeeID") %>'>
                    </asp:DropDownList>
                    <br />
                    顧客名:
                    <asp:DropDownList ID="DropDownList3" runat="server"
                        DataSourceID="SqlDataSource4" DataTextField="ContactName"
                        DataValueField="CustomerID" SelectedValue='<%# Bind("CustomerID") %>'>
                    </asp:DropDownList>
                    <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>
                <InsertItemTemplate>
                    日時:
                    <asp:TextBox ID="OrderDateTextBox" runat="server"
                        Text='<%# Bind("OrderDate") %>' />
                    <br />
                    担当者名:
                    <asp:DropDownList ID="DropDownList4" runat="server" AppendDataBoundItems="True"
                        DataSourceID="SqlDataSource3" DataTextField="FirstName"
                        DataValueField="EmployeeID" SelectedValue='<%# Bind("EmployeeID") %>'>
                        <asp:ListItem>選択してください</asp:ListItem>
                    </asp:DropDownList>
                    <br />
                    顧客名:
                    <asp:DropDownList ID="DropDownList5" runat="server" AppendDataBoundItems="True"
                        DataSourceID="SqlDataSource4" DataTextField="ContactName"
                        DataValueField="CustomerID" SelectedValue='<%# Bind("CustomerID") %>'>
                        <asp:ListItem>選択してください</asp:ListItem>
                    </asp:DropDownList>
                    <br />
                    <asp:LinkButton ID="InsertButton" runat="server" CausesValidation="True"
                        CommandName="Insert" Text="挿入" />
                    &nbsp;<asp:LinkButton ID="InsertCancelButton" runat="server"
                        CausesValidation="False" CommandName="Cancel" Text="キャンセル" />
                </InsertItemTemplate>
                <ItemTemplate>
                    伝票ID:
                    <asp:Label ID="OrderIDLabel" runat="server" Text='<%# Eval("OrderID") %>' />
                    <br />
                    日時:
                    <asp:Label ID="OrderDateLabel" runat="server" Text='<%# Bind("OrderDate") %>' />
                    <br />
                    担当者ID:
                    <asp:Label ID="EmployeeIDLabel" runat="server"
                        Text='<%# Bind("EmployeeID") %>' />
                    <br />
                    担当者名:
                    <asp:Label ID="FirstNameLabel" runat="server" Text='<%# Bind("FirstName") %>' />
                    <br />
                    顧客ID:
                    <asp:Label ID="CustomerIDLabel" runat="server"
                        Text='<%# Bind("CustomerID") %>' />
                    <br />
                    顧客名:
                    <asp:Label ID="ContactNameLabel" runat="server"
                        Text='<%# Bind("ContactName") %>' />
                    <br />
                    番地:
                    <asp:Label ID="AddressLabel" runat="server" Text='<%# Bind("Address") %>' />
                    <br />
                    町名:
                    <asp:Label ID="CityLabel" runat="server" Text='<%# Bind("City") %>' />
                    <br />
                    電話:
                    <asp:Label ID="PhoneLabel" runat="server" Text='<%# Bind("Phone") %>' />
                    <br />
                    顧客情報:
                    <asp:Label ID="PostalCodeLabel" runat="server"
                        Text='<%# Bind("PostalCode") %>' />
                    <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>
            </asp:FormView>
        </div>
       
        <div>
            <asp:SqlDataSource ID="SqlDataSource5" runat="server"
                ConnectionString="<%$ ConnectionStrings:Northwind %>"
                DeleteCommand="DELETE FROM Tchumon_meisai WHERE (OrderID = @OrderID) AND (ItemNumber = @ItemNumber)"
                InsertCommand="INSERT INTO Tchumon_meisai (OrderID, ProductID, Quantity) VALUES (@OrderID,@ProductID,@Quantity)"
                SelectCommand="SELECT Tchumon_meisai.OrderID, Tchumon_meisai.ItemNumber, Tchumon_meisai.ProductID,
                            Products.ProductName, Tchumon_meisai.Quantity, Products.UnitPrice,
                            Tchumon_meisai.Quantity * Products.UnitPrice AS Amount
                            FROM Tchumon_meisai
                            INNER JOIN Products
                            ON Tchumon_meisai.ProductID = Products.ProductID
                            WHERE (Tchumon_meisai.OrderID = @OrderID)"
                UpdateCommand="UPDATE Tchumon_meisai SET ProductID = @ProductID, Quantity = @Quantity
                            WHERE (OrderID = @OrderID) AND (ItemNumber = @ItemNumber)"
                OnInserting="SqlDataSource5_Inserting">
                <SelectParameters>
                    <asp:ControlParameter ControlID="DropDownList1" Name="OrderID"
                        PropertyName="SelectedValue" />
                </SelectParameters>
                <DeleteParameters>
                    <asp:Parameter Name="OrderID" />
                    <asp:Parameter Name="ItemNumber" />
                </DeleteParameters>
                <UpdateParameters>
                    <asp:Parameter Name="ProductID" />
                    <asp:Parameter Name="Quantity" />
                    <asp:Parameter Name="OrderID" />
                    <asp:Parameter Name="ItemNumber" />
                </UpdateParameters>
                <InsertParameters>
                    <asp:Parameter Name="ProductID" />
                    <asp:Parameter Name="Quantity" />
                    <asp:ControlParameter ControlID="DropDownList1" Name="OrderID"
                        PropertyName="SelectedValue" />
                </InsertParameters>
            </asp:SqlDataSource>
           
            <asp:SqlDataSource ID="SqlDataSource6" runat="server"
                ConnectionString="<%$ ConnectionStrings:Northwind %>"
                SelectCommand="SELECT [ProductID], [ProductName] FROM [Products]">
            </asp:SqlDataSource>
           
            <asp:ListView ID="ListView1" runat="server" DataSourceID="SqlDataSource5"
                InsertItemPosition="LastItem" DataKeyNames="OrderID,ItemNumber">
                <ItemTemplate>
                    <tr style="">
                        <td>
                            <asp:Button ID="DeleteButton" runat="server" CommandName="Delete" Text="削除" />
                            <asp:Button ID="EditButton" runat="server" CommandName="Edit" Text="編集" />
                        </td>
                        <td>
                            <asp:Label ID="ProductNameLabel" runat="server"
                                Text='<%# Eval("ProductName") %>' />
                        </td>
                        <td>
                            <asp:Label ID="QuantityLabel" runat="server" Text='<%# Eval("Quantity") %>' />
                        </td>
                        <td>
                            <asp:Label ID="UnitPriceLabel" runat="server" Text='<%# Eval("UnitPrice") %>' />
                        </td>
                        <td>
                            <asp:Label ID="AmountLabel" runat="server" Text='<%# Eval("Amount") %>' />
                        </td>
                    </tr>
                </ItemTemplate>
                <EmptyDataTemplate>
                    <table runat="server" style="">
                        <tr>
                            <td>
                                データは返されませんでした。</td>
                        </tr>
                    </table>
                </EmptyDataTemplate>
                <InsertItemTemplate>
                    <tr style="">
                        <td>
                            <asp:Button ID="InsertButton" runat="server" CommandName="Insert" Text="挿入" />
                            <asp:Button ID="CancelButton" runat="server" CommandName="Cancel" Text="クリア" />
                        </td>
                        <td>
                            <asp:DropDownList ID="DropDownList6" runat="server"
                                AppendDataBoundItems="True"
                                DataSourceID="SqlDataSource6"
                                DataTextField="ProductName"
                                DataValueField="ProductID">
                                <asp:ListItem>選択してください</asp:ListItem>
                            </asp:DropDownList>
                        </td>
                        <td>
                            <asp:TextBox ID="QuantityTextBox" runat="server"
                                Text='<%# Bind("Quantity") %>' />
                        </td>
                        <td>
                            N/A(入力不可)
                        </td>
                        <td>
                            N/A(入力不可)
                        </td>
                    </tr>
                </InsertItemTemplate>
                <LayoutTemplate>
                    <table runat="server">
                        <tr runat="server">
                            <td runat="server">
                                <table ID="itemPlaceholderContainer" runat="server" border="0" style="">
                                    <tr runat="server" style="">
                                        <th runat="server">
                                        </th>
                                        <th runat="server">
                                            商品名</th>
                                        <th runat="server">
                                            数量</th>
                                        <th runat="server">
                                            単価</th>
                                        <th runat="server">
                                            金額</th>
                                    </tr>
                                    <tr ID="itemPlaceholder" runat="server">
                                    </tr>
                                </table>
                            </td>
                        </tr>
                        <tr runat="server">
                            <td runat="server" style="">
                            </td>
                        </tr>
                    </table>
                </LayoutTemplate>
                <EditItemTemplate>
                    <tr style="">
                        <td>
                            <asp:Button ID="UpdateButton" runat="server" CommandName="Update" Text="更新" />
                            <asp:Button ID="CancelButton" runat="server" CommandName="Cancel"
                                Text="キャンセル" />
                        </td>
                        <td>
                            <asp:DropDownList ID="DropDownList7" runat="server"
                                DataSourceID="SqlDataSource6"
                                DataTextField="ProductName"
                                DataValueField="ProductID"
                                SelectedValue='<%# Bind("ProductID") %>'>
                            </asp:DropDownList>
                        </td>
                        <td>
                            <asp:TextBox ID="QuantityTextBox" runat="server"
                                Text='<%# Bind("Quantity") %>' />
                        </td>
                        <td>
                            N/A(入力不可)
                        </td>
                        <td>
                            N/A(入力不可)
                        </td>
                    </tr>
                </EditItemTemplate>
            </asp:ListView>
        </div>
        </form>
    </body>
    </html>

     

    2010年4月17日 6:35
  • もりおさんへ

    返信ありがとうございました。
    また、返信が大変遅くなってしまい申し訳ございません。

    >SqlDataSource11.SelectCommand = da.SelectCommand.CommandText
    >SqlDataSource11.SelectParameters.Clear()
    >SqlDataSource11.SelectParameters.Add("伝票ID", DbType.Int32, d_id.Text)
    >SqlDataSource11.DataBind()

    上記の方法はわたしも考えてはいたのですが、パラメーターをクリアしていなかったため、エラーに
    なってしまっていました。
    大変参考になることを教えていただきありがとうございました。
    2010年4月19日 0:27
  • SurferOnWwwさんへ

    返信ありがとうございます。
    また、返信が大変遅くなってしまい申し訳ありません。

    長文を読み、コードまで書いていただいてありがとうございました。
    FormView + SqlDataSource で書くのがいいとのアドバイスですが、
    今回の課題としてなるべくフォームなどを使わないでやるという前提があります。
    ListViewを使ってしまったので、なるべくFormViewは使わないでやりたいという希望があります。

    >たとえば「注文伝票(単票形式)」ですが、検索結果の表示だけでは
    >なく、新規登録、修正、削除などの操作が必要ですよね? 今は検索
    >結果の表示だけしか実装できてないようですが、新規登録、修正、削除はどうするのでしょう?

    ということに対してですが、伝票IDというテキストボックスに値を入れて新規登録してもらう。修正や削除は一度検索をしてからしてもらうという面倒な方法になってしまいます。
    FormView+ListViewの形で提示してもらったコードで一度作成してDatasourceなどの使い方を理解してから使わないでやる方法を考えるということだとかなりの時間が掛かってしまいますよね?

    まだコードをしっかりと理解してないのですが、コードを書いてみて解らない点があったらまた質問させていただきたいと思っています。

    いつもお手数をおかけして申し訳ありません。
    本当にありがとうございました。





    2010年4月19日 2:03
  • > 今回の課題としてなるべくフォームなどを使わないでやると
    > いう前提があります。

    解決策の提案どころか、余計なお世話だったようですね。

    課題だそうですが、学校か何かで、自力でコードを書いて FromView
    + SqlDataSource のような機能を実装する勉強をしているのでしょう
    か?

    そうであれば、掲示板で質問するより、課題を出した先生(?)に聞
    いた方がより早く的確な答えが得られると思うのですが・・・

    何にせよ、勉強のためということなら、自力で実装もありだと思いま
    すので、自助努力で頑張ってください。

    2010年4月19日 12:22
  • SurferOnWwwさんへ

    返信ありがとうございます。

    課題という書き方には少し誤りがありまして、次にVB.NETを使っての開発があるから勉強しておいて
    と言われてしまい、勉強しているところです。
    周りにASP.NETについてわかる人がいない状態です。

    以前にACSESSでVBを使って同じシステムを作成したので、今度はASP.NETでやってみてといわれテキストを読みながら進めていますが、中々進まず質問させていただいています。

    余計なお世話だなんてとんでもないです。
    自力で実装できた後にFormViewを使っても作成してみたいと思います。

    注文伝票を作成できれば一応は完成なので頑張ります。
    ありがとうございました。
    2010年4月20日 1:17
  • 学校の勉強ではなくて、仕事なんですか?

    そうだとすると、フォーカスすべきは、ASP.NET の機能をフルに使
    って、いかに効率的に品質の高いアプリを生産するかという点にな
    るのではないでしょうか?

    学校の勉強とは違って、成果物の実用性はもちろん生産性、開発工
    数、納期、品質などが重要でしょうから。

    そういうわけで、ASP.NET に備わっている機能を自力で実装しよう
    としている理由が自分には理解できないです・・・が、まぁ、人そ
    れぞれのやり方があるということで、無理やり納得しておくことに
    します。(笑)

    でも、この先、多分、ユーザー認証や同時実行制御も実装しなけれ
    ばならないと思いますが、そこまで自力でやらない方がよいと思い
    ますよ。

    2010年4月20日 13:05
  • SurferOnWwwさんへ

    返信ありがとうございます。
    仕事なんです。といっても学習期間なのですが。

    多分上司がASP.NETのことを全く解っていないので、アクセスのようなものだと思っているのだと
    思います。

    ユーザー認証は今回使わないのですが、検証コントロールは使っています。

    私もFormView+ListViewを使うのがいいとは思っているのですが・・・まぁ上司の指示なので。。

    とにかく頑張ります。
    色々ありがとうございました。

    2010年4月21日 9:24