我使用流代码来创建TextBoxButton控件。当我在主类的“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)
{
}
}
}发布于 2017-06-21 01:17:46
您可以在自定义控件中创建新事件,在将控件放到窗体上后可以访问这些事件。
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和按钮成为public,但这看起来有点花招。
发布于 2017-06-21 01:17:33
如果希望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);
}
}发布于 2017-06-21 01:18:49
不如在构造函数中添加一个事件处理程序:
public TextBoxButton(){
//...
//...
mbutton.Click += Mbutton_Click;
}
private void Mbutton_Click(object sender, EventArgs e) {
MessageBox.Show("StackOverFlow");
}https://stackoverflow.com/questions/44658965
复制相似问题