【问题标题】:How to copy a textbox value from Form1 to Form2? [duplicate]如何将文本框值从 Form1 复制到 Form2? [复制]
【发布时间】:2013-12-31 18:52:45
【问题描述】:

我的 Form1 有一个文本框和一个按钮。当用户单击Form1 中的按钮时,Form2 将打开一个标签控件,该控件带有Form1 中文本框的值。

我所做的是将Form1 的文本框修饰符设置为Public,但是当我在Form2 中调用Form1 的文本框名称时,我收到一个错误提示

名称“txtbx1”在当前上下文中不存在

我不知道为什么,因为我已经将txtbx1的修饰符设置为Public

快速说明:我尝试在 Form2 中将 Form1 实例化为:

Form1 f1 = new Form1();

然后调用

f1.txtbx1.text

奇怪的是 Form1 无法实例化(未突出显示)。另一方面,如果我这样做 Form2 f2 = new Form2(); Form2 会突出显示!

这就是我从 Form1 显示 Form2 的方式:

        SetSalary salForm = new SetSalary();
        salForm.ShowDialog();

注意 SetSalary 代表 Form2。

任何帮助将不胜感激。

【问题讨论】:

    标签: c# .net winforms


    【解决方案1】:

    form2 构造一个接受字符串的构造函数,并在调用新的form2 时将form1.frm1Textbox.text 传递给构造函数,然后将其设置为form2.frm2Textbox.text

    Form2 form = new Form2(frm1Textbox.text);
    

    在form2构造函数中

    public class Form2 : Form
    {
        public Form2(string text)
        {
            frm2Textbox.Text = text; 
        }
    }
    

    【讨论】:

      【解决方案2】:
      public partial class Form1 : Form    
      { 
          Form2 f = new Form2();
          private void button1_Click(object sender, EventArgs e)
          {   
              textBox1.Text = f.ans();   /*-- calling function ans() and textBox1.Text is inside form1--*/
          }
      }
      

      在form2中创建一个公共函数ans() ....

      public partial class Form2 : Form
      {
          public string ans()
          {
            string s = textBox1.Text;/*-- assigning value of texBox1.Text to local variable s and textBox1.Text is another text box which is inside form 2 --*/
            return s; // returning s
          }
      }
      

      【讨论】:

        【解决方案3】:

        要从Form2 实例化Form1class Form1 必须声明为public class Form1,或者如果它们在同一个程序集(项目)中,则至少声明为internal class Form1

        f1.txtbx1.text 不起作用,因为 c# 区分大小写,并且该属性称为 Text,而不是 text

        或者,您可以在Form2 中声明带有参数的构造函数,这样您就不必将TextBox 成员公开:

        public class Form2 : Form
        {
            public Form2(string text)
            {
                txtbx1.Text = text; //txtbx1 does not need to be public
            }
        }
        

        然后在Form1 中调用var f2 = new Form2("label text goes here");

        【讨论】:

          【解决方案4】:

          在 Form2 上公开一个公共属性(或一组属性,如果您有多个值要传入),然后它将填充文本框。这隐藏了它如何显示的实现细节,如果有的话,它也遵循内置表单类使用的标准。示例:

          public class SetSalary {
              public SetSalary() { }
              public string SalaryText {
                  get { return txtbox1.Text; }
                  set { txtbox1.Text = value; }
              }
          }
          

          然后,在启动 SetSalary 时,您可以这样做:

          SetSalary form = new SetSalary();
          form.SalaryText = srcTextBox.Text;
          form.ShowDialog();
          

          【讨论】:

            【解决方案5】:

            好的方法是使用模型-视图-演示者模式。如果您是初学者(我认为您是),那么您应该按本书学习基础知识。这可以帮助您最大程度地减少错误和不良工程,也可以最大限度地提高您的技能。

            【讨论】:

              【解决方案6】:

              在 Form1 上

              public class Form1 : Form
              {
               public Form2()
               {
                InitializeComponent();
               }
               public static string MyTextBoxValue;
               protected void button1_Click(object sender, EventArgs e)
               { MyTextBoxValue = TextBox1.Text;
               }
              }
              

              在 Form2 上

              public class Form2 : Form
              {
               public Form2()
               {
                InitializeComponent();
               }
               private void Form2_Load(object sender, EventArgs e)
               {
                label1.Text=Form1.MyTextBoxValue;
               }
              }
              

              【讨论】:

              • 如果您要打开多个 Form1 实例,这可能会出现问题。
              • 您能否详细说明它会出现什么问题?
              • 由于MyTextBoxValue 是静态的,Form1 的所有实例将共享相同的值。如果只有一个 Form1 实例,这不会有问题,但如果有多个实例,那么 MyTextBoxValue 可能会无意中保存来自 Form1 实例的值,而不是预期的值。由于用户必须首先单击 Form1 实例上的按钮来设置值,这一事实稍微缓解了这一点,但它仍然存在传输错误值的可能性。
              • 是的,我同意你的看法。好吧,感谢您解释这个问题。我会避免这种方法来做这样的工作。
              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多