отправлять сообщения в родительское текстовое поле с ключом в списке, расположенном внутри toolstripdownhost - PullRequest
0 голосов
/ 12 февраля 2019

Невозможно передать ProcessCmdKey или отправить сообщение с ключом в ListBox на его управляющий элемент ToolStripDropDown TextBox.

У меня есть собственный TextBox (ограниченные разрешенные символы и другие различные пользовательские типы), в котором размещается ListBox внутри ToolStripDropDown.Контекст источника данных ListBox представляет собой BindingSource, так что любой текст, введенный в TextBox, должен применяться в качестве BindingFilter для BindingSource.Я должен показать все параметры, когда TextBox имеет фокус и, если требуется, пользователь должен отфильтровать ввод списка в TextBox.Поэтому внутри события фокуса TextBox я установил показ ToolStripDropDown (ListBox).Но когда отображается раскрывающийся список, пользователь не может ввести текстовое поле для фильтрации, поскольку он больше не является активным элементом управления. Как передать или опубликовать сообщение данных, введенных внутри ListBox или ToolStripDropDown, к его родительскому элементу TextBox, чтобы его текст соответствующим образом изменился.

Манипулирование ProcessCmdKey для маршрутизации на (TextBox) base.ProcessCmdKey не являетсяпомогает, поскольку сообщение передается, но текст TextBox не изменяется.

 public class PopupWindow : System.Windows.Forms.ToolStripDropDown  
    {
        private System.Windows.Forms.ToolStripControlHost _host;
        public System.Windows.Forms.Control contentControl;
        public System.Windows.Forms.Control ParentControl;       

        public PopupWindow(System.Windows.Forms.Control content, System.Windows.Forms.Control parentControl)
        {
            //Basic setup...
            this.AutoSize = false;
            this.DoubleBuffered = true;
            this.ResizeRedraw = true;
            contentControl = content;
            ParentControl = parentControl;

            this._host = new System.Windows.Forms.ToolStripControlHost(contentControl)
            {
                Margin = Padding.Empty,
                Padding = Padding.Empty,
                AutoSize = false
            };            

            //Positioning and Sizing
            this.MinimumSize = content.MinimumSize;            
            this.Size = content.Size;
            this.Dock = DockStyle.Fill;
            content.Location = Point.Empty;

            //Add the host to the list
            this.Items.Add(this._host);
        }


        #region keystroke events

        private bool ProcessKeyDown(Keys keyData)
        {
            try
            {
                if (contentControl == null || !_host.IsOnDropDown || (contentControl is ListBox) == false)
                    return false;

                ListBox lb = contentControl as ListBox;

                switch (keyData)
                {
                    case Keys.Down:                        
                        if (lb.SelectedIndex < lb.Items.Count - 1)
                            lb.SelectedIndex++;
                        return true;
                    case Keys.Up:
                        if (lb.SelectedIndex > 0)
                            lb.SelectedIndex--;
                        return true;
                    case Keys.Enter:
                        //suggestionList.SelectedSuggestion = suggestionList.suggestionListBox.Text;
                        ParentControl.Text = lb.GetItemText(lb.SelectedItem);
                        this.Hide();
                        return true;
                    case Keys.Escape:
                        this.Hide();
                        ParentControl.Focus();
                        return true;
                    default:
                        this.Hide();
                        ParentControl.Focus();
                        return false;
                }
                return false;
            }
            catch (Exception ex)
            {
                return false;
            }
        }

        protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
        {
            if (ProcessKeyDown(keyData))
                return true;

            return ((PopupTextBox)ParentControl).parentProcessCmdKey(ref msg, keyData); 
        }

        #endregion
    }
...