- PR -

DataGridViewのNotifyCurrentCellDirty()と、RowHeaderに表示されるペンマーク(?)について

投稿者投稿内容
@TK
常連さん
会議室デビュー日: 2004/11/10
投稿数: 39
投稿日時: 2007-08-21 12:37
いつもお世話になっております。
お力を拝借したく投稿させていただきました。
既出でしたらお許し下さい。

環境は下記になります。
VS2005
C#
Win

DataGridViewのある現象に悩まされております。

DataGridViewのCellDoubleClickイベント内で下記のような事を行います。
(カラム[column1]はReadOnly)


if (e.ColumnIndex == column1.Index)
{
 dataGridView1.CurrentCell.Value = "hoge";
 dataGridView1.NotifyCurrentCellDirty(true);
}


すると、ダブルクリックをしたCellの値が"hoge"になります。
かつ、そのCellが最終行であれば新規行が一行あらたに追加されます。
ここまでは望んだ動きです。

問題は、これだけではCellの編集がコミットされていないのかダブルクリック後RowHeaderにCell編集中を表すペンマークが表示されたまま残ってしまうことです。
他の編集可能なセルを選編集モードにしその編集モードを解除するまでこのペンマークは表示されたままです。

編集をコミットし、このペンマークを解除する方法をご教示いただきたく投稿いたしました。


現象を中心に記述しましたが、下記にやりたい事を簡単に書かせていただきます。

・やりたい事
DataGridViewの特定のCellをダブルクリックすると、他のダイアログが開く。
そのダイアログで選択されたアイテム(文字列だったり整数だったり)を、元のDataGridViewの当該Cellに表示する。
・要件
そのCellはReadOnly(ユーザーに直接入力させない)。
最終行でこの作業を行った場合、自動で新規行が追加されること。
DataGridViewはデータバインドされる


お手数おかけしますが、ご助言いただけたら幸いです。
以上、長文失礼いたしました。



[ メッセージ編集済み 編集者: @TK 編集日時 2007-08-21 12:39 ]
@TK
常連さん
会議室デビュー日: 2004/11/10
投稿数: 39
投稿日時: 2007-08-21 14:24
自己レスです。

下記のようにBeginEdit()とEndEdit()でくくってみましたが、結果は変わりませんでした。


if (e.ColumnIndex == column1.Index)
{
 dataGridView1.BeginEdit(false);
 dataGridView1.CurrentCell.Value = "hoge";
 dataGridView1.NotifyCurrentCellDirty(true);
 dataGridView1.EndEdit();
}


NotifyCurrentCellDirty()を使わなければペンマークの問題は発生しません。
しかし、それでは最終行への更新が行われても新規行が追加されません。

何か根本的なものを見落としているような気が・・・


要件を満たせる他の方法も検討していこうかと思っております。
アイデア・指針等いただけたら幸いです。
隣の古柴
ベテラン
会議室デビュー日: 2004/06/04
投稿数: 94
投稿日時: 2007-08-21 15:06
自分は使ったことがないのでハズしている可能性大であることを最初にお断り
しておきます。

msdn2.microsoft.com/ja-jp/library/system.windows.forms.datagridview.notifycurrentcelldirty(vs.80).aspx

を見ますと「セルにコミットされていない変更があることを示す場合は true」
とあります。

メソッド見るとCommitEditってのがあります。

この辺りではないのでしょうか?


隣の古柴
ベテラン
会議室デビュー日: 2004/06/04
投稿数: 94
投稿日時: 2007-08-21 15:16
自レスです。ハズしてました。

EndEditは「コミットして終了」とありますね(汗)

@TK
常連さん
会議室デビュー日: 2004/11/10
投稿数: 39
投稿日時: 2007-08-21 15:22
隣の古柴様

ご回答をありがとうございます。
CommitEditの件、私ももしやと思い試してみましたが駄目なようですね。
しかし、CommitEditとは期待させる名前です(笑


ちなみに下記も一通り試しておりますが、結果は変わりません。

UpdateCellValue()
Update()
Refresh()


以上、また宜しくお願いします。
@TK
常連さん
会議室デビュー日: 2004/11/10
投稿数: 39
投稿日時: 2007-08-21 18:03
自己レスです。

現在、いろいろと試行錯誤中。
現在考えているのは、NotifyCurrentCellDirty()を使わない方法です。

DataGridViewはバインドして使用する予定なのでDataSource(DataTable)に直接行を追加するなどして、要件の「最終行でこの作業を行った場合、自動で新規行が追加されること。」を満たせないかと考えております。

そこで下記のようなコードを試してみました。
同じくDataGridViewのCellDoubleClickイベント内です。


if (e.ColumnIndex == column1.Index)
{
 DataTable dt = (DataTable)dataGridView1.DataSource;
 DataRow dr = dt.NewRow();
 dr[0] = "hoge";
 dt.Rows.Add(dr);
}


すると、DataGridViewには二行追加されてしまうという現象が起きてしまいました。
・・・なんだか問題を増やしそうなので、この方法はもう少し調査・検討してみる必要がありそうです。


以上です。
Ahf
大ベテラン
会議室デビュー日: 2006/08/16
投稿数: 172
投稿日時: 2007-08-21 23:05
バインディング状態で確認はしてないですがアンバウンドな状態の場合でしたら、
コード:
If (e.ColumnIndex == column1.Index)
{ 
  If (e.RowIndex == Me.dataGridView1.NewRowIndex) 
  {
    Me.dataGridView1.Rows.Add;
  }
  Me.Rows(e.RowIndex).Cells(e.ColumnIndex).Value = "hoge";
}


でいけますので
コード:
If (e.ColumnIndex == column1.Index)
{ 
  If (e.RowIndex == Me.dataGridView1.NewRowIndex) 
  {
   DataTable dt = (DataTable)dataGridView1.DataSource; 
   DataRow dr = dt.NewRow(); 
   dt.Rows.Add(dr); 
  }
  Me.Rows(e.RowIndex).Cells(e.ColumnIndex).Value = "hoge";
}


とかでいけそうな気がしているんですよね。

# 普段VB使いなので書き方が間違っていたらごめんなさい
隣の古柴
ベテラン
会議室デビュー日: 2004/06/04
投稿数: 94
投稿日時: 2007-08-22 10:21
なんかよく分からないのですが。。。

>・要件
>そのCellはReadOnly(ユーザーに直接入力させない)。

入力させない、ということは変更できないのではないでしょうか?
変更できないということはコミット以前の問題???

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