通过我的自定义控件访问窗体上的标签

时间:2010-05-25 18:21:16

标签: c# custom-controls

我创建了一个WindowsFormControlLibrary项目。它工作正常,我可以把它放在表格上,调用它的方法等... 但现在作为它的属性,我将Label的名称传递给它。我希望这个自定义控件能够使用该标签名称,例如将其字体更改为粗体。 所以问题是,如果我有一个WinForm并且我在该表单上有一个Label并且我在该表单上有自定义控件,那么如何告诉我的自定义控件使用该标签执行某些操作我将其名称传递给它? / p>

3 个答案:

答案 0 :(得分:2)

不是发送标签名称,而是发送对实际标签的引用,然后自定义控件可以在需要时读取名称并更改标签的字体和其他属性。

但是要小心,如果各种表格和控件改变了对其他表格的控制等,它可能会很快变得混乱,以便跟踪发生的事情。

编辑:添加代码以在评论中执行您要求的内容

代码未经过测试,因此可能不完全正确,但类似的内容应该有效。

foreach (Control c in Parent.Controls) 
{
    if (c is Label) 
    {
        Label l = (Label)c;
        // do stuff to label l
    }        
}

答案 1 :(得分:1)

首先,如果您希望从Control访问UserControl,则需要使用FindForm()方法。

其次,您需要通过表单的属性公开TextBox控件。

然后,您需要知道此Form方法返回的此FindForm()的类型。

一旦你知道了,你需要将这个结果输入到正确的类型。

所以,这里有一个未经测试的样本伪代码,可以给你一个想法:

public partial class MyMainForm {
    private TextBox textBox1;

    public MyMainForm() {
        textBox1 = new Textbox();
        textBox1.Name = @"textBox1";
        textBox1.Location = new Point(10, 10);
        textBox1.Size = new Size(150, 23);
        this.Controls.Add(textBox1);
    }

    public Font MyTextBoxFont {
        get {
            return textBox1.Font;
        } set {
            if (value == null) return;
            textbox1.Font = value;
        }
    }
}

然后,假设您放弃了对表单的控制权,那么UserControl可能会有这样的属性:

public partial class MyUserControl {
    private Form GetContainerForm {
        get {
            return this.FindForm();
        }
    }

    // And later on, where you need to set your TextBox's font:
    private void SetContainerInputFieldFont(Font f) {
        if (GetContainerForm == null) return; // Or throw, depending on what you need to do.

        ((MyMainForm)GetContainerForm).MyTextBoxFont = f
    }
}

答案 2 :(得分:0)

很酷:)我刚刚添加了一个类型为Label的get set公共属性...它会自动列出表单上的所有标签。