C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[9]: GridViewソースのDataTableデータ削除


(過去ログ 139 を表示中)

[トピック内 10 記事 (1 - 10 表示)]  << 0 >>

■81830 / inTopicNo.1)  GridViewソースのDataTableデータ削除
  
□投稿者/ Artor (11回)-(2016/11/16(Wed) 17:35:07)

分類:[.NET 全般] 

いつもお世話になっております。
GridView で使用しているDataTableからのデータ削除(Remove)がうまくいかず、苦心しております。
お手数ですが、どなたかお知恵をお貸しいただけますでしょうか?

GridView1・GridView2があり、2つは全く同じレイアウトです。
どちらも先頭に、行選択用のチェックボックス項目があります。
以下の仕様なのですが、4の削除処理を行うと、GridView2だけでなくGridView1のデータまで削除されてしまいます。
(正確には、GridView1にバインドしているDataTable、およびセッションから行削除されてしまいます)

1[検索]ボタン押下→テーブル検索し結果をGridView1に表示、セッションにも保存
2[一括追加]ボタン押下→GridView1からGridView2に全行コピー
3[一括削除]ボタン押下→GridView2のデータを全削除(Nothing)
4[削除]ボタン押下→GridView2のチェックボックスで選択された行を削除
5[追加]ボタン押下→GridView1のチェックボックスで選択された行をGridView2に追加

たとえば、GridView2から2件選択して削除ボタン押下した場合:

デバッグ@の結果例:
削除前tblGridView1の件数:5
削除前tblGridView2の件数:5

デバッグAの結果例:
削除前tblGridView1の件数:3 ←なぜか削除されている。NG
削除前tblGridView2の件数:3 ←2件削除されている。OK



'================================================================================
'検索ボタン押下
'================================================================================
Protected Sub BtnSearch_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles BtnSearch.Click

Dim tblGridView1 As DataTable = Nothing

'テーブルを検索し結果をデータテーブルにセット
tblGridView1 = GetDataTable()

'GridViewに表示
Me.GridView1.DataSource = tblGridView1
Me.GridView1.PageIndex = 0
Me.GridView1.DataBind()

'検索結果をセッションに保持
Session.Remove("Session_tblGridView1")
Session.Add("Session_tblGridView1", tblGridView1)

End Sub

'================================================================================
'削除ボタン押下時
'================================================================================
Protected Sub BtnDel_Click(sender As Object, e As EventArgs) Handles BtnDel.Click

Dim i As Integer = 0
Dim strDenpyoNo As String = String.Empty
Dim strFilter As String = String.Empty

Dim tblGridView1 As DataTable = CType(Session("Session_tblGridView1"), DataTable)
Dim tblGridView2 As DataTable = CType(Session("Session_tblGridView2"), DataTable)

If Session("Session_tblGridView2") IsNot Nothing Then

'デバッグ@
Debug.WriteLine("削除前tblGridView1の件数:" & tblGridView1.Rows.Count)
Debug.WriteLine("削除前tblGridView2の件数:" & tblGridView2.Rows.Count)

'GridViewで選択された行をtblGridView2から削除
For Each r As GridViewRow In GridView2.Rows
If CType(r.FindControl("CbSelect"), CheckBox).Checked Then
strDenpyoNo = CType(r.FindControl("LblDenban"), Label).Text
strFilter = "DENPYO_NO = " & strDenpyoNo
Debug.WriteLine(strFilter)

'tblGridView2からデータ削除
For Each dr As DataRow In tblGridView2.Select(strFilter)
tblGridView2.Rows.Remove(dr)
Next

End If
Next

'GridView2に反映
Me.GridView2.DataSource = tblGridView2
Me.GridView2.PageIndex = 0
Me.GridView2.DataBind()

'検索結果をセッションに保持
Session.Remove("Session_tblGridView2")
Session.Add("Session_tblGridView2", tblGridView2)

'デバッグA
Debug.WriteLine("削除後tblGridView1の件数:" & tblGridView1.Rows.Count)
Debug.WriteLine("削除後tblGridView2の件数:" & tblGridView2.Rows.Count)

End If

End Sub

引用返信 編集キー/
■81834 / inTopicNo.2)  Re[1]: GridViewソースのDataTableデータ削除
□投稿者/ WebSurfer (1068回)-(2016/11/16(Wed) 18:40:03)
No81830 (Artor さん) に返信

