【问题标题】:TextBoxButton click event文本框按钮点击事件
【发布时间】:2026-01-23 17:10:01
【问题描述】:

我使用流动代码来创建 TextBoxButton Control 。当我在主类的“TextBoxButton_Click”void 中编写代码时,它工作正常。但是当我在表单上拖动这个自定义控件时,当我双击这个控件时如何管理点击事件?如何确定用户点击的文本框或文本框内的按钮?

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

namespace CustomControl
{
    public class TextBoxButton : TextBox
    {
        [System.Runtime.InteropServices.DllImport("user32.dll")]
        private static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wp, IntPtr lp);

        public Button mbutton;
        public Button button
        {
            get { return mbutton; }
            set { this.mbutton = value; }
        }
        protected override void OnCreateControl()
        {
            this.Controls.Add(this.mbutton);
            SetRightToLeft();
            base.OnCreateControl();
        }
        private void SetRightToLeft()
        {
            if (RightToLeft == RightToLeft.Yes)
            {
                mbutton.Dock = DockStyle.Left;
            }
            else
            {
                mbutton.Dock = DockStyle.Right;
            }
        }
        protected override void OnRightToLeftChanged(EventArgs e)
        {
            SetRightToLeft();
            base.OnRightToLeftChanged(e);
        }
        public TextBoxButton()
        {
            mbutton = new Button();
            mbutton.Width = 20;
            mbutton.Cursor = Cursors.Hand;
            mbutton.Click += TextBoxButton_Click;
            // Send EM_SETMARGINS to prevent text from disappearing underneath the button
            SendMessage(Handle, 0xd3, (IntPtr)2, (IntPtr)(mbutton.Width << 16));

        }

        private void TextBoxButton_Click(object sender, EventArgs e)
        {
                      }
    }
}

【问题讨论】:

    标签: c# winforms events button textbox


    【解决方案1】:

    您可以在自定义控件中创建新事件,在将控件放在表单上后即可访问这些事件。

    public EventHandler TextBoxClick;
    public EventHandler ButtonClick;
    
    // Attach this handler to your TextBox.Click event
    private void TextBox_Click(object sender, EventArgs e)
    {
        if (TextBoxClick != null)
            TextBoxClick(sender, e);
    }
    
    // Attach this handler to your Button.Click event
    private void Button_Click(object sender, EventArgs e)
    {
        if (ButtonClick != null)
            ButtonClick(sender, e);
    }
    

    另一种方法是让您的 TextBox 和 Button public,但这似乎有点 hack。

    【讨论】:

      【解决方案2】:

      在构造函数中添加一个事件处理程序怎么样:

      public TextBoxButton(){
      //...
      //...
       mbutton.Click += Mbutton_Click;
      }
      
      private void Mbutton_Click(object sender, EventArgs e) {
          MessageBox.Show("*");
      }
      

      【讨论】:

        【解决方案3】:

        如果您希望 Windows 窗体设计器在程序员双击窗体设计器中的 TextBoxButton 时默认为控件创建 Click 事件,请使用 DefaultEvent 属性。

        下面的代码还演示了如何创建自己的Click 事件,该事件在单击按钮时引发。

        [DefaultEvent("Click")]
        public class TextBoxButton : TextBox
        {
            public TextBoxButton()
            {
                mbutton = new Button();
                mbutton.Width = 20;
                mbutton.Cursor = Cursors.Hand;
                mbutton.Click += TextBoxButton_Click;
                // Send EM_SETMARGINS to prevent text from disappearing underneath the button
                SendMessage(Handle, 0xd3, (IntPtr)2, (IntPtr)(mbutton.Width << 16));
            }
        
            private void TextBoxButton_Click(object sender, EventArgs e)
            {
                //  Raise our own Click event
                OnClick();
            }
        
            public event EventHandler Click;
        
            protected void OnClick() {
                var handler = Click;
                if (handler != null)
                {
                    handler(this, EventArgs.Empty);
                }
            }
        

        【讨论】: