none
ListViewのDeleteCommandのパラメータの値の参照の方法について。 RRS feed

  • 質問

  • いつもお世話になっております。ちいと申します。
    すみませんが、ListViewの削除ボタンを押すとDeletecommandのパラメーターを追加してSqlDataSourceにDataBindさせたいと思っております。そこで削除ボタンが押された列の行番号が知りたいのですが、その方法がわからず質問させていただきました。わかる方はご教授お願いいたします。ちなみに検索したものを削除しています。検索のコードも乗せておきます。

    *テーブル
    Tchumon_meisai
    伝票id・行番号・商品id・注文数
    Tshohin
    商品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 Tchumon.伝票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のDataSourceのSelectCommandを変更する
                        SqlDataSource11.SelectCommand = da.SelectCommand.CommandText
                        'SelectParametersをクリアする
                        SqlDataSource11.SelectParameters.Clear()
                        SqlDataSource11.SelectParameters.Add("伝票id", DbType.Int32, d_id.Text)
                        SqlDataSource11.DataBind()
                    End If
                End If
            End Using
            End Sub 

    '削除ボタン(クリック時)
      Protected Sub SqlDataSource11_Deleting(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.SqlDataSourceCommandEventArgs)   

    SqlDataSource11.DeleteCommand = "DELETE FROM Tchumon_meisai WHERE (Tchumon_meisai.伝票id = @伝票id) AND (行番号 = @行番号)"
        SqlDataSource11.DeleteParameters.Clear()
        SqlDataSource11.DeleteParameters.Add("伝票id", DbType.Int32, d_id.Text)


         SqlDataSource11.DeleteParameters.Add("行番号", ("1"))

          SqlDataSource11.DataBind()

        End Sub

     

       
            <asp:ListView ID="ListView1" runat="server" DataSourceID="SqlDataSource11"
             InsertItemPosition="LastItem" DataKeyName="伝票id","行番号"
                onselectedindexchanged="ListView1_SelectedIndexChanged"  >
             
          
        
          
             
             
                <ItemTemplate>
                    <tr style="background-color: #FFFBD6;color: #333333;">
                        <td>
                            <asp:Label ID="商品コードLabel" runat="server" Text='<%# Eval("商品id") %>' />
                        </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>
                        <td>
                            <asp:Button ID="EditButton" runat="server" CommandName="Edit" Text="編集" />
                            <asp:Button ID="DeleteButton" runat="server"  CommandName="Delete"  Text="削除"  OnClick="DeleteButton_Click" />
                        </td>
                   </tr>
                </ItemTemplate>
               
               
                <AlternatingItemTemplate>
                    <tr style="background-color: #FAFAD2;color: #284775;">
                        <td>
                            <asp:Label ID="商品コードLabel" runat="server" Text='<%# Eval("商品id") %>' />
                        </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>
                         <td>
                             <asp:Button ID="EditButton" runat="server" CommandName="Edit" Text="編集" />
                             <asp:Button ID="DeleteButton" runat="server"  CommandName="Delete"  Text="削除" />
                        </td>
                    </tr>
                </AlternatingItemTemplate>
               
               
                <EmptyDataTemplate>
                    <table runat="server" style="">
                        <tr>
                            <td>
                                データは返されませんでした。</td>
                        </tr>
                    </table>
                </EmptyDataTemplate>
              
               
                <InsertItemTemplate>
                    <tr style="">
                       <td>
                            <asp:DropDownList ID="商品コードDr" runat="server"
                              AppendDataBoundItems="True"    DataSourceID="SqlDataSource13" DataTextField="商品ID" DataValueField="商品ID"
                             AutoPostBack="true" OnSelectedIndexChanged="商品コードDr_SelectedIndexChenged">
                             <asp:ListItem>選択してください</asp:ListItem></asp:DropDownList>
                           
                            <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">商品id</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("商品id") %>' />
                        </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("商品id") %>' />
                        </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 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"
                   
                     DeleteCommand="DELETE FROM Tchumon_meisai WHERE (伝票id = @伝票id) AND (行番号 = @行番号)"  >
                 
               
               
               
               
               
               
               
                <DeleteParameters>
                    <asp:Parameter Name="伝票id" />
                    <asp:Parameter Name="行番号" />
                </DeleteParameters>
             
               
               <SelectParameters>
                    <asp:Parameter Name="伝票id" />
               </SelectParameters>
               
              
              
              
               </asp:SqlDataSource>
              

    2010年4月22日 10:49

