- PR -

DataGridViewとDataSetで動的に表示するレコードを変更

1
投稿者投稿内容
R・田中一郎
ぬし
会議室デビュー日: 2005/11/03
投稿数: 979
投稿日時: 2006-04-11 18:08
DataGridView にデータソースを指定して表示したり、値を変更しています。

ここで検索条件を指定することで動的に表示するレコードを変更したり、変更した
表示の状態で値を変更することはできますか?

できるとしたら、どのようにすれば良いのでしょうか?

デザイナが吐き出したコードから関係しそうな部分のみ抜粋してみました。
コード:

private DataSet dataSet;
private BindingSource 商品マスタービューBindingSource;
private システム.DataSetTableAdapters.商品マスタービューTableAdapter 商品マスタービューTableAdapter;
private DataGridView dataGridView;
private DataGridViewTextBoxColumn dataGridViewTextBoxColumn1;
private DataGridViewTextBoxColumn dataGridViewTextBoxColumn2;

private void InitializeComponent() {
this.dataSet = new システム.DataSet();

this.dataGridView = new DataGridView();
this.dataGridViewTextBoxColumn1 = new DataGridViewTextBoxColumn();
this.dataGridViewTextBoxColumn2 = new DataGridViewTextBoxColumn();

this.商品マスタービューTableAdapter = new システム.DataSetTableAdapters.商品マスタービューTableAdapter();
((System.ComponentModel.ISupportInitialize)(this.dataGridView)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.dataSet)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.商品マスタービューBindingSource)).BeginInit();
this.SuspendLayout();
//
// dataGridView
//
this.dataGridView.Columns.AddRange(
new System.Windows.Forms.DataGridViewColumn[] {
this.dataGridViewTextBoxColumn1,
this.dataGridViewTextBoxColumn2
}
);
this.dataGridView.DataSource = this.商品マスタービューBindingSource;
//
// dataGridViewTextBoxColumn1
//
this.dataGridViewTextBoxColumn1.DataPropertyName = "商品番号";
this.dataGridViewTextBoxColumn1.HeaderText = "商品番号";
//
// dataGridViewTextBoxColumn2
//
this.dataGridViewTextBoxColumn2.DataPropertyName = "商品名";
this.dataGridViewTextBoxColumn2.HeaderText = "商品名";
//
// dataSet
//
this.dataSet.DataSetName = "DataSet";
this.dataSet.SchemaSerializationMode = System.Data.SchemaSerializationMode.IncludeSchema;
//
// 商品マスタービューBindingSource
//
this.商品マスタービューBindingSource.DataMember = "商品マスタービュー";
this.商品マスタービューBindingSource.DataSource = this.dataSet;
//
// 商品マスタービューTableAdapter
//
this.商品マスタービューTableAdapter.ClearBeforeFill = true;
//
// 商品マスター
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(792, 566);
this.Controls.Add(this.dataGridView);
this.Controls.Add(this.selectSqlEditor);
this.Controls.Add(this.funckey);
this.MinimumSize = new System.Drawing.Size(800, 600);
this.Name = "商品マスター";
this.Text = "商品マスター";
this.Load += new System.EventHandler(this.商品マスター_Load);
((System.ComponentModel.ISupportInitialize)(this.dataGridView)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.dataSet)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.商品マスタービューBindingSource)).EndInit();
this.ResumeLayout(false);
}



[ メッセージ編集済み 編集者: R・田中一郎 編集日時 2006-04-11 18:57 ]

[ メッセージ編集済み 編集者: R・田中一郎 編集日時 2006-04-12 08:48 ]
R・田中一郎
ぬし
会議室デビュー日: 2005/11/03
投稿数: 979
投稿日時: 2006-04-12 09:47
上記の状態で何らかのトリガーで

this.商品マスタービューTableAdapter.Fill(this.dataSet.商品マスタービュー);
this.dataSet.商品マスタービュー.DefaultView.RowFilter = "商品名 = 'あいう'";

でできそうなのですがどうしても駄目です。
どっとねっとふぁん
ぬし
会議室デビュー日: 2005/02/23
投稿数: 935
投稿日時: 2006-04-12 10:44
試してないのですが、商品マスタービューBindingSourceのFilterプロパティに
絞込みの条件を設定してみるとどうなりますかね。
買太郎
会議室デビュー日: 2006/03/27
投稿数: 10
お住まい・勤務地: 大阪府
投稿日時: 2006-04-12 11:48
バインドしている、オブジェクト(DataSetやDataTable)を変更すれば動的に変わりませんか?
私の環境では、DataGridViewにOracleから取得したDataTableバインドしており、
ボタン押下時にそのDataTableのRows.Addを追加したり、Rows[n]のカラムの値を変更すると、
勝手にDataGridViewへ反映されます。

VS2005 C#です。
R・田中一郎
ぬし
会議室デビュー日: 2005/11/03
投稿数: 979
投稿日時: 2006-04-12 11:59
引用:

どっとねっとふぁんさんの書き込み (2006-04-12 10:44) より:

試してないのですが、商品マスタービューBindingSourceのFilterプロパティに
絞込みの条件を設定してみるとどうなりますかね。



できました。
商品マスタービューBindingSource を直接設定すれば良かったんですね。
ありがとうございました。

引用:

買太郎さんの書き込み (2006-04-12 11:48) より:

バインドしている、オブジェクト(DataSetやDataTable)を変更すれば動的に変わりませんか?



DataSet や DataTable を変更すると動的に変わることは理解していたのですが、
肝心の DataSet や DataTable に「何かする」ということが今ひとつ理解できて
いないみたいです。
先の例のように解を示していただくと深く納得はできるのですが(^^;A)

ところで 商品マスターテーブルTableAdapter のインテリセンスに Update メソッ
ドの文字が見つからないのですが、もしやビューは更新できないってことでしょうか。

何となく、できない理由もわかる気はしますが。

だとしたら、複数のテーブルを結合した表で値を編集する場合は、皆さんはどうや
っているんでしょうか?
買太郎
会議室デビュー日: 2006/03/27
投稿数: 10
お住まい・勤務地: 大阪府
投稿日時: 2006-04-12 12:20
簡単なソースイメージを書いて見ます。

データ取得ボタンクリックイベント
{
//DataBaseからData取得
DataTable bindDt = DB取得メソッド(取得キー);
//DataGridViewのDataSourceへバインド
//(あらかじめDataGridViewのカラムとDataTableのカラムはマッピングしてます。)
this.DataGridView1.DataSource = bindDt;
}

新規行追加イベント
{
DataTable dt = (DataTable)DataGridView1.DataSource;
//新規行DataRowを作成
DataRow dr = dt.New();
//新規行内容設定
dr["カラム1"] = "新規行";
dr["カラム2"] = 111;
//DataTableへ新規行を追加
dt.Rows.Add(dr);
}

選択行変更イベント
{
DataTable dt = (DataTable)DataGridView1.DataSource;
//新規行DataRowを作成
DataRow dr = dt.Rows[選択行Index];
//新規行内容設定
dr["カラム1"] = "選択行";
dr["カラム2"] = 222;
}



ってな感じです。
要は、DataSourceに割り当ててるオブジェクトを操作すればいけるはずです。
再度、DataBaseの内容を表示しなおしを行う場合には、DataSourceに表示するオブジェクト割り当てなせば大丈夫じゃないでしょうか?
R・田中一郎
ぬし
会議室デビュー日: 2005/11/03
投稿数: 979
投稿日時: 2006-04-12 15:18
引用:

買太郎さんの書き込み (2006-04-12 12:20) より:

要は、DataSourceに割り当ててるオブジェクトを操作すればいけるはずです。



サンプルをありがとうございました。
やはりテーブルでないと、

this.Validate();
this.マスターテーブルBindingSource.EndEdit();
this.マスターテーブルTableAdapter.Update(this.dataSet.マスターテーブル);

では済まないのですね。

#人間、一度楽すると駄目になる典型でしょうか。
1

スキルアップ/キャリアアップ(JOB@IT)