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

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

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

Re[6]: DataGridViewにて背景色が変わりません。バグ??


(過去ログ 15 を表示中)

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

■5245 / inTopicNo.1)  DataGridViewにて背景色が変わりません。バグ??
  
□投稿者/ ばこま (10回)-(2007/07/08(Sun) 22:53:33)
ばこま さんの Web サイト

分類:[.NET 全般] 

環境はVS2005sp1 C# OSはVistaです。

DataGridViewにて特定のセルの背景色を変更したいのですが
DataGridViewがタブで隠れている状態でデータをセットし、指定したセルの背景色を変更しても反映されない現象が出ています。
フォームを開き、DataGridViewが配置してあるタブを開き、グリッドを一度でも画面に表示してしまうと、それ以降は何故か現象は起きません。

セルの背景色変更はこのようにしています
//背景色変更条件
if (条件)
{
DataGridView[カラム, 行].Style.BackColor = Color.FromArgb(0, 0, 255);
}


Paintイベント等で無理矢理背景色変えても良いのですが、何か良い対処法は無いでしょうか?
よろしくお願いします。

引用返信 編集キー/
■5246 / inTopicNo.2)  Re[1]: DataGridViewにて背景色が変わりません。バグ??
□投稿者/ れい (2回)-(2007/07/09(Mon) 05:09:38)
No5245 (ばこま さん) に返信
> DataGridViewがタブで隠れている状態でデータをセットし、指定したセルの背景色を変更しても反映されない現象が出ています。
> Paintイベント等で無理矢理背景色変えても良いのですが、何か良い対処法は無いでしょうか?

TabControlの中のコントロールは、
処理をなるべく軽くするために、
実際に表示されるまで作成されません。

必要になったときに動的に作成されるようなコントロールを強制的に作成するには、
Control.CreateControl等を使うのが普通です。

ですが、TabControlの場合、コントロールは中のTabPageに所属するので、これが作成されないと
DataGridViewをCreateControlしても無効になります。

しかし、TabPage.CreateControlはなぜかうまくいきません。
どこかに仕掛けがあるようです(Control.CreateControl内だと思われる)が、
詳細は知りません。

私の知っている最良の解決策は、
TabPage.Visible=true
としてやる方法です。
こうすると、TabPageが表示されていなくても、
なぜかTabPageが作成されます。

TabPageが作成されるため、多少遅くなります。
DataGridViewの所属するTabPageに対してだけ行うといいでしょう。

SuspendLayoutした上で一度タブを切り替えるといった方法もありますが、
こちらのほうがだいぶ遅いので、あまりお勧めしません。

引用返信 編集キー/
■5252 / inTopicNo.3)  Re[2]: DataGridViewにて背景色が変わりません。バグ??
□投稿者/ ばこま (11回)-(2007/07/09(Mon) 11:45:44)
ばこま さんの Web サイト
れいさん返信ありがとうございます。

以下の処理で改善されました。
しかも、タブページがキャッシュされるので初回動作も軽快です。
ありがとうございました。

        private void Form_VisibleChanged(object sender, EventArgs e)
        {
            //フォーム起動時、表示時の場合
            if (this.Visible == true)
            {
                foreach (TabPage tpg in TabControl.TabPages)
                {
                    tpg.Show();
                }
                //フォーム描画
                this.Show();

                //フォーム描画が終わるまで待機
                Application.DoEvents();
        //データ読み込み
            …
            }
        }
 

解決済み
引用返信 編集キー/
■5264 / inTopicNo.4)  Re[3]: DataGridViewにて背景色が変わりません。バグ??
□投稿者/ れい (3回)-(2007/07/09(Mon) 14:00:10)
No5252 (ばこま さん) に返信
> れいさん返信ありがとうございます。
> 以下の処理で改善されました。
> しかも、タブページがキャッシュされるので初回動作も軽快です。

他になにか特殊なことをやっているのでしょうか?
そうでないのであればこのコードは無駄や危険が多いので
間違ったコードと言えます。

ページをはじめて切り替えたときは軽いかもしれませんが、
そもそもフォームを表示するときが重くなってしまいます。

また、VisibleChangedの中でDoEvents()は思わぬ副作用を生みますので危険です。

VisibleChangedの中でthis.Showも普通やりません。

私がよくやるのは、
Form_Loadで1回だけDataGridViewの存在するTabPageに対して
Visible=true
とする方法です。

