Visual Basic 中学校 掲示板 投稿内容
タグのない投稿を抽出 統計 RSS

Visual Basic 中学校 > 投稿一覧 >

datagridviewの使い方 解決済み

タグの編集...

投稿者 ケンケン   (社会人)   投稿日時 2022/1/4 16:19:46
CREATE TABLE tGyoji( 
  START_DATE TEXT DEFAULT '' NOT NULL             -- 開始日付
  , END_DATE TEXT DEFAULT '' NOT NULL             -- 終了日付
  , EDA INTEGER DEFAULT 0 NOT NULL                -- 枝番
  , GYOJI_NOTICE TEXT DEFAULT '' NOT NULL         -- 行事名
  , PRIMARY KEY (START_DATE, END_DATE, EDA)
)
 ↑ dbの項目です。

vbのdatagridviewを使ってSQLと紐づけする場合
 VB側のバインド列のプロパティで、データ(DataPropertyName)、デザイン(Name)がありますが
 どの項目にdb側の項目を記述して紐付けを行えばいいのですか?

ご教授お願い致します。



 

投稿者 魔界の仮面弁士   (社会人)   投稿日時 2022/1/5 15:00:29
> どの項目にdb側の項目を記述して紐付けを行えばいいのですか?

DataGridView とデータベースは、直接的には関係ありません。
重要なのは DataTable の項目です。

DataGridView にバインドした場合は、各列の DataPropertyName として
DataTable や DataView の列名を割り当てます。

紐づけるのは『DataTable の列名』であって『データベースの列名』ではありません。
(DataTable 以外をバインドすることもできるので、上記の説明も正確とは言えませんが…)
 DataGridView1.DataSource = Me.Controls


SQL を実行するなら、『DataAdapter クラス』(もしくは TableAdapter)を使います。
『型付 DataSet』を使えば、DataTable の列定義をデザイン時に決定できますし、
DataTable とデータベースの仲介役となる TableAdapter も用意できます。


たとえば下記のような SQL を実行したとします。

SELECT
  START_DATE   AS 開始日付
, END_DATE     AS 終了日付
, EDA          AS 枝番
, EDA + 1      AS 次の枝番
, GYOJI_NOTICE AS 行事名
FROM tGyoji
ORDER BY 1, 2

この結果を DataTable に保存した場合、DataTable の各列は
 "START_DATE", "END_DATE", "EDA", "GYOJI_NOTICE"
という列名ではなく
 "開始日付", "終了日付", "枝番", "次の枝番", "行事名"
という列名が使われる事でしょう。

そしてそれを DataGridView にバインドするのであれば、
その「DataTable 上の列名」を割り当てます。

DataGridView で編集する際の各列のデータ型(日付とか文字列とか数値とか)も、
SQL によって決まるのではなく、DataTable の定義情報によって決まります。

もしも取得後に DataTable の列名を変更したり、列を追加・削除していた場合は、
SQL 実行時の列名ではなく、現在の DataTable の列名を割り当ててください。

なお、DataGridView にバインド列の定義が無い場合でも、DataSource を割り当てた時に、
該当列が自動的に生成すれることがありますが、この動作を変更したい場合には、
DataGridView の AutoGenerationColumns プロパティ(デザイナー画面上では非表示)で切り替えます。


> vbのdatagridviewを使ってSQLと紐づけする場合

DataGridView と SQL は直接関係ありません。

データベースから取得した情報は、通常、「DataSet」または「DataTable」クラスに格納されます。

(DataSet は複数の DataTable をひとまとめにしたものであり、たとえば
 「顧客マスタテーブル」と「売上明細テーブル」を 顧客 ID で関連付けて
 この 2 つのテーブルを、 1 つの DataSet に保持しておくといったことができます)


ご存知かとは思いますが、データベースから取得したデータを DataTable に保存するには、
『DataAdapter クラス』(もしくは TableAdapter)を使うのが一般的です。
ここには SELECT 文などの SQL を指定することができます。

ただし DataTable はデータベース専用というわけではありません。
任意のデータを保持することができるようになっていますので、
元データは CSV や XML でも構いませんし、SQL を一切使わなくても構いません。


そしてその DataTable を DataGridView の DataSource プロパティに割り当てると、
DataTable の内容を DataGridView に表示したり編集したりすることができます。

編集した結果は、DataTable 内に記録されます。

DataTable には、DataGridView で修正された後と修正される前の値の両方が保持されており、その各行は
Unchanged: 取得された後、特に変更されていない行
 Modified: 取得された後、値の変更が行われた行
  Deleted: 取得された後、削除マークが付けられた非表示行
    Added: 新たに追加された行
という 4 種いずれかの状態に変化します。(取得直後は 全件が Unchanged )

(上記のほか、DataTable に割り当てられていない行を示す Detached という行状態もあります。これは DataGridView 上で行を追加しようとしている最中の未確定の行などを指します)


そうして、DataTable 内に修正された内容が保持されたら、
『DataAdapter クラス』(もしくは TableAdapter)を使って
編集結果をデータベースに書き戻すことができます。
この場合は、 INSERT/DELETE/UPDATE などの SQL が実行されることになりますね。

投稿者 ケンケン   (社会人)   投稿日時 2022/1/6 17:06:00
丁寧な回答ありがとうございます。
参考にさせて貰います。