何を作っているかと自分の開発環境を書いてください。(読めばわかるとは言わないでくださいね)
引用返信 編集キー/
■81835 / inTopicNo.3)  Re[2]: GridViewソースのDataTableデータ削除
□投稿者/ Artor (12回)-(2016/11/16(Wed) 20:01:28)
ご返答ありがとうございます。
大変失礼致しました。

開発環境:
ASP.net、VB.net、Visual Studio 2013、.net framework 4.5です。

作っているもの:
同じレイアウトのGridView が2つあり、片方のチェックボックスで選択した行を、
削除ボタンで削除したり、追加ボタンで追加したりできるWebアプリケーションを作成し
行の追加・削除は、Data Table に対して行なった後、GridView に反映しています。

問題:
GridView2のソースであるDataTable2の削除(Remove)を行うと、
なぜか関係ないはずのDataTable1まで同じ行が削除されてしまいます。
DataTable の内容は、更新後にセッションに格納して、アプリケーション内で利用しているのですが、
セッションの処理の不具合なのか、DataTable 自体の更新処理に不具合があるのか、分からず困っております。

引用返信 編集キー/
■81836 / inTopicNo.4)  Re[3]: GridViewソースのDataTableデータ削除
□投稿者/ WebSurfer (1069回)-(2016/11/16(Wed) 20:37:53)
No81835 (Artor さん) に返信

質問者さんは ASP.NET Web Forms アプリの開発経験をどのぐらいお持ちなのでしょうか?

ざっと見た限りですが、GirdView にバインドする DataTable を Session に保持し、それを
クライアントからポストバックしながら操作するというような、普通は Web アプリではやら
ない(かなり無理そうな)ことをされているように思えます・・・

全体的なシナリオを含めて究極的に何がやりたいのかも教えていただけるでしょうか? そう
していただけると、究極的なやりたいことを実現するにはこうした方がいいという提案も出て
くるかも知れませんので。
引用返信 編集キー/
■81837 / inTopicNo.5)  Re[4]: GridViewソースのDataTableデータ削除
□投稿者/ Artor (13回)-(2016/11/16(Wed) 21:48:48)
WebSurfer様

ご返答ありがとうございます。
Webアプリケーションの開発は、10月末頃から始めたばかりの初心者です。

おっしゃる通り、画面遷移時の情報受け渡しのためにセッションを利用するのではなく、
1つの画面(Webフォーム)内でDataTable の内容をセットしたり操作する目的で、
DataTable 更新後にセッションに情報を保存しておき、ポストバック時に読み直しする、
という方法をとっておりました。
画面内でメンバー変数としてDataTable を定義し、利用する方法も試みたのですが、ポストバックすると内容が消えてしまったので…

やりたいことは、先ほど書いた通りで、通常はリストボックスで実装するような、2つのデータ一覧の間のデータ追加&削除なのです。
イメージといたしましては…

@検索を実行すると、編集候補一覧(たとえばユーザー一覧)が表示される
A編集候補一覧から、編集したいレコード(ユーザー)を選んで、編集対象一覧に追加したり削除したりする
B「編集」ボタンが押下されたら、編集対象一覧のデータを編集するための別画面に遷移する(対象のデータの情報はセッションで渡す)
という感じなのですが、伝わりますでしょうか??
引用返信 編集キー/
■81838 / inTopicNo.6)  Re[5]: GridViewソースのDataTableデータ削除
□投稿者/ Artor (14回)-(2016/11/16(Wed) 23:03:53)
2016/11/16(Wed) 23:04:36 編集(投稿者)

WebSurfer様

度々すみません。

>GirdView にバインドする DataTable を Session に保持し、
>それをクライアントからポストバックしながら操作するというような、
>普通は Web アプリではやらない(かなり無理そうな)ことをされているように思えます・・・

まさに、おっしゃる通りです。
そのような仕様に基づいて製造しております…

ポストバックするとDataTable のデータは消えてしまうので、
Session 変数か ViewState にデータセットを保存するしかないと思い、このようなコードを書きました。
(データが多ければ、データSelectのための条件だけSessionに保存して、都度DBを再検索しなければならないと思いますが)
しかし、どうもDataTable の行をRemoveすると、別のDataTable まで行削除されてしまうという事象が起き、悩んでおります。

引用返信 編集キー/
■81843 / inTopicNo.7)  Re[6]: GridViewソースのDataTableデータ削除
□投稿者/ WebSurfer (1070回)-(2016/11/17(Thu) 11:05:03)
No81838 (Artor さん) に返信

> デバッグAの結果例:
> 削除前tblGridView1の件数:3 ←なぜか削除されている。NG
> 削除前tblGridView2の件数:3 ←2件削除されている。OK

アップされたコードからは不明ですが、tblGridView1 と tblGridView2 は同じ DataTable オブ
ジェクト(インスタンス)を指しているということはないですか?

それより、私の意見を言わせていただければ、そもそもやり方が普通ではないので(はっきり言
うと NG)、全面的に見直したほうがよさそうに思います。

やりたいことは、

> @検索を実行すると、編集候補一覧(たとえばユーザー一覧)が表示される
> A編集候補一覧から、編集したいレコード(ユーザー)を選んで、編集対象一覧に追加したり削除したりする
> B「編集」ボタンが押下されたら、編集対象一覧のデータを編集するための別画面に遷移する(対象のデータの情報はセッションで渡す)

ということで、編集候補一覧が GridView1、編集対象一覧が GridView2 と理解しています。

GridView1 のチェックボックスにチェックマークがついているのが編集対象とすれば GridView2
は不要ですよね。

GridView1 がページングされていても以下の記事にあるようにすればチェックされた項目は取得
できます。

Paging 機能付 GridView の行選択
http://surferonwww.info/BlogEngine/post/2013/12/19/selected-results-on-checkboxes-in-paged-gridview.aspx

上記のようなことで OK であれば、DataTable を Session に保持し、それをクライアントから
ポストバックしながら操作するというような、普通は Web アプリではやらない(かなり無理そ
うな)ことはしなくて済むはずなのですが。

客の要求とかでどうしても GridView1、GridView2 の両方を表示する必要があるのでしょうか?
引用返信 編集キー/
■81856 / inTopicNo.8)  Re[7]: GridViewソースのDataTableデータ削除
□投稿者/ Artor (15回)-(2016/11/17(Thu) 18:05:31)
WebSurfer 様

> GridView1 のチェックボックスにチェックマークがついているのが編集対象とすれば GridView2は不要ですよね。

実は、私も全く同じことを考えまして、昨夕、ユーザーにGridView1のみで実装する代替案を提案させて頂きました。

元の仕様(ユーザー要望)は、データ量が多い場合、選択したデータが視覚的に分かりやすい、というメリットくらいしか思いつかず…
それも絞り込んで検索すれば済む話かと思うので…

>それより、私の意見を言わせていただければ、そもそもやり方が普通ではないので(はっきり言うと NG)、
>全面的に見直したほうがよさそうに思います。

可能であれば、具体的に、どんな部分がNGか、お教え頂けますでしょうか?

元の仕様では、常にポストバックが発生しているような状態なのでリソース面に不安がありますし、ユーザーのオペレーション手数も多くなる、保守性も悪くなるなどのデメリットを考えましたが、ASP.NETの開発経験がうすいので、ご意見頂けると大変ありがたいです。
引用返信 編集キー/
■81857 / inTopicNo.9)  Re[8]: GridViewソースのDataTableデータ削除
□投稿者/ WebSurfer (1072回)-(2016/11/17(Thu) 18:45:55)
No81856 (Artor さん) に返信

> 可能であれば、具体的に、どんな部分がNGか、お教え頂けますでしょうか?

それは質問者さんが今回の課題を解決するのに経験されたとおりで、サーバーコント
ロールに標準で備わっている機能を超えて何かしようとすると、とたんに敷居が高く
なって、裏技的なことが必要になってくるということと自分は思っています。

質問者さんも書かれていますように、何度も無駄なポストバックをしてリソースを
浪費する、開発工数・保守工数が無駄に高くなるというのが一番のデメリットだと
自分も思います。

あと、Session を使う場合、どのタイミングで消去するか、InProc ではメモリの
消費やワーカープロセスのリサイクルによる Session 情報の消失、StateServer
や SQL Server モードではシリアル化可否の問題、シリアル化できるとしてもシリ
アル化・逆シリアル化によるオーバーヘッドの問題なども考えなければならないと
思います。

なので、どうしても必要と言うことでなければ Session は使わない(少なくとも
安易に使わない)のがよさそうです。

引用返信 編集キー/
■81860 / inTopicNo.10)  Re[9]: GridViewソースのDataTableデータ削除
□投稿者/ Artor (16回)-(2016/11/17(Thu) 20:44:40)
Web Surfer様

ご返信ありがとうございます。
大変貴重なご意見を頂き、感謝いたします。
アドバイスいただいた内容を参考にさせていただきながら、
代替案を検討したいと思います。

ご協力頂きまして、ありがとうございました。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -