人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

[C#]DataGridViewで編集可能なCheckBoxのセルにフォーカスがあるとチェックの状態が正しく描画されません。

以下の表の場合に出席欄(CheckBox)にフォーカスがあるとコード上からtrue/falseを設定してもすぐに画面に反映されません。
フォーカスを漢字氏名欄に移すと反映されます。

|*出席|*漢字氏名|
|□|清水佐紀|

・DataGridView.SelectionMode = FullRowSelect
・出席列.ReadOnly = false
・漢字氏名列.ReadOnly = true

出席列を編集不可にするとコード上からのtrue/falseの設定が画面にすぐ反映されます。
何か解決策はないでしょうか?

http://d.hatena.ne.jp/afternoontea/20060817

●質問者: afternoontea
●カテゴリ:コンピュータ
✍キーワード:C# コード セル フォーカス 清水佐紀
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● freemann
●0ポイント

DataGridViewはVS2005からだったとおもうので手元にないのですが、

Refreshメソッドを使ってはどうですか?

System.Windows.Forms.Controlクラスには定義されてるので、あるとおもうのですが。

http://q.hatena.ne.jp/1155835771

◎質問者からの返答

残念ながらRefresh()は効果がありません。

DataGridのときはそれでうまくいったはずなのですが。

private void contextMenuAttendanceMenuCheck_Click(object sender, EventArgs e)
{
 Control rightClickOn = contextMenuAttendance.SourceControl;

 if (rightClickOn == berryzDataGridView)
 {
 foreach (DataGridViewRow selectedRow in berryzDataGridView.SelectedRows)
 {
 selectedRow.Cells[berryzAttendanceColumn.Name].Value = true;
 }

 berryzDataGridView.Refresh();
 }
 else if (rightClickOn == cuteDataGridView)
 {
 foreach (DataGridViewRow selectedRow in cuteDataGridView.SelectedRows)
 {
 selectedRow.Cells[cuteAttendanceColumn.Name].Value = true;
 }
 }
}

2 ● freemann
●0ポイント

checkboxからフォーカスが移ると正常に表示されるのであれば、DataGridViewにTabを送ってフォーカスを強制的に移動させてはどうですか?

http://q.hatena.ne.jp/1155835771


3 ● freemann
●100ポイント

色々調べてみたのですが、DataGrid系統には、グリッド内のデータをコードで変えるときにBeginEdit()とEndEditで囲むようです。

なので、上記のソースで

foreach (DataGridViewRow selectedRow in berryzDataGridView.SelectedRows)

{

selectedRow.Cells[berryzAttendanceColumn.Name].Value = true;

}

foreach (DataGridViewRow selectedRow in berryzDataGridView.SelectedRows)

{

berryzDataGridView.BeginEdit("現在カラム","現在行");

selectedRow.Cells[berryzAttendanceColumn.Name].Value = true;

berryzDataGridView.EndEdit("現在カラム","現在行",true);

}

ダミー

http://q.hatena.ne.jp/1155835771

◎質問者からの返答

http://msdn2.microsoft.com/ja-jp/library/system.windows.form...

DataGridView#BeginEdit(bool selectAll)でうまくできました。

foreach (DataGridViewRow selectedRow in berryzDataGridView.SelectedRows)
{
 berryzDataGridView.BeginEdit(false);
 selectedRow.Cells[berryzAttendanceColumn.Name].Value = true;
 berryzDataGridView.EndEdit();
}

http://msdn2.microsoft.com/ja-JP/library/system.windows.form...

それから、DataGridView#CellBeginEdit(),CellEndEdit()で確認してみましたが、フォーカスがあたると編集状態になるようです。

ありがとうございました。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