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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

Q&A

解決済

1回答

2634閲覧

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

namekuhito

総合スコア21

Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

0グッド

0クリップ

投稿2020/07/28 04:31

編集2020/07/28 06:11

タイトルの通り、フォームアプリケーション内で、ボタンの色を変更する関数があります。
その関数で、ボタンの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の色が変わるようになっています。

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

YAmaGNZ

2020/07/28 04:32

どのようなソースなのですか?
y_waiwai

2020/07/28 04:32

コードを提示しましょう
namekuhito

2020/07/28 04:41

関数のコードを追記しました。 よろしくお願いいたします。
YAmaGNZ

2020/07/28 04:46 編集

それをいつどのようにして呼び出しているのですか? また、色が変わらないのはボタンのみでDataGridViewのほうは色が変わっているのですか?
propg

2020/07/28 04:45

Btn001.BackColor = Color.LawnGreen;を実行しても色が変わらないというシンプルな質問ですか? それとも提示ソースのIF文がうまく通らないということですか? もう少し具体的にしてもらったほうが良いと思います。
namekuhito

2020/07/28 04:54

デバック状態では問題なくIF分も通り、ボタンの色が変わるのですが、 タブレットにインストールした場合には、色の変更が一回目ではできず、二回目以降で可能になり 一回目で色の変更がきかない原因がわからないです。
YAmaGNZ

2020/07/28 04:59 編集

1回目は確実にif文のボタンの色を変更している部分を実行しているのかログなど出力して確認が取れているのですか? また、タブレットとのことですがデバッグ時のマウス操作とタブレットでのタッチ操作の違いで実行されていないなど考えられませんか?
propg

2020/07/28 04:58

if文内の処理が実行されているか、ログとかmessagebox表示して確認してみたらいかがでしょうか。
namekuhito

2020/07/28 05:07

Application.DoEvents();の後に、メッセージボックスを入れると色が変更できました。 ただ、メッセージボックスをコメントアウトすると同時に色の変更もできなくなりました。
YAmaGNZ

2020/07/28 05:34

実際に1回目というのはどのタイミングで実行されるのですか? フォームのロード時やインスタンスの生成時など具体的に提示をお願いします。 また、ボタンの色が変わらないときでもDataGridViewの色は変化するのですか? また、タブレットとのことですがWindowsタブレットで作成アプリはWindowsFormなのでしょうか? それとも別のものなのでしょうか?
namekuhito

2020/07/28 05:39

一回目というのは、アプリを起動してすぐの動作を指します。 ですので、Formがロードして表示したときにボタンを押したときが一回目で、その次に押したときが二回目になります。 ボタンの色が変わらない時には、データグリッドビューの色も変化しません。 タブレットはsurfaceで、作成アプリはWindowsFormです。
propg

2020/07/28 05:44

再描画がされていないのが原因のようです。 MessageBoxを表示することで処理が一旦止まり再描画されたと思います。デバッグ時も同様です。 DoEventsでも描画されないですか。this.Refresh()しても無駄かな。 このメソッド実行後グリッドやボタンが触れる状態になるのであれば描画は復帰していると思いますが。
YAmaGNZ

2020/07/28 05:47

ボタンのクリックイベントのイベントハンドラ内からこの関数を呼び出しているということですか? こちらでは再現できないので、再現できる最小限のコードを提示できませんか?
namekuhito

2020/07/28 05:55

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

2020/07/28 06:22

なにか質問に書かれていないコード部分に、描画を抑制するようなロジックがあるとか。 いっそのことイベント自体BackgroundWorkerにしてしまうとか。
namekuhito

2020/07/28 06:32

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

回答1

0

自己解決

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

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

投稿2020/09/01 07:58

編集2020/09/01 08:00
namekuhito

総合スコア21

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問