如何公开公开控件的属性?

Posted

技术标签:

【中文标题】如何公开公开控件的属性?【英文标题】:How do I expose a control's property publicly? 【发布时间】:2020-04-11 05:28:26 【问题描述】:

我想将 Form1 上的文本框的 Text 属性公开给 Form2,以便 Form2 可以在 Form1 上的文本框中设置文本。我已经阅读了如何做到这一点,但它不起作用,所以我一定是做错了什么。

这是Form1的代码,包括公共属性的声明(TextInputText是属性,txtInput是文本框):

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApp1

    public partial class Form1 : Form
    
        public string TextInputText
        
            get => txtInput.Text;
            set => txtInput.Text = value;
        

        public Form1()
        
            InitializeComponent();                       
        

        private void txtInput_KeyDown(object sender, KeyEventArgs e)
        
            // If enter is pressed clear the textbox, but update() the history first

            if (e.KeyCode == Keys.Enter)
            
                TextHistory.Update(txtInput.Text);
                txtInput.Text = "";
            
        

        private void HistoryButton_Click(object sender, EventArgs e)
        
            Form2 HistoryForm = new Form2();
            HistoryForm.Show();
        
    

问题是Form2仍然看不到该属性,或者我不知道如何访问它,我做错了什么?

【问题讨论】:

很难说你做错了什么而不看你是如何尝试访问它的。 看不到 Form1 和 Form2 是如何交互的。您是否遵循这些帖子中的任何一个的设计模式? ***.com/questions/39026518/…***.com/questions/1559770/… 我尝试过使用 FormName.TextInputText,我认为这就是您访问它的方式。 你需要给 Form2 一个对 Form1 的引用。 Form2 还能如何访问有关 Form1 的任何信息? 请分享一个尝试访问它的代码示例。这段代码在我看来没问题,所以问题可能就在那里。 【参考方案1】:

在创建时注入 Form2 并引用 Form1

private void HistoryButton_Click(object sender, EventArgs e)

    Form2 HistoryForm = new Form2(this);
    HistoryForm.Show();

这需要您在Form2 中定义一个接受Form1 引用的自定义构造函数。然后,您可以使用此引用来访问该属性:

private readonly Form1 _form1;
public Form2(Form1 form1)

    InitializeComponent();
    _form1 = form1;

    string text = _form1.TextInputText;

另一种方法是使用Application.OpenForms 属性在Form2 中获取对Form1 的引用:

var form1 = Application.OpenForms.OfType<Form1>().FirstOrDefault();
string text = form1.TextInputText;

【讨论】:

【参考方案2】:

您没有为 Form2 提供对 Form1 实例的引用:

Form2 HistoryForm = new Form2();

您如何在没有实例的情况下访问 Instance 函数、属性或值?静态属性没有意义。所以最有可能的选择是给 Form2 一个以 Form1 引用作为参数的构造函数。将该引用存储在 Form2 中的某处。然后像这样调用构造函数:

Form2 HistoryForm = new Form2(this);

【讨论】:

这听起来正是我所需要的。你能告诉我我是如何为 Form2 制作构造函数的吗,我对构造函数了如指掌,我以前从未为表单制作过构造函数。 @GlassWizzard:请参阅我的答案以获取构造函数示例。

以上是关于如何公开公开控件的属性?的主要内容,如果未能解决你的问题,请参考以下文章

ATL ActiveX 控件如何向 javascript 公开布尔值

WinUI 3 XAML DataTemplate - 如何包含由用于绑定的类公开的控件

如何在 XAML 中公开控件以便在其他类中看到

将自定义 UIKit 事件从自定义 UIKit 控件公开到 SwiftUI

如何使用 jQuery 插件公开公共属性?

如何公开集合属性? [关闭]