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

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

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

コンボボックスの自動変換について

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

■94186 / inTopicNo.1)  コンボボックスの自動変換について
  
□投稿者/ sin (1回)-(2020/03/24(Tue) 11:49:21)

分類:[C#] 

C#2008を使用しています。

コンボボックス(DropDown:StyleDropDown)の
itemに「あいうえお」が設定されていた場合に
テキスト入力で「あい」と入力し、その後、リスト表示をさせると
リスト内のカーソルがあいうえおに合わさり、入力内容も
「あいうえお」に変換されてしまいます。
入力時の内容を保存し、リストオープン時に内容が変更された場合に
もとに戻す方法以外で、「あい」のままで表示させる方法はないでしょうか?
引用返信 編集キー/
■94192 / inTopicNo.2)  Re[1]: コンボボックスの自動変換について
□投稿者/ KOZ (97回)-(2020/03/24(Tue) 15:22:58)
No94186 (sin さん) に返信
> 入力時の内容を保存し、リストオープン時に内容が変更された場合に
> もとに戻す方法以外で、「あい」のままで表示させる方法はないでしょうか?

ドロップダウンリスト表示中に、EDIT への WM_SETTEXT を無視すれば良いです。

このようなクラスを用意して

using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;

class ComboBoxHooker : NativeWindow
{
    public ComboBoxHooker(ComboBox owner) {
        Owner = owner;
        if (owner.IsHandleCreated) {
            Owner_HandleCreated(owner, EventArgs.Empty);
        }
        owner.HandleCreated += Owner_HandleCreated;
        owner.DropDown += Owner_DropDown;
        owner.DropDownClosed += Owner_DropDownClosed;
    }

    [StructLayout(LayoutKind.Sequential)]
    struct RECT
    {
        public int Left;
        public int Top;
        public int Right;
        public int Bottom;
    }

    [StructLayout(LayoutKind.Sequential)]
    class COMBOBOXINFO
    {
        public int cbSize;
        public RECT rcItem;
        public RECT rcButton;
        public int stateButton;
        public IntPtr hwndCombo;
        public IntPtr hwndItem;
        public IntPtr hwndList;
        public COMBOBOXINFO() {
            this.cbSize = Marshal.SizeOf(this);
        }
    }

    [DllImport("user32")]
    static extern bool GetComboBoxInfo(IntPtr hwndCombo, COMBOBOXINFO cbinfo);

    private bool dropDowned = false;

    private void Owner_DropDownClosed(object sender, EventArgs e) {
        dropDowned = false;
    }

    private void Owner_DropDown(object sender, EventArgs e) {
        dropDowned = true;
    }

    public ComboBox Owner { get; }

    private void Owner_HandleCreated(object sender, EventArgs e) {
        var cb = new COMBOBOXINFO();
        if (GetComboBoxInfo(((ComboBox)sender).Handle, cb)) {
            AssignHandle(cb.hwndItem);
        }
    }

    protected override void WndProc(ref Message m) {
        const int WM_NCDESTROY = 0x0082;
        const int WM_SETTEXT = 0x000C;
        switch (m.Msg) {
            case WM_NCDESTROY:
                base.WndProc(ref m);
                ReleaseHandle();
                break;
            case WM_SETTEXT:
                if (!dropDowned) {
                    base.WndProc(ref m);
                }
                break;

            default:
                base.WndProc(ref m);
                break;
        }
    }
}

こう使います。

public partial class Form1 : Form
{
    readonly ComboBoxHooker hooker;

    public Form1() {
        InitializeComponent();
        hooker = new ComboBoxHooker(comboBox1);
    }
}

引用返信 編集キー/
■94199 / inTopicNo.3)  Re[2]: コンボボックスの自動変換について
□投稿者/ sin (3回)-(2020/03/24(Tue) 16:44:00)
KOZさん、ご返信ありがとうございます。

当方で上記内容で動作を確認したところ、
リストオープン時に自動であい→あいうえおに変換はされなくなりましたが、
リストオープンし、リスト内の項目を選択しても変更されません。
(おそらく Owner_DropDown、Owner_DropDownClosedのdropDownedフラグが影響?)
リスト内の項目は選択ができる方法についてご教授ください。



引用返信 編集キー/
■94200 / inTopicNo.4)  Re[3]: コンボボックスの自動変換について
□投稿者/ KOZ (98回)-(2020/03/24(Tue) 17:16:41)
No94199 (sin さん) に返信
> (おそらく Owner_DropDown、Owner_DropDownClosedのdropDownedフラグが影響?)
> リスト内の項目は選択ができる方法についてご教授ください。

開いたまま選択を可能にするには SelectedIndexChanged イベントを捕まえて
dropDowned フラグを false にしてください。
引用返信 編集キー/
■94214 / inTopicNo.5)  Re[4]: コンボボックスの自動変換について
□投稿者/ sin (4回)-(2020/03/25(Wed) 13:20:26)
KOZ さんご返信ありがとうございます。

こちらの想定している動作になりました。
本当にありがとうございました。
解決済み
引用返信 編集キー/

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


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

このトピックに書きこむ