【问题标题】:access textbox from anywhere in application从应用程序中的任何位置访问文本框
【发布时间】:2009-05-06 13:55:37
【问题描述】:

如何在我的 winforms 应用程序中创建一个文本框,以从应用程序的任何位置接受新的文本行?

我有一个包含文本框的主表单。我想直接从另一个类中的方法向框中添加文本。

更新

我在我的主要形式中尝试了这个:

public void Output(String value)
    {
        if (txtOutput.Text.Length > 0)
        {
            txtOutput.AppendText(Environment.NewLine);
        }
        txtOutput.AppendText(value);
    }

但我不能从其他类调用输出。我是 C# 新手,所以也许我遗漏了一些明显的东西。

问候,米尔。

PS 是的,我知道这是一个糟糕的设计,但现在这似乎是做我想做的最好的方式。文本框的功能类似于控制台。

【问题讨论】:

    标签: c# winforms textbox


    【解决方案1】:

    您需要将TextBoxText 属性公开为表单上的string 属性。比如……

    public string TextBoxText
    {
        get { return textBoxName.Text; }
        set { textBoxName.Text = value; }
    }
    

    编辑

    阅读问题编辑后,您的问题是,无论您在何处尝试执行该代码,都需要对表单的特定实例的引用。您可以传递一个引用(这是更好的选择),或者您可以使用一些臭代码并拥有一个引用表单的一个实例的静态属性。有点像...

    public partial class MyForm : Form
    {
        private static MyForm instance;
    
        public static MyForm Instance
        {
            get { return instance; }
        }
    
        public MyForm() : base()
        {
            InitializeComponent();
    
            // ....
    
            instance = this;
        }
    }
    

    使用这种方法,您可以致电MyForm.Instance.Output("test");

    【讨论】:

    • @Henk:然后……?我不确定你在说什么。
    • instance = this; 实例不为空之前,我也会在构造函数中添加异常
    【解决方案2】:

    为了进一步解耦,您可以稍微反转控制:

    // interface for exposing append method
    public interface IAppend
    {
        void AppendText(string text);
    }
    
    // some class that can use the IAppend interface
    public class SomeOtherClass
    {
        private IAppend _appendTarget = null;
    
        public SomeOtherClass(IAppend appendTarget)
        {
            _appendTarget = appendTarget;
        }
    
        private void AppendText(string text)
        {
            if (_appendTarget != null)
            {
                _appendTarget.AppendText(text);
            }
        }
    
        public void MethodThatWillWantToAppendText()
        {
            // do some stuff
            this.AppendText("I will add this.");
        }
    
    }
    
    // implementation of IAppend in the form
    void IAppend.AppendText(string text)
    {
        textBox1.AppendText(text);
    }
    

    【讨论】:

    • @Adam;那可能;这实际上取决于相关应用程序的复杂性。它是一种形式的、少数类的应用程序,还是一个多程序集、大量类的应用程序?在第一种情况下,我会发现它过度设计,在后一种情况下,我会觉得它合适。
    • @Fredrik,当然这是见仁见智,但在后一种情况下,使用更集中的单例/静态 Logger 方法似乎更合适,而不是将大量实例传递给同一个界面。 YMMV。
    • 我也喜欢这个解决方案,但是我的 SomeOtherClass 版本只包含一些方法的实现,而且我没有在任何地方创建实例,所以我不能在构造函数中向它传递任何东西。
    【解决方案3】:

    您的设计看起来有点损坏。您不应该让业务逻辑与 GUI 控件混淆。为什么不尝试一个返回值并在接口端进行赋值呢?

    【讨论】:

    • 谁说业务逻辑在做更新?为什么不能是另一个 UI 控件?
    • “应用程序中的任何地方”对我来说意味着它也是业务逻辑。
    【解决方案4】:

    这是一种非常糟糕的做法,但只是为了确保所有答案都在那里......

    在 VS 设计器中,每个表单控件在属性窗口中都有一个名为 Modifiers 的项目,默认为 Private。将其更改为其他设置之一,例如 InternalPublic,将允许您从表单外部访问它。

    我必须强调这是最糟糕的做法。

    【讨论】:

    • ...这就是为什么不建议这样做的原因。您还可以通过在表单上使用全局字符串变量和计时器来轮询它来实现。这并不意味着值得推荐......
    猜你喜欢
    • 2019-02-20
    • 2018-06-21
    • 2018-12-24
    • 1970-01-01
    • 2011-06-08
    • 1970-01-01
    • 2016-06-25
    • 2021-08-03
    • 1970-01-01
    相关资源
    最近更新 更多