【问题标题】:Access to a Label on the Form by my Custom control通过我的自定义控件访问表单上的标签
【发布时间】:2010-05-25 18:21:16
【问题描述】:

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

【问题讨论】:

    标签: c# custom-controls


    【解决方案1】:

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

    但要小心,如果各种表单和控件更改其他表单上的控件等,跟踪正在发生的事情很快就会变得混乱。

    编辑:添加代码来执行您在 cmets 中要求的操作

    代码未经测试,因此可能不完全正确,但类似的东西应该可以工作。

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

    【讨论】:

    • 有什么方法可以调用 FindContorl 或类似的方法吗?
    • 甚至更好:向这个控件添加一个属性,可以枚举其包含表单上的所有标签?然后我们可以在设计时选择其中一个...
    【解决方案2】:

    首先,如果您想从您的UserControl 访问Control,您需要使用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
        }
    }
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-01-14
        • 1970-01-01
        • 1970-01-01
        • 2014-06-15
        • 1970-01-01
        • 2018-03-08
        • 1970-01-01
        • 2018-07-02
        相关资源
        最近更新 更多