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

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

ただいまの
回答率

88.19%

C#.NETでDataGridViewで変更した値を反映させたい

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 21K+
退会済みユーザー

退会済みユーザー

前提・実現したいこと

初質問です。書き方間違っていたらすみません、
初心者ですので申し訳ありませんがレベルを下げた分かりやすい回答をお願いします。
postgresqlデータベースから情報をAdpter(select ✳︎ from 表名)で取り出し、datasetに格納し、
フォーム上でdatagridviewに表示することはできました。
そこで、datagridviewに書き込みはできるのですが、それをdatabaseに反映させることって出来ますか?
もしくは、フォーム上でdatagridviewを見ながらユーザが操作してdatabaseに追加や変更、削除を行えるやり方はありますか?
すみません。全く分からなく、前者が出来ないのであれば後者のやり方をお願いします。
また、変な事してたら教えてください。
.

該当のソースコード

ここにご自身が実行したソースコードを書いてください


OdbcConnection cn = new OdbcConnection();
OdbcCommand cm = new OdbcCommand();
DataTable dt = new DataTable();
DataTable dt1 = new DataTable();

cn.ConnectionString = "dsn=データソース名";

cn.Open();
MessageBox.Show("接続状態:" + cn.State.ToString(), "通知");
cm.Connection = cn;
cm.CommandText = "select * from eat;select * from test";
OdbcDataAdapter da = new OdbcDataAdapter(cm);
da.TableMappings.Add("Table", "eat");
da.TableMappings.Add("Table1", "test");
DataSet ds = new DataSet();
da.Fill(ds);

dt = ds.Tables["eat"];
dt1 = ds.Tables["test"];
dataGridView1.DataSource = dt;

試したこと

課題に対してアプローチしたことを記載してください
単純に=を逆にしたり、キャストしても駄目でした

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

より詳細な情報
postgresqlのTableにはeatとtestがあって
eatにはid(int),name(string),price(int)があります。

探して見て、vbの方ではこれかなと感じるものはありましたが、
よく分からなく、また色々検索してみましたが理解できませんでした。

ご回答をお待ちしています。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

流れとしては、
①DataGridViewにDBのデータをセット
②画面上でDataGridViewを編集
③(書いてないですが)保存ボタンクリック等でDBに反映
ということですか?

であれば、保存ボタンクリックイベントで、DataGridViewのDataSourceを取得し、OdbcDataAdapter.Updateメソッドを実行すれば、DBに対してINSERT、UPDATE、DELETEが実行されます。

という回答で大丈夫ですか?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/08/03 23:27

    ここにコメントを書けばいい感じですか?すみません登録したばかりで分かっていません。
    ①②③の通りです。ようやくありがとうございます。
     
    先ほどの物に別ボタンを作成し、クリックイベントで追加してみました。
    ds.Tables["eat"] = dataGridView1.DataSource;
    da.Update(ds.Tables["eat"]);
    ds.Tables["eat"]で【CS0200プロパティまたはインデクサー 'DataTableCollection.this[string]' は読み取り専用であるため、割り当てることはできません】というエラーがでます。エラーの意味理解できましたが、解決策がわかりません。
    どのようにしたらよろしいでしょうか?

    キャンセル

  • 2016/08/03 23:28

    ↑すみませんエラーは
    最初の代入【ds.Tables["eat"] = dataGridView1.DataSource;】
    の左側です

    キャンセル

  • 2016/08/04 08:59

    DataSetにテーブルを格納する場合は、対象テーブル名が存在する場合は、一旦削除してから追加する必要があります。対象テーブル名が存在しない場合は追加するだけでOKです。
    また、DataGridView.DataSourceはobject型ですので、取得する際は明示的にキャストする必要があります。
    ※個人的には、DataAdapter.Updateに使うだけであれば、DataSetは使わず、DataTableにDataGridView.DataSourceを取得してしまいますが。

    それから、古い資料ですが、DBの更新処理は以下が参考になると思います。
    http://www.atmarkit.co.jp/ait/subtop/features/dotnet/adonet_index.html
    これの第6回の2ページあたりが参考になるでしょう。
    また、3ページのSqlCommandBuilderを使えば、SQLを自動生成してくれるのでSQLを書く手間が省けます。

    キャンセル

  • 2016/08/08 11:19

    仕組みがしっかりと理解出来ていなかったみたいです
    このサイトhttp://www.atmarkit.co.jp/ait/subtop/features/dotnet/adonet_index.html
    が大変為になりました!ありがとうございます!

    キャンセル

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

  • ただいまの回答率 88.19%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る