回答

  • > こちらはまだ出来ておりませんので、出来次第報告させていただきます。

    とのことですが、もし、

    > 本当に私がやりたかったことは削除ボタンが押されたときにデータを
    > DataTableにとっておき、画面上では削除されているが、
    > データベースでは削除されていないということがしたいのです。

    が必須だとすれば、今の延長線上で進めても実現できないので、私のレス
    の内容を試しても時間の無駄です。

    Windows アプリと Web アプリの仕組みの違いを認識されているでしょう
    か? ステートレスな Web アプリではそのようなことを実現するのは、
    不可能とは言わないまでも、難しいです。

    自分が知る限りですが、標準のデーターソースコントロール(SqlDataSource
    など)とデータバインドコントロール(ListView など)にはそのような
    機能はありません。

    というわけで、上記のことが必須なら根本的に考え直す必要があると思
    います。

    • 回答の候補に設定 山本春海 2010年4月30日 9:19
    • 回答としてマーク 山本春海 2010年4月30日 9:28
    2010年4月27日 13:30
  • そのやり方で、うまく DELETE できるのか疑問ですが・・・

    また、[行番号] と ListView の「列の行番号」が同じかどうかも疑問ですが・・・

    > そこで削除ボタンが押された列の行番号が知りたいのですが、

    以下のようにして可能です。

    (1) ListView.ItemDataBound イベントで各「削除ボタン」の CommandArgument に
      あらかじめ「列の行番号」を設定しておく。

        「列の行番号」は ListViewDataItem.DisplayIndex で取得できます。具体的な
        方法は、以下のページが参考になると思います。

        RowIndex inside ListView_ItemDataBound event
        http://bhaidar.net/cs/archive/2008/03/27/rowindex-inside-listview-itemdatabound-event.aspx

    (2) ListView.ItemCommand イベントで、ListViewCommandEventArgs.CommandArgument
        プロパティから、上記 (1) で設定した「列の行番号」を取得。

    • 回答の候補に設定 山本春海 2010年4月30日 7:52
    • 回答としてマーク 山本春海 2010年4月30日 9:28
    2010年4月22日 15:21
  • ちいさんに返信

    ListView1 の DataKeyName に行番号をセットされているようですが

    <asp:ListView
      ID="ListView1"
      ...
      DataKeyName="伝票id","行番号"
      ...>

    SelectCommand に動的にセットする SQL では行番号が取得されていません。

    SELECT
      Tchumonmeisai.商品id,
      Tsyohin.商品名,
      Tchumonmeisai.注文数,
      Tsyohin.単価,
      Tchumonmeisai.注文数 * Tsyohin.単価 As 金額
    FROM
      Tsyohin
      INNER JOIN Tchumonmeisai
        ON Tsyohin.商品ID = Tchumonmeisai.商品id 
    WHERE
      伝票id = @伝票id

    なので、行番号を取得するよう SQL を書き換えると善いかと思います。
    DataKeyName に伝票idもセットされているようなので伝票idも取得した方が善いです。


    そして、このコードは変です。

    Protected Sub SqlDataSource11_Deleting(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.SqlDataSourceCommandEventArgs)
      SqlDataSource11.DeleteCommand = "DELETE FROM Tchumon_meisai WHERE (Tchumon_meisai.伝票id = @伝票id) AND (行番号 = @行番号)"
      SqlDataSource11.DeleteParameters.Clear()
      SqlDataSource11.DeleteParameters.Add("伝票id", DbType.Int32, d_id.Text)
      SqlDataSource11.DeleteParameters.Add("行番号", ("1"))
      SqlDataSource11.DataBind()
    End Sub

    > SqlDataSource11.DeleteCommand = "DELETE FROM Tchumon_meisai WHERE (Tchumon_meisai.伝票id = @伝票id) AND (行番号 = @行番号)"

    ご掲示いただいたソースを見る限り、このようにセットされているわけなので書き換える
    必要はありません。

    <asp:SqlDataSource
      ID="SqlDataSource11"
      ...
      DeleteCommand="DELETE FROM Tchumon_meisai WHERE (伝票id = @伝票id) AND (行番号 = @行番号)"  >

    > SqlDataSource11.DeleteParameters.Clear()
    > SqlDataSource11.DeleteParameters.Add("伝票id", DbType.Int32, d_id.Text)
    > SqlDataSource11.DeleteParameters.Add("行番号", ("1"))

    SqlDataSource11_Deleting というのは SqlDataSource.Deleting イベントのハンドラな
    のですよね。
    SqlDataSource.Deleting イベントの段階では SqlDataSource にパラメータをセットして
    も削除処理には反映されません。
    パラメータを書き換えるとするならば第2引数の SqlDataSourceCommandEventArgs に対し
    て行うと善いかと思います。
    e.Command.Parameters("@伝票id").Value = ...
    ListView1 で行を削除するだけであればパラメータを書き換える必要もないはずです。

    > SqlDataSource11.DataBind()

    DataBind というのはコントロールとデータソースを連結するものです。
    このタイミングで呼ぶ必要はありません。
    • 回答の候補に設定 山本春海 2010年4月30日 7:51
    • 回答としてマーク 山本春海 2010年4月30日 9:28
    2010年4月22日 21:57
  • > 今日は時間がなかったので、月曜日に実施した結果を報告させていただきます。

    試す前に、先のレスで「疑問」と指摘した2点をクリアにしてからにしてくださ
    いね。でないと時間の無駄に終わると思います。

    「そのやり方で、うまく DELETE できるのか」については、もりおさんのレスの
    終わりの方に書いてあるように、パラメータの書き換えの方法さえ変更すればク
    リアできるはずです。

    「[行番号] と ListView の「列の行番号」が同じかどうか」の方は当方では分か
    りませんので、自分で調べてください。INSERT したときどう設定したかですね。

    たぶん違うと思いますが、とすると少なくとも ListView とその SqlDataSource
    は根本的にコードを見直す必要があるはずです。

    書き直す場合は、この前のスレッドでアップしたサンプルコードの ListView と
    SqlDataSource の部分が参考になると思いますので、見てください。

    ListView の DataKeyNames="OrderID,ItemNumber" の部分と、SqlDataSource の 
    SelectCommand="SELECT Tchumon_meisai.OrderID, Tchumon_meisai.ItemNumber, ...
    の部分がキモです。

    • 回答の候補に設定 山本春海 2010年4月30日 7:52
    • 回答としてマーク 山本春海 2010年4月30日 9:28
    2010年4月24日 4:24

