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

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

ログ内検索
  • キーワードを複数指定する場合は 半角スペース で区切ってください。
  • 検索条件は、(AND)=[A かつ B] (OR)=[A または B] となっています。
  • [返信]をクリックすると返信ページへ移動します。
キーワード/ 検索条件 /
検索範囲/ 強調表示/ ON (自動リンクOFF)
結果表示件数/ 記事No検索/ ON
大文字と小文字を区別する

No.94186 の関連記事表示

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

    分類:[C#] 

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

    コンボボックス(DropDown:StyleDropDown)の
    itemに「あいうえお」が設定されていた場合に
    テキスト入力で「あい」と入力し、その後、リスト表示をさせると
    リスト内のカーソルがあいうえおに合わさり、入力内容も
    「あいうえお」に変換されてしまいます。
    入力時の内容を保存し、リストオープン時に内容が変更された場合に
    もとに戻す方法以外で、「あい」のままで表示させる方法はないでしょうか?
親記事 /過去ログ163より / 関連記事表示
削除チェック/

■94192  Re[1]: コンボボックスの自動変換について
□投稿者/ KOZ -(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);
        }
    }
    
記事No.94186 のレス /過去ログ163より / 関連記事表示
削除チェック/

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

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


記事No.94186 のレス /過去ログ163より / 関連記事表示
削除チェック/

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

    開いたまま選択を可能にするには SelectedIndexChanged イベントを捕まえて
    dropDowned フラグを false にしてください。
記事No.94186 のレス /過去ログ163より / 関連記事表示
削除チェック/

■94214  Re[4]: コンボボックスの自動変換について
□投稿者/ sin -(2020/03/25(Wed) 13:20:26)
    KOZ さんご返信ありがとうございます。

    こちらの想定している動作になりました。
    本当にありがとうございました。
記事No.94186 のレス / END /過去ログ163より / 関連記事表示
削除チェック/



<< 0 >>

パスワード/

- Child Tree -