- PR -

ComboBoxで文字列を入力しても文字列の項目が選択されない

1
投稿者投稿内容
こん
会議室デビュー日: 2006/02/03
投稿数: 17
投稿日時: 2006-02-03 15:11
はじめまして、こんといいます。

.NET 2003 C#のComboBoxで困っていることがありますので質問させてください。

ComboBoxをDropDownList形式で作成し
文字列を入力したのですが、対象となる項目が選択されず
別の項目が選択されてしまいます。(一部の項目のみ)

MSDNの 文書番号 : 814362
[PRB] 先頭の文字列を入力しても ComboBox コントロールの項目が選択されない

に回避策が掲載されており実践したのですが上手くいきませんでした。
上記文書では下記のソースが載っているのですが、

// ComboBoxのKeyUpイベントに追加

searchstr = searchstr + Convert.ToChar(e.KeyCode);
// If the Search string is greater than 1 then use custom logic
if (searchstr.Length > 1)
{
int index;
// Search the Item that matches the string typed
index=comboBox1.FindString(searchstr);
// Select the Item in the Combo
comboBox1.SelectedIndex=index;
}

コンボボックスには日本語文字が入っており
e.KeyCodeには1byte文字が入ってくるため日本語文字に変換される
前のアスキーコードが入ってきます。

(例えば山田と入力すると yamadaと順番に飛んでくる。しかし画面にはやまだ
と入力されている。変換前)

これが上手くいかない理由だと思うのですが。
これを回避して日本語文字とマッチングさせ対象となる
項目が選択されるように皆さんの知恵をお借りできたらいいなと思っています。

よろしくお願い致します。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-02-03 15:18
引用:

こんさんの書き込み (2006-02-03 15:11) より:

これが上手くいかない理由だと思うのですが。
これを回避して日本語文字とマッチングさせ対象となる
項目が選択されるように皆さんの知恵をお借りできたらいいなと思っています。


Key イベントである限りは、解決策はないですね。

yamada が「山田」なのか、「やまだ」なのか、「ヤマダ」なのかわかりませんから。
こんなの全部対応しきれませんよね。

入力が確定した後に任意のタイミングで検索するしかないと思います。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
こん
会議室デビュー日: 2006/02/03
投稿数: 17
投稿日時: 2006-02-03 15:39
じゃんぬさんありがとうございます。

その任意のタイミングなのですが
どこでそれをとればいいのでしょうか?

実はそれを試みようとしたのですがわかりませんでした。
SelectedIndexChangedイベントなどでは間違った選択位置の文字列を
とってきます。(あたりまえなのですが。。。)

他にもValidatedなど色々試したのですがだめで。
どこで日本語を取ればいいのだろうと思っています。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-02-03 16:24
そもそも、日本語入力の場合は何もせずともその Item を選択してくれると思うんですが。
「山」と変換するときっちり「山田」を選択してくれます。

しかし、「やま」で「山」を検索するのは先ほども言ったように不可能です。
こんなの全部対応しきれません。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
まどか
ぬし
会議室デビュー日: 2005/09/06
投稿数: 372
お住まい・勤務地: ますのすし管区
投稿日時: 2006-02-03 16:27
引用:

その任意のタイミングなのですが
どこでそれをとればいいのでしょうか?


DropDownListだとつらいのではないですか?

VB6でStyle=標準(入力可能)ですが応用ききませんか?
「PAPAn VBさん」
http://www.mitene.or.jp/~sugisita/vb6_ctl.html
コンボボックスのオートコンプリート
こん
会議室デビュー日: 2006/02/03
投稿数: 17
投稿日時: 2006-02-03 18:04
返事が遅くなりました。すみません。
レスありがとうございます。

>> じゃんぬさん

おっしゃるとおり殆どの文字は該当のItemを選択してくれます。
一部、ダメなものがあります。

例えば、、、

山田
西尾
小木曽

木場


と並んでいたとします。

小木曽と入力すると何故か木場に飛んでいってしまいます。。。
その他はきちんと該当のItemに飛んでいきます。

実際のデータは60件ほどあるのですが、その中で数件
このような現象が発生しています。
MSDNの文章を読むとなんとなくこのような現象が発生しても
おかしくはないとは思いました。

--

後、もちろんやまでは検索しません。
実際の例で記述しますと、

@ こぎそと入力
A 変換キーを押す。(小木曽に変換される)
B ENTERを実行。

この時、小木曽に変換されているので
この変換文字を取得するのはどこですればいいのだろう?
と思っています。(ENTER押すと木場に飛んで行きますので)


>> まどかさん

まどかさん、ありがとうございます。
まだ見ていないのですが今から確認します。

結果は後ほど報告させて頂きます。

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












じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-02-03 18:22
引用:

こんさんの書き込み (2006-02-03 18:04) より:

小木曽と入力すると何故か木場に飛んでいってしまいます。。。
その他はきちんと該当のItemに飛んでいきます。


これは最後に飛ばされた WCHAR で判別しているからですね。
小木山と入力すれば「山田」さんが選ばれるかと思います。

制御するのはちょっと面倒ですね。
WM_IME_CHAR を補足して色々やらなきゃいけないのかな。

こういう場合は、DropDownList ではなく DropDown の方が良いんでしょうね。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
こん
会議室デビュー日: 2006/02/03
投稿数: 17
投稿日時: 2006-02-07 17:56
こんです。
遅くなりましたが報告いたします。

>> じゃんぬさん

ありがとうございました。
IMEというキーワードをもとに色々調べさせていただきました。

それをもとにComboBoxを継承したクラスを作り
WndProcをオーバーライドすることにより解決いたしました。

以下にIMEの文字列取得方法を記述したサイトがあったので
記述しておきます。

http://shinshu.fm/MHz/95.83/a02138/0000025041.html

1人では解決することができなかったので
色々アドバイスありがとうございました!
助かりました。

>> まどかさん

プログラム拝見させて頂きました。
既に文字列を取得した前提のプログラムだったので
今回はつかえなかったのですがいつか使ってみようと思います。

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


1

スキルアップ/キャリアアップ(JOB@IT)