すべての返信

  • そのやり方で、うまく DELETE できるのか疑問ですが・・・

    また、[行番号] と ListView の「列の行番号」が同じかどうかも疑問ですが・・・

    > そこで削除ボタンが押された列の行番号が知りたいのですが、

    以下のようにして可能です。

    (1) ListView.ItemDataBound イベントで各「削除ボタン」の CommandArgument に
      あらかじめ「列の行番号」を設定しておく。

        「列の行番号」は ListViewDataItem.DisplayIndex で取得できます。具体的な
        方法は、以下のページが参考になると思います。

        RowIndex inside ListView_ItemDataBound event
        http://bhaidar.net/cs/archive/2008/03/27/rowindex-inside-listview-itemdatabound-event.aspx

    (2) ListView.ItemCommand イベントで、ListViewCommandEventArgs.CommandArgument
        プロパティから、上記 (1) で設定した「列の行番号」を取得。

    • 回答の候補に設定 山本春海 2010年4月30日 7:52
    • 回答としてマーク 山本春海 2010年4月30日 9:28
    2010年4月22日 15:21
  • ちいさんに返信

    ListView1 の DataKeyName に行番号をセットされているようですが

    <asp:ListView
      ID="ListView1"
      ...
      DataKeyName="伝票id","行番号"
      ...>

    SelectCommand に動的にセットする SQL では行番号が取得されていません。

    SELECT
      Tchumonmeisai.商品id,
      Tsyohin.商品名,
      Tchumonmeisai.注文数,
      Tsyohin.単価,
      Tchumonmeisai.注文数 * Tsyohin.単価 As 金額
    FROM
      Tsyohin
      INNER JOIN Tchumonmeisai
        ON Tsyohin.商品ID = Tchumonmeisai.商品id 
    WHERE
      伝票id = @伝票id

    なので、行番号を取得するよう SQL を書き換えると善いかと思います。
    DataKeyName に伝票idもセットされているようなので伝票idも取得した方が善いです。


    そして、このコードは変です。

    Protected Sub SqlDataSource11_Deleting(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.SqlDataSourceCommandEventArgs)
      SqlDataSource11.DeleteCommand = "DELETE FROM Tchumon_meisai WHERE (Tchumon_meisai.伝票id = @伝票id) AND (行番号 = @行番号)"
      SqlDataSource11.DeleteParameters.Clear()
      SqlDataSource11.DeleteParameters.Add("伝票id", DbType.Int32, d_id.Text)
      SqlDataSource11.DeleteParameters.Add("行番号", ("1"))
      SqlDataSource11.DataBind()
    End Sub

    > SqlDataSource11.DeleteCommand = "DELETE FROM Tchumon_meisai WHERE (Tchumon_meisai.伝票id = @伝票id) AND (行番号 = @行番号)"

    ご掲示いただいたソースを見る限り、このようにセットされているわけなので書き換える
    必要はありません。

    <asp:SqlDataSource
      ID="SqlDataSource11"
      ...
      DeleteCommand="DELETE FROM Tchumon_meisai WHERE (伝票id = @伝票id) AND (行番号 = @行番号)"  >

    > SqlDataSource11.DeleteParameters.Clear()
    > SqlDataSource11.DeleteParameters.Add("伝票id", DbType.Int32, d_id.Text)
    > SqlDataSource11.DeleteParameters.Add("行番号", ("1"))

    SqlDataSource11_Deleting というのは SqlDataSource.Deleting イベントのハンドラな
    のですよね。
    SqlDataSource.Deleting イベントの段階では SqlDataSource にパラメータをセットして
    も削除処理には反映されません。
    パラメータを書き換えるとするならば第2引数の SqlDataSourceCommandEventArgs に対し
    て行うと善いかと思います。
    e.Command.Parameters("@伝票id").Value = ...
    ListView1 で行を削除するだけであればパラメータを書き換える必要もないはずです。

    > SqlDataSource11.DataBind()

    DataBind というのはコントロールとデータソースを連結するものです。
    このタイミングで呼ぶ必要はありません。
    • 回答の候補に設定 山本春海 2010年4月30日 7:51
    • 回答としてマーク 山本春海 2010年4月30日 9:28
    2010年4月22日 21:57
  • もりおさんへ

    返信ありがとうございました。
    実はListViewの仕組みがよくわかっていなのですが、DeleteCommandとは画面のレコードの削除ボタンを押したときに
    SQL文を実行し削除するものなのでしょうか?
    SQL文の中のパラメータの値はどのように取得しているのでしょうか?
    今のままでは画面の削除ボタンを押しても削除されませんでした。
    画面に伝票idと行番号を表示させることなく削除したいと思っています。

    初歩的な質問で申し訳ありませんが、ライブラリーを使って調べたのですが、書いてある意味が解らなかったので質問させていただきました。

    2010年4月23日 6:38
  • SurferOnWwwさんへ

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

    今日は時間がなかったので、月曜日に実施した結果を報告させていただきます。

     

    2010年4月23日 8:49
  • > 今日は時間がなかったので、月曜日に実施した結果を報告させていただきます。

    試す前に、先のレスで「疑問」と指摘した2点をクリアにしてからにしてくださ
    いね。でないと時間の無駄に終わると思います。

    「そのやり方で、うまく DELETE できるのか」については、もりおさんのレスの
    終わりの方に書いてあるように、パラメータの書き換えの方法さえ変更すればク
    リアできるはずです。

    「[行番号] と ListView の「列の行番号」が同じかどうか」の方は当方では分か
    りませんので、自分で調べてください。INSERT したときどう設定したかですね。

    たぶん違うと思いますが、とすると少なくとも ListView とその SqlDataSource
    は根本的にコードを見直す必要があるはずです。

    書き直す場合は、この前のスレッドでアップしたサンプルコードの ListView と
    SqlDataSource の部分が参考になると思いますので、見てください。

    ListView の DataKeyNames="OrderID,ItemNumber" の部分と、SqlDataSource の 
    SelectCommand="SELECT Tchumon_meisai.OrderID, Tchumon_meisai.ItemNumber, ...
    の部分がキモです。

    • 回答の候補に設定 山本春海 2010年4月30日 7:52
    • 回答としてマーク 山本春海 2010年4月30日 9:28
    2010年4月24日 4:24

  • ちいさんに返信

    > DeleteCommand とは画面のレコードの削除ボタンを押したときに SQL 文を実行し削除
    > するものなのでしょうか?

    ちいさんの言われる DeleteCommand が何を指しているのかわかりませんが、ListView の
    削除ボタンが押された場合 ListView に SqlDataSource が関連付けられていれば自動的
    に SqlDataSource.Delete メソッドが呼ばれます。
    SqlDataSource.Delete メソッドは DeleteCommand プロパティと DeleteParameters プロ
    パティを基に DbCommand を自動的に作成して実行します。
    なので ListView の削除ボタンを押すと SQL は実行されます。

    > SQL 文の中のパラメータの値はどのように取得しているのでしょうか?

    ListView は SqlDataSource にパラメータを渡して、SqlDataSource は渡されたパラメー
    タを使用して内部で DbCommand を作成します。
    パラメータはこんな感じに渡されていきます。
    ListView => SqlDataSource => DbCommand

    SqlDataSource.Deleting イベントの段階では DbCommand に渡ってしまっているので
    SqlDataSource にパラメータをセットしても削除処理には反映されないということになり
    ます。

    ListView は Bind されている項目および DataKeyNames プロパティにセットされている
    項目をパラメータとして SqlDataSource に渡します。

    そんなこんなで、表示したくない列名を ListView.DataKeyNames プロパティにセットし
    て、SqlDataSource.SelectCommand プロパティに適切な SQL をセットすると ListView
    におけるデータ削除はコードを記述せずに実現できるはずです。

    > 今のままでは画面の削除ボタンを押しても削除されませんでした。

    <asp:ListView ID="ListView1" ... DataKeyName="伝票id","行番号" ...>
    正しくは DataKeyName ではなく DataKeyNames です。
    綴りが間違っているようなことはないでしょうか。
    値の指定は "伝票id","行番号" ではなく "伝票id,行番号" こんな感じです。
    <asp:ListView ID="ListView1" ... DataKeyNames="伝票id,行番号" ...>

    > ライブラリーを使って調べたのですが、書いてある意味が解らなかったので質問させて
    > いただきました。

    分からない文章を具体的にお教えいただけると、経験的な知識を以って読み解けるかたが
    いらっしゃるかもしれません。
    2010年4月25日 21:53
  • もりおさんへ

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

    ListViewでのパラーメータの渡し方などもわかりやすく説明して頂いてありがとうございました。

    削除の機能ですが、DataKeyNamesのところの記入が間違っていたためうまく出来なかったみたいです。
    お手数をおかけしました。詳しく説明して頂いてありがとうございました。

    削除ボタンを押すとすぐにデータベースから削除される仕組みがListViewでは出来ているのですね。

    本当に私がやりたかったことは削除ボタンが押されたときにデータをDataTableにとっておき、画面上では削除されているが、
    データベースでは削除されていないということがしたいのです。
    本当に削除されてたデータがデータベースに反映されるタイミングとしては、画面の修正ボタンが押されたときに削除するという
    ことがしたいのですが、それをするのにListViewを使うことは変でしょうか?

    例として
    ・画面
    商品id     商品名         注文数    単価    金額  
    1001   ミックスピザ      1     ¥1000    ¥1000      削除ボタン 選択ボタン
    1002   シーフードピザ    2     ¥1500    ¥3000      削除ボタン 選択ボタン

    ・データベース
    Tchumon_meisai
    伝票id(主キー)    行番号(主キー)  商品id     注文数
     1                     1                1001          1   
      1                     2                1001          2

    *商品id1001の削除ボタンをクリックする

    ・画面
    商品id     商品名         注文数    単価    金額  
    1002   シーフードピザ    2     ¥1500    ¥3000      削除ボタン 選択ボタン

    ・データベースはかわらない

    *画面から修正ボタンをクリックする
    データべース
    Tchumon_meisaiから商品id1001のデータの削除
    伝票id(主キー)    行番号(主キー)  商品id     注文数
       1                     2                1001          2

    という処理がしたいと思っています。

     

    2010年4月27日 3:00
  • SurferOnWwwさんへ

    返信ありがとうございました。
    また、返信が大変遅くなりすみませんでした。

    >そのやり方で、うまく DELETE できるのか疑問ですが・・・
    このやり方ではうまくDELETEできませんでした。
    パラメータの書き換えの方法を変更することでうまくDELETEできました。

    >また、[行番号] と ListView の「列の行番号」が同じかどうかも疑問ですが・・・
    >「[行番号] と ListView の「列の行番号」が同じかどうか」の方は当方では分か
    >りませんので、自分で調べてください。INSERT したときどう設定したかですね。

    >たぶん違うと思いますが、とすると少なくとも ListView とその SqlDataSource
    >は根本的にコードを見直す必要があるはずです。

    こちらはまだ出来ておりませんので、出来次第報告させていただきます。

    2010年4月27日 3:11
  • > こちらはまだ出来ておりませんので、出来次第報告させていただきます。

    とのことですが、もし、

    > 本当に私がやりたかったことは削除ボタンが押されたときにデータを
    > DataTableにとっておき、画面上では削除されているが、
    > データベースでは削除されていないということがしたいのです。

    が必須だとすれば、今の延長線上で進めても実現できないので、私のレス
    の内容を試しても時間の無駄です。

    Windows アプリと Web アプリの仕組みの違いを認識されているでしょう
    か? ステートレスな Web アプリではそのようなことを実現するのは、
    不可能とは言わないまでも、難しいです。

    自分が知る限りですが、標準のデーターソースコントロール(SqlDataSource
    など)とデータバインドコントロール(ListView など)にはそのような
    機能はありません。

    というわけで、上記のことが必須なら根本的に考え直す必要があると思
    います。

    • 回答の候補に設定 山本春海 2010年4月30日 9:19
    • 回答としてマーク 山本春海 2010年4月30日 9:28
    2010年4月27日 13:30
  • SurferOnWwwさんへ

    返信ありがとうございました。
    本屋などで色々調べていたため、返信が遅くなりすみませんでした。

    どうやらASP.NETで上記のようなWeb画面の例は存在しないようです。
    例として乗っていたサンプルのほとんどはショッピングサイトを作成するものがほとんどでした。
    私が作りたいのはお客様から注文された内容を蓄積するためのシステムで、
    それをWebを使ってやりたかったのですが、
    まず単票+帳票という画面がなく、ASP.NETで実現するのは難しいのかもと感じています。

    教えていただいたコードを使いListViewのデータの削除・修正は出来るようにはなったのですが、
    この画面だと単表と帳票が一緒の画面にあるだけで連動しているわけではないので、
    私のやりたいこととのズレを感じています。

    もう一度やりたいことがWebで(ASP.NET)で実現できるのか確認したいと思います。
    色々アドバイスありがとうございました。

    2010年4月30日 7:52
  • > まず単票+帳票という画面がなく、ASP.NETで実現するのは難しいのかもと
    > 感じています。

    個人的な意見を言わせていただければ、「ASP.NETで実現するのは難しい」と
    いうことはないと思います。

    ASP.NET で用意されているサーバーコンロトールと Visual Studio のデザイン画面
    やウィザードをフルに利用すれば、かなりのことは容易にできるはずです。それを超
    えることは、知識がないと難しいということだと思います。

    「単票+帳票という画面」は、単独のコントロールとしては確かに ASP.NET にはあり
    ませんが、先に提案しましたように FormView と ListView および SqlDataSource
    を組み合わせることによって、容易に実現できます。

    それを FormView を用いないで、スクラッチでコードを書こうとするから難しいの
    でしょう。

    さらに、Windows アプリのように、一旦 DataTable を更新して、更新が終了して
    からまとめて DB に更新内容を書き戻すようなことは、ASP.NET に限らず、Web ア
    プリ全般にとって難しいことです。

    それでも、ViewState や Session などステートを維持する機能が ASP.NET には用
    意されているので、それを利用すればそれほど難しいことではありません。

    > 教えていただいたコードを使いListViewのデータの削除・修正は出来るよ
    > うにはなったのですが、この画面だと単表と帳票が一緒の画面にあるだけで連動し
    > ているわけではないので、私のやりたいこととのズレを感じています。

    連動させることは可能だと思いますが、具体的にどこが連動していないのですか?
    もうちょっと勉強して知識を得れば、ズレは知識でなくせると思いますので、頑張
    ってください。

    分からなかったら、また聞いてください。

    • 編集済み SurferOnWww 2010年4月30日 10:52 誤記訂正
    2010年4月30日 10:50
  • SurferOnWwwさんへ

    返信ありがとうございます。
    返信していただけるとは思わず長い間返信できなくてすみませんでした。

    これからFormViewを使いコードを変更し、ListViewをGridViewに変更したいと思います。
    GridViewに変更する理由としてはヘッダーに総額を追加したいからです。
    ListViewでも可能なのであれば変更する理由はないのですが、どの本を見ても総額を表示するときに
    GridViewを使う例が多く載っていたので、変更の必要があるかと思いました。

    もう一度頂いたコードを参考に作成したいと思います。

    一度は出来なくてあきらめかけましたが、SurferOnWwwさんの励ましと協力のおかげでもう一度頑張ろうと思えました。
    ありがとうございました。

    変更したものが出来上がりしだい載せたいと思います。

    また、解らないてんなどまた質問するかと思いますが、よろしくお願いいたします。

    2010年5月6日 5:30
  • > GridViewに変更する理由としてはヘッダーに総額を追加したいからです。

    ListView でも合計の表示はできますよ。せっかく ListView でここまで作ったので
    すから、そのまま進めてはいかがですか?

    2010年5月6日 14:12
  •  SurferOnWwwさんへ

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

    >ListView でも合計の表示はできますよ。せっかく ListView でここまで作ったので
    >すから、そのまま進めてはいかがですか?

    ListViewでも合計の表示が出来るのですね。
    質問の内容が変わってきてしまいますので、新しいスレッドで質問させていただきたいと思います。

    2010年5月7日 5:54