Pergunta

Eu tenho um rótulo especial no meu formulário, que deve mostrar numa dica algum texto. O rótulo é declarada como classe privada na forma (controle aninhado), e deve "ver" o controlo da descrição do formulário pai.

Aqui está o código. Certamente, eu obtiver erros aqui, porque o construtor é chamado antes da adição controle privado na coleção proprietário controle de formulário ...

Editar: Existe a possibilidade de não passar no form1 ou o controle toolTip no construtor?

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);
            }
        }
    }
}
Foi útil?

Solução 3

Uma solução temporária pode ser como:

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);
        }
    }
}
}

Outras dicas

Porque não basta passar o formulário para o construtor de 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);
    }
}

Eu esperaria que isso funcione ... se não, por favor dê detalhes do que erros você está vendo. Estou assumindo que há uma boa razão para fazer isso na vida real -. Parece um pouco complicado para mim no momento

Você pode usar qualquer instância de ToolTip para definir uma dica - Você pode achar mais fácil para criar uma nova instância do ToolTip, em vez de re-utilizando o que está no formulário:

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

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

Como alternativa, você poderia passar explicitamente uma instância de dica de ferramenta para o controle, como este:

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);
    }
}

Será que isso ajuda a esclarecer as coisas um pouco?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top