【问题标题】:Modifying a winform textbox value from another class从另一个类修改 winform 文本框值
【发布时间】:2014-06-02 23:39:39
【问题描述】:

我想知道是否可以从 C# winform 中的另一个类访问文本框值。

例如,目前我在我的 Form1.cs 类中打开和关闭了一堆不同的文本框,如下所示:

   screentextBox.Visible = true;

但是,为了减少我的 C# 类中的代码行数,我想知道是否可以从另一个类进行此调用,然后在我的 Form1.cs 中调用我的其他类方法?

类似:

class Otherclass
{
   public void ShowTextBox()
   {
       screentextBox.Visible = true;
    }
}

然后在我的 Form1.cs 中简单地调用我的新 ShowTextBox 方法。

如果这是一个愚蠢的问题,我很抱歉,但我环顾了谷歌,但找不到任何可以帮助我的东西。

【问题讨论】:

标签: c# winforms


【解决方案1】:

您可以将 TextBox 作为参数传递给另一个类中的函数:

class OtherClass
{
    public void ShowTextBox(TextBox target)
    {
        target.Visible = true;
    }
}

但是,我建议将与处理 GUI 及其事件相关的所有方法和代码保留在表单本身中。如果您有较大的计算方法等,则可以将它们移至其他类。

【讨论】:

    【解决方案2】:

    您可以在 Declaring 类中将 ScreentextBox 设为 Public,并在另一个类中访问它,例如

    class Otherclass
    {   
      public void ShowTextBox()
      {
          Class1.ScreenTextBox.Visible =true;
      }
    }
    

    【讨论】:

      【解决方案3】:

      您可以在partial class 中定义ShowTextBox 方法,这样您仍然可以访问控件并整理您的代码。

      【讨论】:

        【解决方案4】:

        添加在表单中显示TextBox 的方法:

        public partial class Form1 : Form
        {
           public void ShowTextBox()
           {
               screentextBox.Visible = true;
            }
        }
        

        然后将您的 From1 传递给其他表单并从那里调用此方法。

        【讨论】:

          【解决方案5】:
          Class OtherClass
          {
             public static void method(TextBox[] items)
             {
                foreach(item in items)
                {
                   (item as TextBox).Visible = true;
                }  
             }
          }
          

          从你的Form1.cs类调用这个方法--->

          OtherClass.method( new TextBox[] { TxtBox1, TxtBox2, TxtBox3 } );
          

          【讨论】:

            【解决方案6】:

            如果你想从另一个类访问 Form1.cs 的控件,试试这种方式

            class Otherclass
            {
              Form1 f1 = new Form1();
              f1.Controls["screentextBox"].Visible = true;
            }
            

            【讨论】:

              【解决方案7】:

              我会这样做(来自 John Willemse 的示例):

              类其他类

              {

                  public TextBox ShowTextBox(TextBox target)
                  {
                     target.Visible = true;
                     return target;
                  }
              

              }

              【讨论】:

                【解决方案8】:

                解决这个老问题的另一种方法:我发现 老方法 是一种从任何项目中的类。这种旧方法包括创建一个临时类从头开始

                注意 A:关于旧方法:我知道,我知道,全局变量是邪恶的。但是,对于许多来这里寻找快速/灵活/suites-most-cases 解决方案的人来说,这可能是一个有效的答案,我还没有看到它发布。另一件事:这个解决方案是我实际使用的,作为我来到这个页面寻找的答案。

                第一步:新的类文件从头开始如下。

                namespace YourProjectNamespace
                {
                    public class dataGlobal
                    {
                        public System.Windows.Forms.TextBox txtConsole = null;
                
                        // Place here some other things you might want to use globally, e.g.:
                        public int auxInteger;
                        public string auxMessage;
                        public bool auxBinary;
                        // etc.
                    }
                }
                

                注意 B:该类不是静态的,也没有静态成员,它允许创建多个实例以备不时之需。就我而言,我确实利用了这个功能。但是,事实上,您可以考虑将此类的 TextBox 设置为 public static 字段,以便 - 一旦初始化 - 在整个应用程序中始终相同。

                第二步:然后你就可以在主窗体中初始化它了:

                namespace YourProjectNamespace
                {
                    public partial class Form1 : Form
                    {
                        //  Declare
                        public static dataGlobal dataMain = new dataGlobal();
                
                        public Form1()
                        {
                            InitializeComponent();
                
                            // Initialize
                            dataMain.txtConsole = textBox1;
                        }
                        // Your own Form1 code goes on...
                    }
                }
                

                第三步:从您的其他类(或表单)调用Form1textBox1 的任何属性/方法:

                namespace YourProjectNamespace
                {
                    class SomeOtherClass
                    {
                        // Declare and Assign
                        dataGlobal dataLocal = Form1.dataMain;
                
                        public void SomethingToDo()
                        {
                            dataLocal.txtConsole.Visible = true;
                            dataLocal.txtConsole.Text = "Typing some text into Form1's TextBox1" + "\r\n";
                            dataLocal.txtConsole.AppendText("Adding text to Form1's TextBox1" + "\r\n");
                            string retrieveTextBoxValue = dataLocal.txtConsole.Text;
                
                            // Your own code continues...
                        }
                    }
                }
                

                [编辑]

                一种更简单的方法,特别是针对整个班级的TextBox 可见性,我在其他答案中没有看到:

                第一步:在你的Main Form中声明并初始化一个辅助TextBox对象:

                namespace YourProjectNamespace
                {
                    public partial class Form1 : Form
                    {
                        //  Declare
                        public static TextBox txtConsole;
                
                        public Form1()
                        {
                            InitializeComponent();
                
                            // Initialize
                            txtConsole = textBox1;
                        }
                        // Your own Form1 code goes on...
                    }
                }
                

                第二步:从您的其他类(或表单)调用Form1textBox1 的任何属性/方法:

                namespace YourProjectNamespace
                {
                    class SomeOtherClass
                    {
                        public void SomethingToDo()
                        {
                            Form1.txtConsole.Visible = true;
                            Form1.txtConsole.Text = "Typing some text into Form1's TextBox1" + "\r\n";
                            Form1.txtConsole.AppendText("Adding text to Form1's TextBox1" + "\r\n");
                            string retrieveTextBoxValue = Form1.txtConsole.Text;
                
                            // Your own code continues...
                        }
                    }
                }
                

                [编辑]的评论:我注意到许多问题根本无法通过通常的建议来解决:“相反,请在表单上创建公共属性以获取/设置值你有兴趣”。有时会有几个属性/方法要实现......但是,我知道......最好的做法应该占上风:)

                【讨论】:

                • 恕我直言,我刚刚发布的这个答案适用于本网站中提出的类似问题的解决方案。听从前辈的建议,我选择不发到其他页面了 :) 建议是:meta.stackexchange.com/questions/104227/… 其他有类似问题且AFAICT不能合并的页面是:stackoverflow.com/questions/5646954/…stackoverflow.com/questions/12157133/…
                • 这些都是可怕的做法。您不应该只是将所有信息存储在全局变量中,而是应该让类直接相互通信,以便将数据范围保持在必要的范围内,而不是让应用程序中的所有内容都可以访问。这种方法至少不能扩展,并且非常非常快地导致完全可维护的程序。当一切都是静态的时,它也不支持处理多个表单实例,因为数据在概念上不是静态的。
                • 亲爱的@Servy,请让我在您的评论中添加以下内容:我确实在帖子中强调了“我知道,我知道,全局变量是邪恶的”和“我知道...应该以最佳实践为准:)”。编码是一门手艺,我的朋友,全局变量是我的专长:)
                • 所以你知道你的答案很糟糕,你知道你不应该这样做,但是你选择提倡其他人无论如何都使用这种非常糟糕的做法,并且没有问题?这是非常不幸的。
                • 我的朋友:我不同意你的观点,我不认为使用全局变量是一种不好的做法默认情况下。有时它比其他方法有用并且是更好的解决方案。但是,话又说回来,这是一个见仁见智的问题。对此没有一成不变的规则,只有建议和最佳实践建议。再说一遍:我不同意我的回答不好。您可能不喜欢它,但它可以胜任。我尊重您对提供问题解决方案的更好方式的偏好和建议,尽管老实说我并不同意所有这些。
                猜你喜欢
                • 1970-01-01
                • 2011-08-04
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多