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

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

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

Re[4]: データグリッドビューの再表示


(過去ログ 98 を表示中)

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

■58500 / inTopicNo.1)  データグリッドビューの再表示
  
□投稿者/ しぃーちゃん (1回)-(2011/04/09(Sat) 12:35:18)

分類:[C#] 

データグリッドビューの再表示についてアドバイスお願いしますm(_ _)m
言語はC#で始めに長文になってしまいましてm(_ _)m
実現したい内容としましては、Form1にて編集したいデータをダブルクリックし、
Form2の編集画面に選択されたデータを表示します。
ここまでは、完成しているのですが問題はこれからでしてForm2で編集され更新されたデータを、
Form1のデータグリッドビューに再表示させたいのですが今の状態だとForm2で編集され更新されたデータが、
Form1へ画面が移るとデータグリッドビューのデータが更新されてなく、
バインディングナビゲーターのセーブアイコンを押さないとデータが更新されないコードになっています。

Form2で編集されたデータをForm1で編集更新されデータを再表示させるには、
どのように実現またはコードを追加してあげれば良いのでしょうか?

何となくではありますが、Form1のロードイベントでデータグリッドビューのデータをクリアして、
再び再表示させてあげれば良いのかなって漠然な考えしか浮かばずなかなか思うように進まないので、
よろしくお願いしますm(_ _)m

※Form1のコード
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace WindowsApplication2
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
// 検索のためのフィルタ
public string Filter;

private void addresstureTable_1BindingNavigatorSaveItem_Click(object sender, EventArgs e)
{
this.Validate();
this.addresstureTable_1BindingSource.EndEdit();
this.addresstureTable_1TableAdapter.Update(this.addresstureWorksDataSet.AddresstureTable_1);

}

private void Form1_Load(object sender, EventArgs e)
{
// TODO: このコード行はデータを 'addresstureWorksDataSet.AddresstureTable_1' テーブルに読み込みます。必要に応じて移動、または削除をしてください。
this.addresstureTable_1TableAdapter.Fill(this.addresstureWorksDataSet.AddresstureTable_1);

}

private void ButtonSearch_Click(object sender, EventArgs e)
{
// 検索ダイアログボックスのインスタンスを作成する
SearchDialog search = new SearchDialog();
// 検索ダイアログボックスを作成する
DialogResult ret = search.ShowDialog();
// [検索]ボタンがクリックされたら検索を行う
if (ret == DialogResult.OK)
{
// フィルタを設定する
addresstureTable_1BindingSource.Filter = search.Filter;
}
}
// データグリッドビューのDataErrorイベント処理
private void addresstureTable_1DataGridView_DataError(object sender, DataGridViewDataErrorEventArgs e)
{
int row = addresstureTable_1DataGridView.CurrentCell.RowIndex + 1;
int col = addresstureTable_1DataGridView.CurrentCell.ColumnIndex + 1;
MessageBox.Show(row.ToString() + "行" +
col.ToString() + "列の入力を確認してください。",
"データ入力エラー", MessageBoxButtons.OK, MessageBoxIcon.Warning);
}

private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
// ナビゲーターのセーブアイコンをクリックして、プロパティのNameを参照
addresstureTable_1BindingNavigatorSaveItem_Click(null, null);
}
// 検索ボタン押下処理
private void button_Search_Click(object sender, EventArgs e)
{
// 検索ダイアログボックスのインスタンスを作成する
// SearchDialog.csのインスタンス
SearchDialog search = new SearchDialog();
// 検索ダイアログボックスを作成する
DialogResult ret = search.ShowDialog();
// [検索]ボタンがクリックされたら検索を行う
if (ret == DialogResult.OK)
{
// フィルタを設定する
// SearchDialog.csのインスタンス(search)の検索条件Filterを
// addresstureTable_1BindingSource.Filterの代入している。
addresstureTable_1BindingSource.Filter = search.Filter;
}
}
// 閉じちゃいなよボタン押下処理
private void button_Close_Click(object sender, EventArgs e)
{
Application.Exit();
}

private void addresstureTable_1DataGridView_CellContentClick(object sender, DataGridViewCellEventArgs e)
{
// 単票形式のインスタンスを作成する
Form2 tForm = new Form2();
// 単票形式のダイアログボックスを作成する
DialogResult tret = tForm.ShowDialog();
}

private void addresstureTable_1DataGridView_CellContentDoubleClick(object sender, DataGridViewCellEventArgs e)
{
DataRowView row = (DataRowView)addresstureTable_1DataGridView.Rows[e.RowIndex].DataBoundItem;
//DataRowView row = addresstureTable_1DataGridView.Rows[e.RowIndex].DataBoundItem as DataRowView;
//DataRowView row = addresstureTable_1DataGridView.Rows[e.RowIndex].Cells[0].Value.ToString();
// 単票形式のインスタンスを作成する
Form2 tForm = new Form2();
tForm.Row = row;
// 単票形式のダイアログボックスを作成する
DialogResult tret = tForm.ShowDialog();
}
public void UpdateData()
{
try
{
this.Validate();
this.addresstureTable_1BindingSource.EndEdit();
this.addresstureTable_1TableAdapter.Update(this.addresstureWorksDataSet.AddresstureTable_1);
MessageBox.Show("更新しました!");
}
catch (System.Exception ex)
{
MessageBox.Show("更新を失敗しました");
}
}
public void reLoad()
{
this.addresstureTable_1TableAdapter.Fill(this.addresstureWorksDataSet.AddresstureTable_1);
}
}
}

Form2のコード
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace WindowsApplication1
{
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
}
// 選択した行の値を受け渡すフィールド
private DataRowView row;

public DataRowView Row
{
get { return this.row; }
set { this.row = value; }
}
// セーブアイコン押下処理
private void addresstureTable_1BindingNavigatorSaveItem_Click(object sender, EventArgs e)
{
this.Validate();
Form1 addForm = new Form1();
addForm.UpdateData();
addForm.reLoad();
//this.addresstureTable_1BindingSource.EndEdit();
//this.addresstureTable_1TableAdapter.Update(this.addresstureWorksDataSet.AddresstureTable_1);

}

private void Form2_Load(object sender, EventArgs e)
{
this.customerIDTextBox.DataBindings.Add(new Binding("Text", this.row, "CustomerID"));
this.customerNameTextBox.DataBindings.Add(new Binding("Text", this.row, "CustomerName"));
this.zipCodeTextBox.DataBindings.Add(new Binding("Text", this.row, "ZipCode"));
this.customerAddressTextBox.DataBindings.Add(new Binding("Text", this.row, "CustomerAddress"));
this.telTextBox.DataBindings.Add(new Binding("Text", this.row, "tel"));

}

private void UpdateClose_Click(object sender, EventArgs e)
{
// フォームを閉じる
this.Close();
}

private void Form2_FormClosing(object sender, FormClosingEventArgs e)
{
// ナビゲーターのセーブアイコンをクリックして、プロパティのNameを参照
addresstureTable_1BindingNavigatorSaveItem_Click(null, null);
}
}
}
引用返信 編集キー/
■58502 / inTopicNo.2)  Re[1]: データグリッドビューの再表示
□投稿者/ しるふぃん (11回)-(2011/04/09(Sat) 16:44:49)
No58500 (しぃーちゃん さん) に返信

あくまでもForm2で変更したデータは、データベース上では更新されていますが
Form1では再取得しないかぎり表示はしてくれません。

そのための処理はというと、最初にデータを取得しているはずなのでそれを参考にすれば
できると思います^^



引用返信 編集キー/
■58503 / inTopicNo.3)  Re[2]: データグリッドビューの再表示
□投稿者/ しぃーちゃん (2回)-(2011/04/09(Sat) 18:23:09)
No58502 (しるふぃん さん) に返信
しるふぃんさん、アドバイスありがとうございます。

Form2で編集してセーブアイコンを押したら、Form2の画面が閉じForm1がそのまま更新されずに再取得もされないのですが、
Form1での再取得とはどのように再取得をさせてあげればよいのでしょうか?

私の以下のコードですと、Form2側にて編集されたデータをセーブして尚且つForm1のロードイベントを走らせているつもりなのですが、
どうしてもForm1に画面が遷移するときに再取得が実現できなくて・・m(_ _)m
// セーブアイコン押下処理
private void addresstureTable_1BindingNavigatorSaveItem_Click(object sender, EventArgs e)
{
this.Validate();
Form1 addForm = new Form1();
addForm.UpdateData();
addForm.reLoad();
}


何か思いつくコードってありますでしょうか?

度々ですがよろしくお願いしますm(_ _)m




引用返信 編集キー/
■58504 / inTopicNo.4)  Re[3]: データグリッドビューの再表示
□投稿者/ パイン (1回)-(2011/04/10(Sun) 08:42:55)
No58503 (しぃーちゃん さん) に返信
> // セーブアイコン押下処理
> private void addresstureTable_1BindingNavigatorSaveItem_Click(object sender, EventArgs e)
> {
> this.Validate();
> Form1 addForm = new Form1();
> addForm.UpdateData();
> addForm.reLoad();
> }
>
新たにForm1のインスタンスを作成していますが、
この新しいForm1で取得されるデータは更新前のデータなのでは?
そもそも、Form1→Form2→New Form1でのデータ参照がどのようになっているのか分かりませんが。
引用返信 編集キー/
■58505 / inTopicNo.5)  Re[4]: データグリッドビューの再表示
□投稿者/ しぃーちゃん (3回)-(2011/04/10(Sun) 12:35:51)
No58504 (パイン さん) に返信
パインさん、貴重なアドバイスをしていただきましてありがとうございます。
確かにForm1で取得されるデータは更新前のデータを再ロードされていますね。
>>// セーブアイコン押下処理
>>private void addresstureTable_1BindingNavigatorSaveItem_Click(object sender, EventArgs e)
>>{
>>this.Validate();
>>Form1 addForm = new Form1();
>>addForm.UpdateData();
>>addForm.reLoad();
>>}
>>
データを編集して、更新すればデータグリッドビューに再表示されるものだと思っていました。。
どのように更新後のデータを表示すれば良いのか私のとっては難しいのですが、
実現できるようにもう少し頑張ってみます。
引用返信 編集キー/
■58508 / inTopicNo.6)  Re[1]: データグリッドビューの再表示
□投稿者/ shu (614回)-(2011/04/10(Sun) 21:33:28)
No58500 (しぃーちゃん さん) に返信

BindingSourceならEndEditを実行したときに一覧フォームに反映されるのですが、
DataRowViewの更新だとBindingSourceを取得しなおす必要があるかと思います。

BindingSource.CurrentItem
BindingSource.ResetBinding

辺りを実行すると出来るかもしれません。
引用返信 編集キー/
■58512 / inTopicNo.7)  Re[2]: データグリッドビューの再表示
□投稿者/ しぃーちゃん (4回)-(2011/04/11(Mon) 14:07:37)
No58508 (shu さん) に返信
shuさん、たびたび丁寧なアドバイスをしていただきましてありがとうございます!
アドバイスいただきました下記の考えで実行してみたいと思いますが、
なかなか私の実力では難しいのか、具体的にはForm1のreLoad関数内のコードを変えてあげればよろしいのでしょうか?

> BindingSourceならEndEditを実行したときに一覧フォームに反映されるのですが、
> DataRowViewの更新だとBindingSourceを取得しなおす必要があるかと思います。
>
> BindingSource.CurrentItem
> BindingSource.ResetBinding
>
> 辺りを実行すると出来るかもしれません。

Form1のコード
public void reLoad()
{
this.addresstureTable_1TableAdapter.Fill(this.addresstureWorksDataSet.AddresstureTable_1);
}


引用返信 編集キー/
■58513 / inTopicNo.8)  Re[3]: データグリッドビューの再表示
□投稿者/ shu (616回)-(2011/04/11(Mon) 14:35:15)
No58512 (しぃーちゃん さん) に返信

> DialogResult tret = tForm.ShowDialog();
Form1のこの後で再読込が必要です。
その処理の後tForm.Dispose()を実行した方がいいです。

> Form1 addForm = new Form1();
> addForm.UpdateData();
> addForm.reLoad();
インスタンス作っても処理をしても表示をしていないので意味がないです。
既にあるForm1に対し処理を行わなければ駄目です。上の記述の再読込を実装すれば不要です。


引用返信 編集キー/
■58514 / inTopicNo.9)  Re[3]: データグリッドビューの再表示
□投稿者/ しるふぃん (12回)-(2011/04/11(Mon) 17:37:59)
No58512 (しぃーちゃん さん) に返信
お返事遅くなり申し訳ありません。

shuさんのおっしゃるとおり、既にあるForm1のDataGridViewに対して処理を行わないと更新されません。

再読み込みのタイミングはshuさんのタイミングでいいと思います。
引用返信 編集キー/
■58515 / inTopicNo.10)  Re[4]: データグリッドビューの再表示
□投稿者/ しぃーちゃん (5回)-(2011/04/12(Tue) 10:06:39)
No58514 (しるふぃん さん) に返信
しるふぃんさん、お忙しい中アドバイスを頂きましてありがとうございました!
shuさんのアドバイス通りに実行してみたら、実現できました。

再読み込みのタイミングがいまいちわからなくて、
私の理解力では、まだまだ流れを理解できてないようなので、
アルゴリズムの勉強をし直す必要がありそうですね(>_< )
引用返信 編集キー/
■58516 / inTopicNo.11)  Re[4]: データグリッドビューの再表示
□投稿者/ しぃーちゃん (6回)-(2011/04/12(Tue) 10:18:05)
No58513 (shu さん) に返信
shuさん、いつも丁寧で的確なアドバイスを頂きましてありがとうございましたm(_ _)m

結果的に、shuさんに全て任せっきりになってしまいましたが、
本当にお世話になり助かりました!
再読み込みのタイミングがいまいちわからなくて、
私の理解力では、まだまだ流れを理解できてないようなので、
アルゴリズムの勉強をし直す必要がありそうですね(>_< )

言語だけではなく、どこにどのようにするかの流れが今回のことで、
凄く勉強になりましたm(_ _)m

リソースの開放も全く考えもなく、また一つ一つ勉強になりました。

今回も、またお世話になってしまいましたが本当にありがとうございました!
解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -