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

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

新規登録して質問してみよう
ただいま回答率
85.50%
C#

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

Visual Studio 2013

Microsoft Visual Studio 2013は、Microsoftによる統合開発環境(IDE)であり、多種多様なプログラミング言語に対応しています。 Visual Studio 2012の次のバージョンです

Q&A

解決済

3回答

8938閲覧

ComboBoxの項目を表示させたいのですが・・・

fender0131

総合スコア121

C#

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

Visual Studio 2013

Microsoft Visual Studio 2013は、Microsoftによる統合開発環境(IDE)であり、多種多様なプログラミング言語に対応しています。 Visual Studio 2012の次のバージョンです

0グッド

0クリップ

投稿2015/10/23 02:30

編集2015/10/23 06:14

いつもお世話になっております。

ComboBoxの項目表示について質問させて頂きます。

本プログラムは「Enterキー」を押すと、フォーカスが移動し、
移動先の ComboBox の項目を表示するというものです。

Enterキーでの ComboBox1 ⇄ ComboBox2 のフォーカス移動 & 表示は問題ないのですが、
Combobox1・2を左クリックすると一瞬項目が出るのですが、すぐ消えてしまいます。

現在:

1.Combobox1にフォーカスがある状態で、Combobox2の「∨」ボタン(Combobox右端の∨)をクリック。
2.一瞬項目が表示されるが、その後項目が消えてしまう。
3.再度、Combobox2の「∨」ボタンをクリックすると、項目が表示される。

理想:

1.Combobox1にフォーカスがある状態で、Combobox2の「∨」ボタンをクリック。
2.項目が表示される。

何か付け加える条件など必要なのでしょうか?
どなた様かご指導ご鞭撻の程よろしくお願い致します。

以下作成途中のプログラムソースを添付させて頂きます。

using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApplication3
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();

comboBox1.Items.Add("0: a "); comboBox1.Items.Add("1: b "); comboBox1.Items.Add("2: c "); comboBox2.Items.Add("0: X "); comboBox2.Items.Add("1: Y "); comboBox2.Items.Add("2: Z "); } ComboBox[] comboBoxArray = new ComboBox[2]; string[] comboValues = new string[2]; string cb1; string cb2; private void Form1_Load(object sender, EventArgs e) { this.KeyPreview = true; comboBoxArray[0] = comboBox1; comboBoxArray[1] = comboBox2; for (int i = 0; i < 2; i++) { comboBoxArray[i].Enter += new EventHandler(_Enter); } } public void _Enter(object sender, EventArgs e) { for (int i = 0; i < comboBoxArray.Length; i++) { if (Object.ReferenceEquals(sender, comboBoxArray[i])) { comboValues[i] = (comboBoxArray[i].Text); if(i == 0) { comboBox1.DroppedDown = true; } if (i == 1) { comboBox2.DroppedDown = true; } } } } private void Form1_KeyDown(object sender, KeyEventArgs e) { if (e.KeyCode == Keys.Enter) { if (!e.Control) { this.SelectNextControl(this.ActiveControl, true, true, true, true); } } } }

}

イメージ説明

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

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

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

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

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

guest

回答3

0

もっとやりようがあった気がしますが、こんなんでどうでしょうか。Formデザイン側のイベントはすべて外してください。

public Form1() { InitializeComponent(); comboBox1.Items.Add("0: a "); comboBox1.Items.Add("1: b "); comboBox1.Items.Add("2: c "); comboBox2.Items.Add("0: X "); comboBox2.Items.Add("1: Y "); comboBox2.Items.Add("2: Z "); InitializeEvent(); } private void InitializeEvent() { foreach (ComboBox each in Controls) { if (each != null) { each.KeyDown += (s, a) => { if (a.KeyCode == Keys.Enter) { var current = s as ComboBox; var next = GetNextComboBox(current); next.Focus(); next.DroppedDown = true; } }; } } } private ComboBox GetNextComboBox(ComboBox cb) { var start = Controls.IndexOf(cb) + 1; for(int i=start ;i <Controls.Count ; i++) { if (Controls[i] is ComboBox) { return Controls[i] as ComboBox; } } for (int i = 0; i <= start; i++) { if (Controls[i] is ComboBox) { return Controls[i] as ComboBox; } } return null; }

投稿2015/10/26 07:50

編集2015/10/26 08:18
yuu341

総合スコア161

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

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

fender0131

2015/10/26 08:54

お答えありがとうございました。 ソースまで貼って頂き大変わかりやすかったです。
guest

0

ベストアンサー

こんにちは。
やりたいことを見失っていたらすみません。

ENTERキー押下、「∨」ボタンをクリック時以外はドロップリストの展開は行わなくてもよいのですか?
それであれば単純にENTERイベント内で処理するのではなくKeyDownの処理でフォーカス移動後に展開処理を付け加えては。(※KeyDownの処理に汎用的な狙いがありそうなので今一かな。)

C#

1public void _Enter(object sender, EventArgs e) 2{ 3 //for (int i = 0; i < comboBoxArray.Length; i++) 4 //{ 5 // if (Object.ReferenceEquals(sender, comboBoxArray[i])) 6 // { 7 // comboValues[i] = (comboBoxArray[i].Text); 8 // if (i == 0) 9 // { 10 // comboBox1.DroppedDown = true; 11 // } 12 // if (i == 1) 13 // { 14 // comboBox2.DroppedDown = true; 15 // } 16 // } 17 //} 18} 19 20private void Form1_KeyDown(object sender, KeyEventArgs e) 21{ 22 if (e.KeyCode == Keys.Enter) 23 { 24 if (!e.Control) 25 { 26 this.SelectNextControl(this.ActiveControl, true, true, true, true); 27 //遷移先がComboBoxであれば展開する 28 if(ActiveControl.GetType() == typeof(ComboBox)) 29 { 30 ComboBox target = ActiveControl as ComboBox; 31 target.DroppedDown = true; 32 } 33 } 34 } 35}

これがNGであれば、何らかの方法でENTER発生理由がKeyDownからなのか、ボタンからなのか、など判定する方法を探す必要がありそうですね。

投稿2015/10/26 06:18

Tak1wa

総合スコア4791

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

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

fender0131

2015/10/26 08:56

お答えありがとうございます。 理想に近い動きになりました。 大変助かりました。ありがとうございます。
guest

0

ちょっと今検証環境がない状態なので推測で申し訳ないのですが、

KeyDownイベントでe.Handled = trueしてないのでEnterキー入力が残ったままじゃないですか?

違っていたら申し訳ないです。

投稿2015/10/23 17:26

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

fender0131

2015/10/26 04:16

お答えありがとうございます。 KeyDownイベントにe.Handled = trueを追加してみたのですが、 改善されませんでした・・・ 他に考えられることはありませんでしょうか?
退会済みユーザー

退会済みユーザー

2015/10/26 04:32

ちょっと動作させてみました。 これ以下の手順でイベントが起こるから出ないんじゃないですかね? 1.マウスをクリックする 2.Enterイベント発生(ドロップ表示する) 3.マウス系(Downとか)が発生 →クリックされたのでドロップを閉じる ちょっと検証コード書く時間がなくってしまったので、合ってるか不明です。 Windowsメッセージのマウス関連をこの時だけ握りつぶしたらどうでしょうか? 参考: http://www.atmarkit.co.jp/fdotnet/dotnettips/467wndproc/wndproc.html
fender0131

2015/10/26 05:04

お答えありがとうございます。 参考URLありがとうございます。 sideceresさんのお答えを元にもう少し考えてみたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問