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

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

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

comboboxの選択後の状態について

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

■84660 / inTopicNo.1)  comboboxの選択後の状態について
  
□投稿者/ こんた (5回)-(2017/07/26(Wed) 10:55:57)

分類:[C#] 

Comboboxコントロールで項目を選択しドロップダウンリストが閉じた後に背景が青くなりますが、それを自動で消したいです。
他のコントロールを選択したら消えますが、そもそも背景が青にならないようにしたいのですが
どうすればいいでしょうか。
DropDownStyleプロパティはDropDownListです。

ご教授お願いいたします。
引用返信 編集キー/
■84668 / inTopicNo.2)  Re[1]: comboboxの選択後の状態について
□投稿者/ furu (110回)-(2017/07/26(Wed) 16:54:53)
No84660 (こんた さん) に返信

他のコントロールを選択したら消えるので
他のコントロールを選択させたらどうですか。自動で。

private void comboBox1_SelectedIndexChanged(object sender,EventArgs e)
{
    他のControl.Select();
}

引用返信 編集キー/
■84680 / inTopicNo.3)  Re[1]: comboboxの選択後の状態について
□投稿者/ 大谷刑部 (33回)-(2017/07/27(Thu) 10:23:27)
No84660 (こんた さん) に返信
> Comboboxコントロールで項目を選択しドロップダウンリストが閉じた後に背景が青くなりますが、それを自動で消したいです。
> 他のコントロールを選択したら消えますが、そもそも背景が青にならないようにしたいのですが
> どうすればいいでしょうか。
> DropDownStyleプロパティはDropDownListです。

コンボボックスの背景色が青くなっているのではなく、
選択箇所、DropDownListであればリストの行の背景が青くなっているので、
Windowsの設定に従っています。つまりWindowsの仕様です。
テーマで選択時の色を変えることはできますが、それをするとほかの項目の選択時の色も変わります。

基本的には、コンボボックスからフォーカスをなくすか、選択状態を解除するしかありません。
DropDownListの設定だと、文字でなく行が選択されていると思われるので、
コンボボックスにフォーカスがある状態では解除は難しいと思います。

引用返信 編集キー/
■84703 / inTopicNo.4)  Re[2]: comboboxの選択後の状態について
□投稿者/ ぶなっぷ (118回)-(2017/07/28(Fri) 09:38:11)
たぶん、これを読んでいる人たちも、
「背景が青くなりますが」
の意味を以下の2つの意味に取っていると思います。
(他にもあるかも)

 1) コントロールのフォーカス枠が青い
     → コンボボックス以外も青くなっているはず
 2) 選択された文字列が範囲選択されて青い
     → 編集可能なドロップダウンリストだと、
        リストを選択して表示される際に全選択状態(青色)で表示されます
    https://msdn.microsoft.com/ja-jp/library/windows/desktop/aa511458.aspx

どの意味でしょう?

引用返信 編集キー/
■84718 / inTopicNo.5)  Re[3]: comboboxの選択後の状態について
□投稿者/ こんた (6回)-(2017/07/29(Sat) 12:57:23)
皆様、ご解答ありがとうございます。

No84668 (furu さん) に返信
>他のコントロールを選択したら消えるので
>他のコントロールを選択させたらどうですか。自動で。
>
>private void comboBox1_SelectedIndexChanged(object sender,EventArgs e)
>{
> 他のControl.Select();
>}

確かにこれで背景が青くなるのは解決しますが、自作クラスとして作る場合などで
他のコントロールがない場合はこの方法は無理ではないでしょうか?



No84680 (大谷刑部 さん) に返信
>コンボボックスの背景色が青くなっているのではなく、
>選択箇所、DropDownListであればリストの行の背景が青くなっているので、
>Windowsの設定に従っています。つまりWindowsの仕様です。
>テーマで選択時の色を変えることはできますが、それをするとほかの項目の選択時の色も変わります。
>
>基本的には、コンボボックスからフォーカスをなくすか、選択状態を解除するしかありません。
>DropDownListの設定だと、文字でなく行が選択されていると思われるので、
>コンボボックスにフォーカスがある状態では解除は難しいと思います。

windowsのコントロールパネル等では私の作りたいコンボボックスができているのですが
それはどのように作られているのかが知りたいです。
それもフォーカスをなくすか、選択状態を解除しているのでしょうか?



No84703 (ぶなっぷ さん) に返信
> たぶん、これを読んでいる人たちも、
> 「背景が青くなりますが」
> の意味を以下の2つの意味に取っていると思います。
> (他にもあるかも)
>
> 1) コントロールのフォーカス枠が青い
> → コンボボックス以外も青くなっているはず
> 2) 選択された文字列が範囲選択されて青い
> → 編集可能なドロップダウンリストだと、
> リストを選択して表示される際に全選択状態(青色)で表示されます
> https://msdn.microsoft.com/ja-jp/library/windows/desktop/aa511458.aspx
>
> どの意味でしょう?

(2)の意味です。
私の場合は編集不可なドロップダウンリストにしていますが、
それでも項目選択後にコントロールの背景が青色になっています。


私の質問の仕方がへたくそで伝わりづらく申し訳ありません…
例を挙げると、
windows7での「コントロール パネル\ハードウェアとサウンド\電源オプション\プラン設定の編集」
にあるコンボボックスのようにしたいです。

引用返信 編集キー/
■84725 / inTopicNo.6)  Re[4]: comboboxの選択後の状態について
□投稿者/ shu (1042回)-(2017/07/31(Mon) 07:44:40)
No84718 (こんた さん) に返信

> 例を挙げると、
> windows7での「コントロール パネル\ハードウェアとサウンド\電源オプション\プラン設定の編集」
> にあるコンボボックスのようにしたいです。
>
FlatStyleをSystemにしたときの動作でよいのでしょうか?
これはOS依存なのでPC毎に表現が変わる可能性があります。

FlatかPopupにしていると多分、提示されているような動作になるかと思います。
その場合、オーナードローにより描画する必要があるかと思います。
引用返信 編集キー/
■84726 / inTopicNo.7)  Re[4]: comboboxの選択後の状態について
□投稿者/ 大谷刑部 (34回)-(2017/07/31(Mon) 09:30:39)
No84718 (こんた さん) に返信
> 皆様、ご解答ありがとうございます。
>
> ■No84680 (大谷刑部 さん) に返信
> >コンボボックスの背景色が青くなっているのではなく、
> >選択箇所、DropDownListであればリストの行の背景が青くなっているので、
> >Windowsの設定に従っています。つまりWindowsの仕様です。
> >テーマで選択時の色を変えることはできますが、それをするとほかの項目の選択時の色も変わります。
> >
> >基本的には、コンボボックスからフォーカスをなくすか、選択状態を解除するしかありません。
> >DropDownListの設定だと、文字でなく行が選択されていると思われるので、
> >コンボボックスにフォーカスがある状態では解除は難しいと思います。
>
> windowsのコントロールパネル等では私の作りたいコンボボックスができているのですが
> それはどのように作られているのかが知りたいです。
> それもフォーカスをなくすか、選択状態を解除しているのでしょうか?

それは、コンボの背景色自体がグレーになっていて選択の青が見えなくなっているだけと思いますが?
そもそも、なぜWindowsの規則に逆らう動きにしたいのでしょう?
テキストボックスであれば、フォーカス取得時に文字列を全選択する/しないがユーザーの要望として持ち上がることはあり得ますが、
DropDownListのコンボであれば、手入力の想定がないのだから、単に見た目の問題でしょ?
なぜ、そこにこだわっているかを再考したほうがよろしいかと。



引用返信 編集キー/
■84733 / inTopicNo.8)  Re[4]: comboboxの選択後の状態について
□投稿者/ 魔界の仮面弁士 (1364回)-(2017/07/31(Mon) 12:28:19)
No84718 (こんた さん) に返信
> 私の場合は編集不可なドロップダウンリストにしていますが、
> それでも項目選択後にコントロールの背景が青色になっています。

「編集不可なドロップダウンリスト」というのは、
ComboBox の DropDownStyle プロパティを DropDownList にしている、という意味ですね?

ReadOnly 的な意味(ドロップダウンはできるが、選択項目を変更できない)だとしたら、
そのような機能は無かったはずなので。
(VB6 の ComboBox なら、Locked プロパティで制限できるのですが)


> windows7での「コントロール パネル\ハードウェアとサウンド\電源オプション\プラン設定の編集」
> にあるコンボボックスのようにしたいです。

当方の環境(Win7)では、選択後に背景が青になる現象は見られませんでした。

しかし、Application.EnableVisualStyles(); を呼び出さなかった場合は、
選択後に背景が青になるという現象が再現されました。

もしかして、Application.Run の前に EnableVisualStyles の呼び出しが漏れていませんか?


> 皆様、ご解答ありがとうございます。

解答 → 回答


>> private void comboBox1_SelectedIndexChanged(object sender,EventArgs e)
>> {
>>  他のControl.Select();
>> }
> 確かにこれで背景が青くなるのは解決しますが、自作クラスとして作る場合などで
> 他のコントロールがない場合はこの方法は無理ではないでしょうか?

他のコントロールをアクティブにするのではなく、
アクティブなコントロールを無くしてしまうという手があります。

private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
  var f = ((Control)sender).FindForm();
  if(ReferenceEquals(sender, f.ActiveControl))
  {
    f.ActiveControl = null;
  }
}


ただ、SelectedIndexChanged イベントを使うのは得策ではないと思います。

[F4] あるいは [Alt]+[↓] あるいは [▼] クリックでのドロップダウン後に
キーボード操作で選択する場合に、処理が阻害されてしまうからです。

かわりに、SelectionChangeCommitted イベントもしくは
DropDownClosed イベントで処理を行うことを提案します。


なお、ドロップダウンさせずに項目を変更する場合
(キーボードの矢印キー操作、または項目の先頭文字を入力など)は
選択が解除されず、フォーカスが保持されたままとなります。
引用返信 編集キー/
■84737 / inTopicNo.9)  Re[5]: comboboxの選択後の状態について
□投稿者/ furu (111回)-(2017/07/31(Mon) 13:57:22)
No84733 (魔界の仮面弁士 さん) に返信
> ■No84718 (こんた さん) に返信
>>私の場合は編集不可なドロップダウンリストにしていますが、
>>それでも項目選択後にコントロールの背景が青色になっています。
>
> 「編集不可なドロップダウンリスト」というのは、
> ComboBox の DropDownStyle プロパティを DropDownList にしている、という意味ですね?
>
最初の質問に書かれています。
引用返信 編集キー/
■84738 / inTopicNo.10)  Re[6]: comboboxの選択後の状態について
□投稿者/ shu (1044回)-(2017/07/31(Mon) 14:04:55)
No84737 (furu さん) に返信
> ■No84733 (魔界の仮面弁士 さん) に返信
>>■No84718 (こんた さん) に返信
> >>私の場合は編集不可なドロップダウンリストにしていますが、
> >>それでも項目選択後にコントロールの背景が青色になっています。
>>
>>「編集不可なドロップダウンリスト」というのは、
>>ComboBox の DropDownStyle プロパティを DropDownList にしている、という意味ですね?
>>
> 最初の質問に書かれています。
Enabled = Falseではないということを確認したいんだと思います。

引用返信 編集キー/
■84741 / inTopicNo.11)  Re[4]: comboboxの選択後の状態について
□投稿者/ 大谷刑部 (35回)-(2017/07/31(Mon) 15:05:05)
No84718 (こんた さん) に返信
> 皆様、ご解答ありがとうございます。
> ■No84703 (ぶなっぷ さん) に返信
>>たぶん、これを読んでいる人たちも、
>>「背景が青くなりますが」
>>の意味を以下の2つの意味に取っていると思います。
>>(他にもあるかも)
>>
>> 1) コントロールのフォーカス枠が青い
>> → コンボボックス以外も青くなっているはず
>> 2) 選択された文字列が範囲選択されて青い
>> → 編集可能なドロップダウンリストだと、
>> リストを選択して表示される際に全選択状態(青色)で表示されます
>> https://msdn.microsoft.com/ja-jp/library/windows/desktop/aa511458.aspx
>>
>>どの意味でしょう?
>
> (2)の意味です。
> 私の場合は編集不可なドロップダウンリストにしていますが、
> それでも項目選択後にコントロールの背景が青色になっています。

コントロールの背景が青なのではありません。
選択範囲が青です。
まず、その違いを理解してください。


> 私の質問の仕方がへたくそで伝わりづらく申し訳ありません…
> 例を挙げると、
> windows7での「コントロール パネル\ハードウェアとサウンド\電源オプション\プラン設定の編集」
> にあるコンボボックスのようにしたいです。

他の方が回答されているように、
FlatStyleを変えれば、グレーになる外観のほうが優先されて、
選択範囲が青に見えなくなります。

FlatStyleをFlatなどにして、選択範囲を青にするのを変えるのは難しいでしょう。
何らかやる方法はあるかもしれませんが、Windows標準に逆らう挙動にするのですから、
かなり複雑なイベント制御が複雑が必要になるのは容易に想像がつきます。
タブキー押下である条件でコントロール移動しないようにするのと同じくらい難しい気がします。
それでも、やりますか?という話です。







引用返信 編集キー/
■84742 / inTopicNo.12)  Re[7]: comboboxの選択後の状態について
□投稿者/ 魔界の仮面弁士 (1365回)-(2017/07/31(Mon) 16:00:40)
No84738 (shu さん) に返信
>>>> 私の場合は編集不可なドロップダウンリストにしていますが、
>>>> それでも項目選択後にコントロールの背景が青色になっています。
>>> 「編集不可なドロップダウンリスト」というのは、
>>> ComboBox の DropDownStyle プロパティを DropDownList にしている、という意味ですね?
>> 最初の質問に書かれています。
> Enabled = Falseではないということを確認したいんだと思います。

フォローありがとうございます。> shu さん
意図としてはそういうことです。質問というよりは確認です。

『青色』の件とは別なので、半ば聞き流しておいてください。>こんたさん & furuさん


単に『ドロップダウンリスト』とするのではなく、『編集不可なドロップダウンリスト』
という言い回しになっていたのが気にかかったので、再確認した次第です。

(その前の、ぶなっぷ さんの「編集可能な」という表現を受けての表現であり、
「編集不可な」という言葉自体に、さほどの意味は無かったのだろうと思っていますが)



=== 以下蛇足(元の質問からは外れます) ===

先の補足発言にある "ReadOnly 的な意味" の具体例としては、
shu さん の書かれた "Enabled = False" の他、この掲示板の左上にある、
 [C# と VB.NET のサンプル] または [C# と VB.NET 入門]
のリンク先からの ReadOnlyComboBox クラスなどがあります。
(上記は No5977 の不具合報告がそのままなので、個人的には非推奨)


その他の対策版としては、 No68484 で示したものなどがありますが、私自身、
VB6 の ComboBox.Locked を再現したものにお目にかかったことがありません。
http://rucio.cloudapp.net/ThreadDetail.aspx?ThreadId=11170

蛇足ついでに書いておくと、 No68484 からリンクされている
 http://rucio.cloudapp.net/ThreadDetail.aspx?ThreadId=11170
の先で紹介している記事の内、"nifty.com" で公開されていた URL 2 つが
デッドリンクになっていたようなので、リンクを貼りなおしておきます。

http://nonsoft.la.coocan.jp/SoftSample/SampleComboBoxPlus.html
http://madia.world.coocan.jp/cgi-bin/VBBBS/wwwlng.cgi?print+200503/05030088.txt
引用返信 編集キー/
■84744 / inTopicNo.13)  Re[5]: comboboxの選択後の状態について
□投稿者/ 魔界の仮面弁士 (1366回)-(2017/07/31(Mon) 16:44:08)
No84725 (shu さん) に返信
> FlatかPopupにしていると多分、提示されているような動作になるかと思います。

同感です。

FlatStyle の 既定値は Standard なので、Windows 7 というのなら
Application.EnableVisualStyles(); を忘れてさえいなければ、
特に何もせずとも、コントロールパネルのそれと同じ動作になりそうなものですが、
現状がそうなっていないなら、FlatStyle が変更されている可能性が高そう。


> その場合、オーナードローにより描画する必要があるかと思います。

試しにオーナードローで対応してみました。

実際に使ってみた感触としては、個人的には使いにくいと感じましたが、
一応公開しておきます。


ComboBox の DrawMode プロパティを OwnerDrawFixed に設定した上で、
ComboBox の DrawItem イベントに下記を記載してみてください。


var cb = (ComboBox)sender;

if (cb.DroppedDown)
{
  e.DrawBackground();
}
if(e.Index >= 0)
{
  string item = cb.GetItemText(cb.Items[e.Index]);
  Color foreColor = cb.DroppedDown ? e.ForeColor : cb.ForeColor;
  using (var b = new SolidBrush(foreColor))
  {
    e.Graphics.DrawString(item, e.Font, b, e.Bounds);
  }
}
引用返信 編集キー/
■84779 / inTopicNo.14)  Re[5]: comboboxの選択後の状態について
□投稿者/ こんた (7回)-(2017/08/02(Wed) 11:42:40)
魔界の仮面弁士 さんがアドバイスしてくださった、

>アクティブなコントロールを無くしてしまうという手があります。

この手法でとりあえずは自分の行いたいことは達成できましたので解決とさせていただきます。

ほかの皆様もご回答くださりありがとうございました。
解決済み
引用返信 編集キー/

このトピックをツリーで一括表示


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

このトピックに書きこむ