質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

データバインディング

データソースと、アプリケーションやウェブページ(ウェブアプリケーション)のユーザインタフェースを静的または動的に結合する技術です。

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

Q&A

解決済

1回答

981閲覧

バインディングして出力したデータを更新、消去したい。

pj7577bm60v

総合スコア13

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

データバインディング

データソースと、アプリケーションやウェブページ(ウェブアプリケーション)のユーザインタフェースを静的または動的に結合する技術です。

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

0グッド

0クリップ

投稿2020/05/10 15:21

編集2020/05/11 03:52

前提・実現したいこと

いつもお世話になっています。
配列、ジェネリックを使用してCRUDシステムの制作を目指しています。
TestListClassに入れたデータをTestClassにてバインディングを行いButton1_Clickにて出力しています。
Button2_clickで出力したデータを消去したいのですが例外が出てしまいます。
データを非表示にするなどの方法もあると思いますが、データを更新させて最終的に消去したいコードを作りたいです。

発生している問題・エラーメッセージ

下記のコードは上書きを行おうと書いたコードです。 上書きだけなら実現できたのですが、バインディングを外して出力し消去しようとしたところ例外が発生しました。

該当のソースコード

C#

1using System; 2using System.Collections; 3using System.Collections.Generic; 4using System.ComponentModel; 5using System.Data; 6using System.Drawing; 7using System.Linq; 8using System.Text; 9using System.Threading.Tasks; 10using System.Windows.Forms; 11 12namespace WindowsFormsApp1 13{ 14 public partial class Form1 : Form 15 { 16 public Form1() 17 { 18 InitializeComponent(); 19 } 20 21 private void button1_Click(object sender, EventArgs e) 22 { 23 TestList t = new TestList(); 24 dataGridView1.DataSource = t.Data; 25 } 26 27 private void button2_Click(object sender, EventArgs e) 28 { 29 30 ClearTest ct = new ClearTest(); 31 dataGridView1.DataSource = ct.ClearData; 32 33 foreach (DataGridViewRow vr in dataGridView1.SelectedRows) 34 { 35 if (!vr.IsNewRow) 36 { 37 dataGridView1.DataSource = vr; 38 39 dataGridView1.Rows.Remove(vr); 40 } 41 } 42 } 43 } 44 45 public class Test 46 { 47 public string sub { get; set; } 48 public int num { get; set; } 49 public int num2 { get; set; } 50 51 } 52 53 public class TestList 54 { 55 public List<Test> Data; 56 57 public TestList() 58 { 59 //コンストラクタにてDataの初期化処理 60 Data = new List<Test> 61 { 62 new Test {sub = "string", num = 123, num2 = 456 } 63 }; 64 } 65 } 66 public class ClearTest 67 { 68 public string clearSub; 69 public int clearNum; 70 public int clearNum2; 71 72 public List<ClearTest> ClearData; 73 public ClearTest() 74 { 75 ClearData = new List<ClearTest> 76 { 77 new ClearTest{clearSub = "", clearNum = 0, clearNum2 = 0} 78 }; 79 } 80 } 81}
System.StackOverflowException

試したこと

Binding解除がうまくいかず、調べても上手く検索できませんでした。
よろしくお願いします。

補足情報(FW/ツールのバージョンなど)

Microsoft Visual Studio Community 2019
Version 16.5.4
.NET Framework version 4.8.03752

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y_waiwai

2020/05/10 15:28

どういう例外が出たんでしょう。 出たメッセージはいらぬ翻訳省略しないで、コピペでそのまま提示してください
gentaro

2020/05/10 16:08

CLUDって何だろう。 CRUDなら知ってるけど。
退会済みユーザー

退会済みユーザー

2020/05/10 22:20 編集

DataGridView を使う Windows Forms アプリを作っているのですよね? CRUD ということで、DB のレコードの表示だけでなく編集と更新もしたいなら根本的に作り方を変えることをお勧めします。 List<T> 型のオブジェクトを使うのは CRUD の R だけならともかく C, U, D を考えると不可能とまでは言えなくても現実的ではないと思います。
pj7577bm60v

2020/05/11 03:53

ご指摘ありがとうございます。例外文追記させていただきました。 よろしくお願いします。
Zuishin

2020/05/11 03:54

調べても BindingSource が出てこないってことがあるんだろうか。
pj7577bm60v

2020/05/11 03:55

ご指摘ありがとうございます。CLUD修正いたしました。失礼いたしました。 CRUDで間違えございません。よろしくお願いします。
pj7577bm60v

2020/05/11 03:59

ご指摘ありがとうございます。 具体的にはどう作り直せば現実的になるのでしょうか? よろしくお願いします。
pj7577bm60v

2020/05/11 04:05

BindingSource検索してみます。 ClearBindingは出てきたのですが、うまく実装できませんでした。 ありがとうございます。
退会済みユーザー

退会済みユーザー

2020/05/11 04:33

> 具体的にはどう作り直せば現実的になるのでしょうか? Visual Studio のデータソース構成ウィザードを使って型付 DataSet / DataTable + TableAdapter を作り、それを利用することです。 データーベースは何なのですか? SQL Server? MySQL? Oracle?
退会済みユーザー

退会済みユーザー

2020/05/11 04:48

上の私のコメントの「Visual Studio のデータソース構成ウィザードを使って型付 DataSet / DataTable + TableAdapter を作り、それを利用する」を回答欄に書いておきます。
guest

回答1

0

ベストアンサー

CRUD と言うからには SQL Server などの DB のテーブルのレコード一覧を Windows Forms アプリで DataGridView に表示し、ユーザーがそれを見て編集し、その結果で DB のテーブルに更新をかけるということですよね。

そうだとすると、今やっている List<T> 型のオブジェクトを作って DataGridView にバインドするというやり方ではなかなかゴールにはたどり着けないと思います。

List<T> 型でも DataGrisView にレコード一覧を表示する CRUD の R だけなら容易ですが、ユーザーが DataGridView に表示された内容を編集し結果を DB に反映する(C, U, D 操作が必要)ということになると、とたんに敷居が高くなるはずです。

Windows Forms / DataGridView と親和性の高い DataSet / DataTable を使った方がよさそうです。

以下の記事の「非接続型のデータ更新」のセクションの図1と図2を見てください。

DB 設計者のための明解 ADO.NET 第 1 回
https://docs.microsoft.com/ja-jp/previous-versions/cc482903(v=msdn.10)

上のような構造にすれば、ユーザーが DataGridView を操作した結果は図1にあるように DataSet / DataTable に反映されます。もちろん削除の結果もです。

編集作業が終了後、ユーザーが更新ボタンをクリックすれば、図2のように DataAdapter によって SQL が自動発行され、SQL Server のテーブルが更新されます。

DB が SQL Server の場合ですが、以下のチュートリアル、

10 行でズバリ !! 非接続型のデータ アクセス
https://github.com/microsoftarchive/msdn-code-gallery-community-0-9-non-alphabetic/tree/master/10%20%E8%A1%8C%E3%81%A7%E3%82%BA%E3%83%90%E3%83%AA%20!!%20%E9%9D%9E%E6%8E%A5%E7%B6%9A%E5%9E%8B%E3%81%AE%E3%83%87%E3%83%BC%E3%82%BF%20%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%20(ADO.NET)%20(VB)

(上の URL にはリンクが張れないのでコピペしてください)

・・・のように Visual Studio のデータソース構成ウィザードを利用して型付 DataSet + TableAdapter を作って、それを利用してアプリを作ると、上に書いた、

DataGridview ⇔ BindingSource / BindingNavigator ⇔ DataSet / DataTable ⇔ DataAdapter⇔ SQL Server

・・・と言う構造、すなわち以下のページの図のような構造のアプリが、ほとんど自分でコードを書くこと無しに作れます。

Windows フォーム アプリケーションでのデータへの接続
https://docs.microsoft.com/ja-jp/previous-versions/wxt2cwcc(v=vs.120)

上に紹介したチュートリアルは 2 つのテーブルを階層更新するために少々複雑になっていますが、単一テーブルですともっと簡単で、操作に慣れると以下のようなアプリが 5 分もかからず作れるはずです。

自力で一からコードを書く場合のような種々の問題に悩むことはなくなり、開発工数は激減するはずです。保守工数も減るはずです。お試しください。

投稿2020/05/11 04:57

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

pj7577bm60v

2020/05/11 12:46

ありがとうございます。チュートリアル見させていただきました。 よりよい制作を目標に努力していきます。 ありがとうございました。
pj7577bm60v

2020/05/11 12:56

>自力で一からコードを書く場合のような種々の問題に悩むことはなくなり やはり自力で開発する場合に問題にぶち当たった場合乗り越る力を持つというのは経験を積んでいく、 というのが一番なのでしょうか? もしくは、今回は開発手法の選定がマッチしていなかったように思うのですが、地道に経験を積んでいく、検索方法を変える、もしくはその他に方法があるのでしょうか?
退会済みユーザー

退会済みユーザー

2020/05/11 13:45

> やはり自力で開発する場合に問題にぶち当たった場合乗り越る力を持つというのは経験を積んでいく、 というのが一番なのでしょうか? それは確かにその通りだと思います。ただ、乗り越えられない壁に挫折してしまっては元も子もないので、そのあたりの兼ね合いをどうするかということはあると思います。 > 今回は開発手法の選定がマッチしていなかったように思うのですが、地道に経験を積んでいく、検索方法を変える、もしくはその他に方法があるのでしょうか? 独学でやるより、Microsoft や @IT のサイト、書籍などの信頼できそうな記事、チュートリアルで勉強するのが良いと思います。
pj7577bm60v

2020/05/11 14:07

重ね重ねありがとうございます。 参考もかなりいただきましたのでそれをもとにに基礎を見直して一から作りなおしてみます。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問