membros proprietário de acesso em uma classe aninhada
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);
}
}
}
}
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?