これですと危険も無駄もありません。

引用返信 編集キー/
■5281 / inTopicNo.5)  Re[4]: DataGridViewにて背景色が変わりません。バグ??
□投稿者/ ばこま (12回)-(2007/07/09(Mon) 15:29:51)
ばこま さんの Web サイト
ご指摘ありがとうございます。
完全独学&初心者なのでやっぱり変ですね(苦笑

VB6と比べるとコントロール描画が全体的に重いので色々変なことしてます…
このフォーム自体はシングルトンで、メインメニュー起動時にこっそりインスタンス化を行い
メニューから呼び出した時に即時に立ち上がるようにしています。
閉じる時も、CloseせずにHideで隠すだけにして、次回呼び出し時も瞬時に表示されます。

//フォーム描画
this.Show();
//フォーム描画が終わるまで待機
Application.DoEvents();

これは起動時にコンボボックスにデータを再セットしたり、色々処理を行っている為
完全に処理が終わってからしか画面が描画されず、視覚的に重い感じがしたのでこのような処理をしています。

無理矢理再描画して描画が終わるまで待機すると画面が瞬時に表示されるので
視覚的に早くなりました。実際処理時間は変わりませんが…
シングルスレッドなので大丈夫だろう、と勝手に思い込んでますが
やはりDoEventsは危険なのでしょうか??
引用返信 編集キー/
■5283 / inTopicNo.6)  Re[5]: DataGridViewにて背景色が変わりません。バグ??
□投稿者/ れい (4回)-(2007/07/09(Mon) 16:09:52)
> 完全独学&初心者なのでやっぱり変ですね(苦笑

私も完全独学です。
私のコードも変かもしれません。

> VB6と比べるとコントロール描画が全体的に重いので色々変なことしてます…
> このフォーム自体はシングルトンで、メインメニュー起動時にこっそりインスタンス化を行い
> メニューから呼び出した時に即時に立ち上がるようにしています。
> 閉じる時も、CloseせずにHideで隠すだけにして、次回呼び出し時も瞬時に表示されます。

ならなおさらForm.LoadイベントでTabPageをVisibleにするといいのではないでしょうか?

> シングルスレッドなので大丈夫だろう、と勝手に思い込んでますが
> やはりDoEventsは危険なのでしょうか??

もともとControlは作成元スレッド以外では扱えませんので、
スレッドの問題ではありません。
問題はメッセージループが回り、再入することです。
たとえばDoEventsを呼んでる最中にどこかの関数でVisible=falseとなったら変なことになります。
きちんと理解した上で使えば危険ということはありません。

コーディングの流儀等を押し付ける気はありません。
あまりに処理時間がもったいないコードだったので、
私の投稿がわかりにくかったのかと思っただけです。

5246で説明したような原因で不具合がありますので、
どこかで一回TabPage.Visible=trueと書けばそれ以降は大丈夫になります。
なるべく早いうちがいいはずなので、
だったら当然、Form.Loadイベントに書くのが普通でしょう。

と、ただそれだけのことです。

フォームをHideにしたりして高速化する方法はあちこちに例があると思いますので
そちらをご参考にしてください。

引用返信 編集キー/
■5285 / inTopicNo.7)  Re[6]: DataGridViewにて背景色が変わりません。バグ??
□投稿者/ ばこま (13回)-(2007/07/09(Mon) 17:06:27)
ばこま さんの Web サイト
返信ありがとうございます。

今更ですが、TabPageにVisibleプロパティ無いと思ってました…
隠しプロパティみたいな感じなんですね。思いっきり先入観で申し訳ないです。

foreach (TabPage tpg in TabControl.TabPages)
FormLoadイベントにTabPage.Showを行っても効果が無かったのでVisibleChangedに書いていたのですが
FormLoadイベントにTabPage.Visibleで行けました。

問題のコードですが
private void Form_VisibleChanged(object sender, EventArgs e)
{
//フォーム起動時、表示時の場合
if (this.Visible == true)
{
this.Visible = true;
Application.DoEvents();

//読み込み処理

}
}
最終的にこんな感じで行こうと思います。
this.Visible = trueは、これをしないとコントロールのフォーカスが抜けてしまう現象が起こります…
DoEventsは視覚的に重く感じるのでどうしても使わないとダメみたいです。




引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -