トップ回答者
ListViewのDeleteCommandのパラメータの値の参照の方法について。

質問
-
いつもお世話になっております。ちいと申します。
すみませんが、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>
回答
-
> こちらはまだ出来ておりませんので、出来次第報告させていただきます。
とのことですが、もし、
> 本当に私がやりたかったことは削除ボタンが押されたときにデータを
> DataTableにとっておき、画面上では削除されているが、
> データベースでは削除されていないということがしたいのです。が必須だとすれば、今の延長線上で進めても実現できないので、私のレス
の内容を試しても時間の無駄です。Windows アプリと Web アプリの仕組みの違いを認識されているでしょう
か? ステートレスな Web アプリではそのようなことを実現するのは、
不可能とは言わないまでも、難しいです。自分が知る限りですが、標準のデーターソースコントロール(SqlDataSource
など)とデータバインドコントロール(ListView など)にはそのような
機能はありません。というわけで、上記のことが必須なら根本的に考え直す必要があると思
います。 -
そのやり方で、うまく 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) で設定した「列の行番号」を取得。 -
ちいさんに返信
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 というのはコントロールとデータソースを連結するものです。
このタイミングで呼ぶ必要はありません。 -
> 今日は時間がなかったので、月曜日に実施した結果を報告させていただきます。
試す前に、先のレスで「疑問」と指摘した2点をクリアにしてからにしてくださ
いね。でないと時間の無駄に終わると思います。「そのやり方で、うまく DELETE できるのか」については、もりおさんのレスの
終わりの方に書いてあるように、パラメータの書き換えの方法さえ変更すればク
リアできるはずです。「[行番号] と ListView の「列の行番号」が同じかどうか」の方は当方では分か
りませんので、自分で調べてください。INSERT したときどう設定したかですね。たぶん違うと思いますが、とすると少なくとも ListView とその SqlDataSource
は根本的にコードを見直す必要があるはずです。書き直す場合は、この前のスレッドでアップしたサンプルコードの ListView と
SqlDataSource の部分が参考になると思いますので、見てください。ListView の DataKeyNames="OrderID,ItemNumber" の部分と、SqlDataSource の
SelectCommand="SELECT Tchumon_meisai.OrderID, Tchumon_meisai.ItemNumber, ...
の部分がキモです。
すべての返信
-
そのやり方で、うまく 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) で設定した「列の行番号」を取得。 -
ちいさんに返信
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 というのはコントロールとデータソースを連結するものです。
このタイミングで呼ぶ必要はありません。 -
-
> 今日は時間がなかったので、月曜日に実施した結果を報告させていただきます。
試す前に、先のレスで「疑問」と指摘した2点をクリアにしてからにしてくださ
いね。でないと時間の無駄に終わると思います。「そのやり方で、うまく DELETE できるのか」については、もりおさんのレスの
終わりの方に書いてあるように、パラメータの書き換えの方法さえ変更すればク
リアできるはずです。「[行番号] と ListView の「列の行番号」が同じかどうか」の方は当方では分か
りませんので、自分で調べてください。INSERT したときどう設定したかですね。たぶん違うと思いますが、とすると少なくとも ListView とその SqlDataSource
は根本的にコードを見直す必要があるはずです。書き直す場合は、この前のスレッドでアップしたサンプルコードの ListView と
SqlDataSource の部分が参考になると思いますので、見てください。ListView の DataKeyNames="OrderID,ItemNumber" の部分と、SqlDataSource の
SelectCommand="SELECT Tchumon_meisai.OrderID, Tchumon_meisai.ItemNumber, ...
の部分がキモです。 -
ちいさんに返信
> 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,行番号" ...>
> ライブラリーを使って調べたのですが、書いてある意味が解らなかったので質問させて
> いただきました。
分からない文章を具体的にお教えいただけると、経験的な知識を以って読み解けるかたが
いらっしゃるかもしれません。 -
もりおさんへ
返信ありごとうございました。
また、返信が大変遅くなってしまい申し訳ありませんでした。
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
という処理がしたいと思っています。 -
SurferOnWwwさんへ
返信ありがとうございました。
また、返信が大変遅くなりすみませんでした。>そのやり方で、うまく DELETE できるのか疑問ですが・・・
このやり方ではうまくDELETEできませんでした。
パラメータの書き換えの方法を変更することでうまくDELETEできました。
>また、[行番号] と ListView の「列の行番号」が同じかどうかも疑問ですが・・・
>「[行番号] と ListView の「列の行番号」が同じかどうか」の方は当方では分か
>りませんので、自分で調べてください。INSERT したときどう設定したかですね。>たぶん違うと思いますが、とすると少なくとも ListView とその SqlDataSource
>は根本的にコードを見直す必要があるはずです。こちらはまだ出来ておりませんので、出来次第報告させていただきます。
-
> こちらはまだ出来ておりませんので、出来次第報告させていただきます。
とのことですが、もし、
> 本当に私がやりたかったことは削除ボタンが押されたときにデータを
> DataTableにとっておき、画面上では削除されているが、
> データベースでは削除されていないということがしたいのです。が必須だとすれば、今の延長線上で進めても実現できないので、私のレス
の内容を試しても時間の無駄です。Windows アプリと Web アプリの仕組みの違いを認識されているでしょう
か? ステートレスな Web アプリではそのようなことを実現するのは、
不可能とは言わないまでも、難しいです。自分が知る限りですが、標準のデーターソースコントロール(SqlDataSource
など)とデータバインドコントロール(ListView など)にはそのような
機能はありません。というわけで、上記のことが必須なら根本的に考え直す必要があると思
います。 -
SurferOnWwwさんへ
返信ありがとうございました。
本屋などで色々調べていたため、返信が遅くなりすみませんでした。どうやらASP.NETで上記のようなWeb画面の例は存在しないようです。
例として乗っていたサンプルのほとんどはショッピングサイトを作成するものがほとんどでした。
私が作りたいのはお客様から注文された内容を蓄積するためのシステムで、
それをWebを使ってやりたかったのですが、
まず単票+帳票という画面がなく、ASP.NETで実現するのは難しいのかもと感じています。教えていただいたコードを使いListViewのデータの削除・修正は出来るようにはなったのですが、
この画面だと単表と帳票が一緒の画面にあるだけで連動しているわけではないので、
私のやりたいこととのズレを感じています。
もう一度やりたいことがWebで(ASP.NET)で実現できるのか確認したいと思います。
色々アドバイスありがとうございました。 -
> まず単票+帳票という画面がなく、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 誤記訂正
-
SurferOnWwwさんへ
返信ありがとうございます。
返信していただけるとは思わず長い間返信できなくてすみませんでした。
これからFormViewを使いコードを変更し、ListViewをGridViewに変更したいと思います。
GridViewに変更する理由としてはヘッダーに総額を追加したいからです。
ListViewでも可能なのであれば変更する理由はないのですが、どの本を見ても総額を表示するときに
GridViewを使う例が多く載っていたので、変更の必要があるかと思いました。
もう一度頂いたコードを参考に作成したいと思います。
一度は出来なくてあきらめかけましたが、SurferOnWwwさんの励ましと協力のおかげでもう一度頑張ろうと思えました。
ありがとうございました。
変更したものが出来上がりしだい載せたいと思います。
また、解らないてんなどまた質問するかと思いますが、よろしくお願いいたします。