質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.49%

フォームアプリケーションでボタンの色が変わらない

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 780

score 21

タイトルの通り、フォームアプリケーション内で、ボタンの色を変更する関数があります。
その関数で、ボタンのBackCollarが変更できません。
具体的には、
アプリを起動してから、一回目の操作では色が変わらないのですが、二回目以降は色が変わります。
また、デバックモードでは一回目も二回目以降も同様に色が変わるのですが、
インストーラーを作成して、タブレットにインストールしたのちにアプリケーションを立ち上げて実行すると、色が変わらない問題が起きます。

対策は、
関数の最後に、Refresh()、Application.DoEvents()を追加しましたが、色の変更はできませんでした。
また、関数を使わずにボタンの色の変更を書きましたが、それでも変更できませんでした。

以下にボタンの色の変更をする関数を示します。

namespace fghlib
{
    public partial class Form020 : Form
    {
        public Form020(Form000 form)
        {
            InitializeComponent();
        }

        private void Form020_Load(object sender, EventArgs e)
        {

               //データベースからデータの取得 


            Btn001.UseVisualStyleBackColor = false;
            Btn002.BackColor = Btn005.BackColor;
            Btn002.UseVisualStyleBackColor = true;
            Btn003.BackColor = Btn005.BackColor;
            Btn003.UseVisualStyleBackColor = true;
            DataGridViewSort();
            DataGridView1.CurrentCell = null;
        }

        private void Btn001_Click(object sender, EventArgs e)
        {
              //データベースからデータの取得


                    SelectedRows.Clear();
                    DataGridView1.CurrentCell = null;
                    DataGridViewSort();
                    Btn001Color();
                    this.Invalidate();
                    Btn002.Enabled = true;
                    Btn003.Enabled = true;
        }

       private void Btn002_Click(object sender, EventArgs e)
        {


               //データベースからデータの取得


                DataGridView1.DataSource = dt;
                DataGridView1.CurrentCell = null;
                SelectedRows.Clear();
                DataGridViewSort();
                Btn001Color();
        }

        private void Btn003_Click(object sender, EventArgs e)
        {

                  //データベースからデータの取得



                DataGridView1.DataSource = dt;
                DataGridView1.CurrentCell = null;
                SelectedRows.Clear();
                DataGridViewSort();
                Btn001Color();
        }


        private void Btn001Color()
        {

     //データベースからデータの取得


            if (dt.Rows.Count > 0)
            {
                Btn001.BackColor = Color.LawnGreen;
                foreach (DataGridViewRow r in DataGridView1.Rows)
                {
                    if (r.Cells["kaisi"].Value.ToString() != "" && r.Cells["owari"].Value.ToString() == "")
                    {
                        r.Cells["joutai"].Style.BackColor = Color.LawnGreen;
                    }
                }
            }
            else
            {
                Btn001.BackColor = Btn005.BackColor;
                Btn001.UseVisualStyleBackColor = false;

                foreach (DataGridViewRow r in DataGridView1.Rows)
                {
                    r.Cells["joutai"].Style.BackColor = Color.White;
                }
            }
            Btn001.Refresh();
            DataGridView1.Refresh();
            Application.DoEvents();// 色がつかない対策
        }
    }
}

データグリッドビューから取得したデータをもとに、色の変更の可否を判断します。
ボタンの色の変更と同時にデータグリッドビュー内の色の変更も行っています。

以上の関数はデータベースがに変更があったときに呼び出します。
ソフト上で複数のボタンがあり、ボタン1つ1つでデータベースへ行の追加や削除ができるよう処理が異なります。
そのため、逐一ボタンの処理が終わった後に関数を呼び出し、対象の行があればBtn001の色が変わるようになっています。

よろしくお願いいたします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • namekuhito

    2020/07/28 14:55

    データグリッドビュー、ボタンも色が変わっていない状態でも押せば反応はするので、おっしゃる通り再描画が原因だと思います。
    this.Refresh()を今確認したのですが、できませんでした。
    Application.DoEvents();がかなり強いと思っていたので、これで描画をしてくれると思たのですが。
    メッセージボックスと同じようにいったん止めようと思い、スリープも入れてみたのですがこれもダメでした。ほかの、再描画の方法を探したほうがいいでしょうか?

    キャンセル

  • propg

    2020/07/28 15:22

    なにか質問に書かれていないコード部分に、描画を抑制するようなロジックがあるとか。

    いっそのことイベント自体BackgroundWorkerにしてしまうとか。

    キャンセル

  • namekuhito

    2020/07/28 15:32

    データベースからの読み取りで、処理が重いと思うのでそうしてみます。
    ありがとうございます。

    キャンセル

回答 1

check解決した方法

0

処理が重い箇所が明確に分かったので、ストップウォッチを用いてその場で待機するようにしました。
無事、コントロールの色を変えることができました。

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.49%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る