プロが教える店舗&オフィスのセキュリティ対策術

お世話になります。

初歩的な質問で大変恐縮です。

Visual C# 2010 で開発しているのですが、

DataGridViewクラスを継承した独自クラスを定義し、
セルの編集状態でEnterキーを押下した場合、
次の行のセルにフォーカスを移動する処理を記述しています。 ・・・・ (1)
例: this.CurrentCell = this[col, row];

上記(1)とは別のcsファイルに、
上記(1)を親クラスとしてDataGridViewのインスタンスを生成しています。
また、このGridViewのCellValidatingイベント内では、セルに入力された値の
エラーチェック処理を行い、エラーの場合は e.Cancel = true; を設定しています。 ・・・・ (2)

実際にDataGridViewのセルに値を入力し、編集状態でEnterキーを押下すると、
(1) → (2) → (1) の順序で処理が実行され、最後の(1)の処理中に下記エラーが出力されます。

「セル値の変更をコミットまたは中止できないため、操作は成功しませんでした。」

上記(2)の処理後に何かしらフラグをたてて、
エラー発生直前にフラグ内容を判断してエラーを回避しようと試みましたが、
条件文を無視して(1)のフォーカス移動処理が強制実行され、同一エラーが出力されます。

なぜ、他の処理を無視して(1)が強制実行されるのかが理解できずに困っています。

どなたかご存じの方がいらっしゃいましたら、ご教授願えますでしょうか?
よろしくお願いいたします。

A 回答 (3件)

当方の実験したケースは



class DBGviewBase : DataGridView ... (1)

class DBGViewMain : DBGVIewBase ... (2)

として DBGViewBaseの OnCellEndEditで 質問のコードを少し改変したもの
this.CurrenCell = this[ColIndex, RowIndex];

DBGViewMainおよびフォームに配置したコントロールの OnValidatingイベントで

// DBGViewMainクラスのみ
base.OnValidate(e);
if ( e.ColumnIndex == 0 )
{
  int nID = -1;
  if ( !Int32.TryParse( e.FormattedValue.ToString(), out nID ) )
  {
    e.Cancel = true;
  }
}

といった内容ですよ
    • good
    • 0

用語の使い方が滅茶苦茶なんでよく分からないけど、



>上記(1)を親クラスとしてDataGridViewのインスタンスを生成しています。

>(1)にはフォームなどのデザインはなく、処理のみです。
>(2)は、実際にフォームやDataGridViewを配置しているファイルになります。

このあたりを言葉通りに捉えれば、インスタンス2個作って
継承してるから勝手に連携されると思ってる節がありますが。

画面上に DataGridView1 と DataGridView2 を貼り付けて、
勝手に連携される事がないのと同じく、インスタンスが
別なら何ら関係性はありません。それぞれで独立して
処理されます。
そこはOK?
    • good
    • 0

(1)のコードはどこのイベントに書かれているのでしょう


当方で実験すると CellValidatingが先に実行されますが

派生クラスのOnValidatingメソッド > Form1に書いたハンドラ >
e.CancelがFalseならば 元クラスのOnCellEditEndメソッド
と順で実行されますよ …

この回答への補足

ご回答ありがとうございます。

補足させていただきます。

(1)のコードは、
(2)とは別クラスに定義している内容になります。
(別途、新規作成したcsファイルで定義したクラス内に(1)の内容を記述しています)

(1)にはフォームなどのデザインはなく、処理のみです。
(2)は、実際にフォームやDataGridViewを配置しているファイルになります。

(2)のcsファイルの関連ファイルxxx.designers.cs内に以下の記述をしています。

(xxx.designers.cs)
namespace WindowsFormsApplication1
{
partial class passSaleModForm
{
private PFDataGridView meisaiDataGridView;
private xxxxxx xxxxxx;
private yyyyyy yyyyyy;

}
}

補足日時:2011/12/21 09:32
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています