- PR -

DataTableのRowStateについて

1
投稿者投稿内容
どら
会議室デビュー日: 2006/03/14
投稿数: 4
投稿日時: 2006-03-14 17:20
はじめまして。どらと申します。
いつも参考にさせていただいています。
今回はどうしても解決できないので
どうか、ご教授お願いいたします。

DBへの登録、更新を行うマスタメンテ画面を作成中なのですが
その画面で、表示しているデータセットの値に
なにか変更が加えられた場合
画面を閉じようとすると、確認メッセージが表示されるように
なっています。
そこでRowStateを取得し"Modified"の場合は、変更前の内容と比較し
メッセージを出力しているのですが
同じことを行った場合に、
「閉じる」ボタンを押下した場合は、"Modified"が取得できるのですが
右上にある「×ボタン」を押下した場合は、"Unchanged"が
取得されてしまいます。
判定処理自体は、
"OnClosing"をオーバーライドした処理の中で行っているので
どちらの場合も同じ処理を通ります。

この「×ボタン」を押下した場合にも"Modified"が取得したいのです。
長々と分かりづらい説明で申し訳ありません。
宜しくお願いいたします。

開発環境
*******************
<開発環境>
・OS:Windows XP Professional
・開発言語:Visual Studio .NET 2003(C#.NET)
*******************


[ メッセージ編集済み 編集者: どら 編集日時 2006-03-14 17:27 ]
囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2006-03-14 17:30
「閉じる」ボタンを押した時に、ただ閉じるだけではなく、その前に何かやっていますよね?
その処理を OnClosing に入れてやって下さい。
_________________
囚人のジレンマな日々
どら
会議室デビュー日: 2006/03/14
投稿数: 4
投稿日時: 2006-03-14 17:50
早速の返答ありがとうございます。

閉じる処理の中身なのですが
処理はすべて"OnClosing"のほうへ移してあるのです。

省略いたしましたが、以下のような処理を行っています。

//--------------------------------------------------------------------------
/// F7クリック処理
//--------------------------------------------------------------------------
private void F07_Click(object sender, EventArgs e)
{
// 画面を閉じる
this.Close();
}

//-------------------------------------------------------------------------
///画面クローズ処理
//--------------------------------------------------------------------------
protected override void OnClosing(CancelEventArgs e)
{
// グリッドの内容に変更がある場合、警告メッセージを出す
for (dataCount = 0; dataCount < グリッド数; dataCount++)
{
if (グリッド名.DataTable.Rows[dataCount].RowState != DataRowState.Unchanged)
{
//内容比較処理



// 変更がある場合はフラグをセットしループ終了
}
}

// 変更フラグが設定されている場合はメッセージ出力処理



{
// 「いいえ」を押された場合は以降の処理を行わない
e.Cancel = true;
this.TopControl.Select();
return;
}
}

試してみたところ、「×ボタン」を押下した場合には
データセット[〜〜DataRowVersion.Current]の値も
現在表示されている値が取得できませんでした。

わかりにくい説明で申し訳ありません。
宜しくお願いいたします。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-03-14 18:06
引用:

どらさんの書き込み (2006-03-14 17:50) より:

試してみたところ、「×ボタン」を押下した場合には
データセット[〜〜DataRowVersion.Current]の値も
現在表示されている値が取得できませんでした。


え?
では、Closing イベントで Cancel した後は取得できますか?

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
どら
会議室デビュー日: 2006/03/14
投稿数: 4
投稿日時: 2006-03-14 18:18
Closing イベントで Cancel した後は
「閉じるボタン」押下後(F07_Click処理後)の場合は
取得できます。
しかし「×ボタン」押下でClosing イベントで
Cancel 直後に止めてみましたが
取得できていませんでした。

一度でも「閉じるボタン」を押下した後の場合は
その状態のままのデータセットの中身だけが参照できるのですが
やはり今の状態は取得できません。

普通は見れるはずなのでしょうか。
ソースの書き方が悪いと、こういう現象が起きるものですか?

宜しくお願いいたします。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2006-03-15 21:44
ってか、OnClosing をオーバーライドする必要はないですよね?

 命名規則による、メソッドが行うべきことを行ってください。OnClosing メソッドがおこなうべきなのは、Closing イベントを発生させること(定義されているデリゲートを呼び出すこと)です。それ以外の、「フォームが閉じようとしているときの処理」は、Closing イベントのハンドラに持たせてください。

おそらく、
protected override void OnClosing(CancelEventArgs e)
  ...
  // 「いいえ」を押された場合は以降の処理を行わない
  e.Cancel = true;
  ...
}
この e.Cancel = true は、仕様通りに機能していますが、期待通りに機能していません。


 今修正中のプログラムを見て感じていることですが、もしかしてあるインスタンスが励起するイベントを、そのインスタンス自身が受け取ってはいけない、とか、思っていませんか?そんなことはないですよ。

〆 written by Jitta@わんくま同盟 on 2006/03/15
どら
会議室デビュー日: 2006/03/14
投稿数: 4
投稿日時: 2006-03-16 19:03
お世話になっております。
初心者の質問に答えていただきありがたいです。

[quote]
Jittaさんの書き込み (2006-03-15 21:44) より:
================================================
 今修正中のプログラムを見て感じていることですが、もしかしてあるインスタンスが励起するイベントを、そのインスタンス自身が受け取ってはいけない、とか、思っていませんか?そんなことはないですよ。
================================================
まさに、そう思いこんでました。
書いていただいた意味を理解するのにも時間がかかってしまいました。
メソッドのそれぞれについて、ちゃんと読んで理解してから
コーディングを進めるべきでした。

ただ、Closingイベントを使用し、やってみましたが
結果には変わりはありませんでした。
まだまだ勉強不足です。
まだ、色々やり方を変えてみようと思います。

ご指摘ありがとうございます!
1

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