Доступ к членам владельца во вложенном классе - PullRequest
0 голосов
/ 15 декабря 2009

В моей форме есть специальный ярлык, который должен показывать во всплывающей подсказке какой-то текст. Метка объявляется как закрытый класс в форме (вложенный элемент управления) и должна «видеть» элемент управления ToolTip родительской формы.

Вот код. Конечно, я получаю ошибки здесь, потому что конструктор вызывается перед добавлением частного элемента управления в коллекции элементов управления владельца ...

Edit: Есть ли возможность не передавать элемент управления 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);
            }
        }
    }
}

Ответы [ 3 ]

1 голос
/ 15 декабря 2009

Вы можете использовать любой экземпляр 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);
    }
}

Помогает ли это немного прояснить ситуацию?

1 голос
/ 15 декабря 2009

Почему бы просто не передать форму в конструктор 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);
    }
}

Я ожидаю, что это сработает ... если это не так, пожалуйста, опишите подробно, какие ошибки вы видите Я предполагаю, что есть веская причина сделать это в реальной жизни - сейчас мне это кажется немного запутанным.

0 голосов
/ 16 декабря 2009

Временное решение может быть как:

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