0

我的表单中有一个特殊标签,它应该在工具提示中显示一些文本。标签在表单中被声明为私有类(嵌套控件),并且应该“看到”父表单的 ToolTip 控件。

这是代码。当然,我在这里得到错误,因为在所有者表单控件集合中添加私有控件之前调用了构造函数......

编辑: 是否有可能不在构造函数中传递 form1 或 toolTip 控件?

using System;
using System.Drawing;
using System.Windows.Forms;

namespace WindowsApplication2
{
    public partial class Form1 : Form
    {
        public Form1() 
        {
            this.InitializeComponent();

            FormLabel myFormLabel = new FormLabel("uraaaaa!");

            this.Controls.Add(myFormLabel);

            myFormLabel.Location = new Point(20, 20);
        }

        private class FormLabel : Label
        {
            public FormLabel(string toolTip) : base()
            {
                this.Text = toolTip.ToUpperInvariant();

                (this.FindForm() as Form1).toolTip1.SetToolTip(this, toolTip);
            }
        }
    }
}
4

3 回答 3

1

为什么不直接将表单传递给 FormLabel 的构造函数呢?

public Form1() 
{
    this.InitializeComponent();
    FormLabel myFormLabel = new FormLabel(this, "uraaaaa!");
    this.Controls.Add(myFormLabel);
    myFormLabel.Location = new Point(20, 20);
}

private class FormLabel : Label
{
    public FormLabel(Form1 form, string toolTip) : base()
    {
        this.Text = toolTip.ToUpperInvariant();
        form.toolTip1.SetToolTip(this, toolTip);
    }
}

我希望这能奏效......如果没有,请详细说明您看到的错误。我假设在现实生活中这样做是有充分理由的——现在我感觉有点复杂。

于 2009-12-15T11:10:05.453 回答
1

您可以使用 的任何实例来设置工具提示 - 您可能会发现创建 的新实例比重新使用表单上的ToolTip实例更容易:ToolTip

public FormLabel(string toolTip) : base()
{
    this.Text = toolTip.ToUpperInvariant();

    ToolTip myToolTip = new ToolTip();
    myToolTip.SetToolTip(this, toolTip);
}

或者,您可以将 ToolTip 的实例显式传递给控件,​​如下所示:

public Form1() 
{
    this.InitializeComponent();

    FormLabel myFormLabel = new FormLabel("uraaaaa!", this.toolTip1);
    this.Controls.Add(myFormLabel);
    myFormLabel.Location = new Point(20, 20);
}

private class FormLabel : Label
{
    public FormLabel(string text, ToolTip toolTip) : base()
    {
        this.Text = text.ToUpperInvariant();
        toolTip.SetToolTip(this, text);
    }
}

这有助于澄清一些事情吗?

于 2009-12-15T12:25:56.057 回答
0

临时解决方案可能如下:

using System;
using System.Drawing;
using System.Windows.Forms;

namespace WindowsApplication2
{
    public partial class Form1 : Form
    {
        public Form1(){
            this.InitializeComponent();
            FormLabel myFormLabel = new FormLabel("uraaaaa!");
            this.Controls.Add(myFormLabel);
            myFormLabel.Location = new Point(20, 20);
        }

    private class FormLabel : Label
    {
        private string toolTipText;
        public FormLabel(string toolTip) : base() {                
            this.BorderStyle = BorderStyle.FixedSingle;
            this.toolTipText = toolTip.ToUpperInvariant();
        }

        protected override void OnParentChanged(EventArgs e) {
            Form1 f1 = (this.Parent as Form1);
            if (f1 != null)
                f1.toolTip1.SetToolTip(this, this.toolTipText);
        }
    }
}
}
于 2009-12-16T14:12:59.050 回答