C#:创建一个触发事件的自定义控件文本框

C#:创建一个触发事件的自定义控件文本框,c#,winforms,events,textbox,custom-controls,C#,Winforms,Events,Textbox,Custom Controls,我正在制作一个自定义控件文本框,它具有Cue(填充文本)和CueColor(填充文本颜色)属性。我在文本框中创建了一个Enter和Leave事件来调节提示。但是,当我尝试应用它时,它会使我的IDE崩溃(如果这有帮助的话,请参阅Visual Studio 2015) 我读过一些有类似问题的帖子: 虽然我不确定我的问题是否有相同的解决方案。我如何让它工作?为了清楚起见,以下是我的代码: class CueTextBox : TextBox { public string C

我正在制作一个自定义控件文本框,它具有
Cue
(填充文本)和
CueColor
(填充文本颜色)属性。我在文本框中创建了一个
Enter
Leave
事件来调节提示。但是,当我尝试应用它时,它会使我的IDE崩溃(如果这有帮助的话,请参阅Visual Studio 2015)

我读过一些有类似问题的帖子:

虽然我不确定我的问题是否有相同的解决方案。我如何让它工作?为了清楚起见,以下是我的代码:

class CueTextBox : TextBox
    {
        public string Cue
        {
            get { return Cue; }
            set { Cue = value;}
        }

        public Color CueColor
        {
            get { return CueColor; }
            set { CueColor = value; }
        }

        private void CueTextBox_Enter(object sender, EventArgs e)
        {
            TextBox t = sender as TextBox;
            if (t.ForeColor == this.CueColor)
            {
                t.Text = "";
                t.ForeColor = this.ForeColor;
            }
        }

        private void CueTextBox_Leave(object sender, EventArgs e)
        {
            TextBox t = sender as TextBox;
            if (t.Text.Trim().Length == 0)
            {
                t.Text = Cue;
                t.ForeColor = this.CueColor;
            }
        }
    }

我在代码中看到的唯一一件事是,属性定义递归地调用它们自己,这将在向设计图面添加控件时导致堆栈溢出

   public string Cue
    {
        get { return Cue; }
        set { Cue = value;}
    }
定义支持字段或使用自动实现的属性

    private string cue = String.Empty;
    public string Cue
        {
        get { return cue; }
        set { cue = value; }
        }

您的问题暗示添加事件处理程序导致了问题。对于自定义控件,这有时可能是一个问题。有一个属性意味着允许有条件地执行代码。但是,它不在构造函数中运行。您需要进行一些修改,以确定IDE是否处于活动状态

此属性可用于Visual Studio中的开发,作为
DesignMode
的替代方法

    private bool InDesignMode
        {
        get
            {
            return (System.ComponentModel.LicenseManager.UsageMode == System.ComponentModel.LicenseUsageMode.Designtime) || 
                    base.DesignMode || 
                    (System.Diagnostics.Process.GetCurrentProcess().ProcessName == "devenv");
            }
        }

在解决方案中,自定义控件的开发是一种自我滥用行为。最好转到“项目属性->调试”选项卡,将“启动操作”设置为“启动外部程序”,并将“devenv.exe”作为程序。这将在“运行”调试器时启动VS的新实例。将控件添加到新VS实例的设计图面时,可以调试控件的代码。将命中断点并显示异常。

在编译项目之前,您必须确保已将自定义控件的DLL添加到库中。在哪里可以找到自定义控件的DLL?请检查此项,我希望它能解决您的问题。谢谢哦,哇。谢谢你刚刚把我从头痛中解救出来。没想到会是这样的错误。:)@Donovankating,我添加了一些信息,您可能会发现这些信息对进一步开发自定义控件很有用。
    private bool InDesignMode
        {
        get
            {
            return (System.ComponentModel.LicenseManager.UsageMode == System.ComponentModel.LicenseUsageMode.Designtime) || 
                    base.DesignMode || 
                    (System.Diagnostics.Process.GetCurrentProcess().ProcessName == "devenv");
            }
        }