【问题标题】:Can't change textBox.text in form from other classes - C# - VS 2010无法从其他类更改表单中的 textBox.text - C# - VS 2010
【发布时间】:2012-10-14 03:58:46
【问题描述】:

我有一个名为 Form1 的表单。在其中,我有一个名为 Encrypt 的按钮。当我点击那个按钮时,我调用了另一个类中的方法。我希望该方法更改 textBox1.text 的值,但是当我使用此代码时没有任何反应

在 Form1 类中

public string txtbox1
    {
        get
        {
            return textBox1.Text;
        }

        set
        {
            textBox1.Text = value;
        }
    }

在另一个类的方法中

Form1 textboxes = new Form1();//creating object of the Form1 class
        textboxes.txtbox1= "whatever";

第一个文本框中没有任何变化。就好像我什么都没按一样!!!

任何帮助将不胜感激

【问题讨论】:

  • 你调用的方法的定义是什么?

标签: c# visual-studio-2010


【解决方案1】:

在您的其他类中,您需要对单击按钮的表单(并且具有您现有的文本框)的引用,而不是 new 表单。

您正在实例化的这个新表单不是您在单击按钮的屏幕上看到的那个。

(我假设您的事件处理程序存在于 Form1 类中,然后它会根据需要将信息“转发”到其他类的方法?如果不是......它应该!)

按钮引用可通过sender 对象和传递给事件处理程序的event args 获得。您可以通过将this 关键字传递给其他类的方法来传递对当前Form1 实例的引用。或者,如果这对您有用,您可以传递 sender,或者只是将对特定文本框的显式引用传递给您的其他方法。

例如,将对表单的引用传递给您的其他方法:

// Event handler on your form
private void button1_Click(object sender, EventArgs e)
{
    ButtonWasPressedOnForm(this);   
}

// Other method in your other class
public void ButtonWasPressedOnForm(Form formWhereButtonPressed)
{
    // To act on the text box directly:
    TextBox textBoxToUpdate = (TextBox)formWhereButtonPressed.Controls.Find("textBox1");
    textBoxToUpdate.Text = "whatever";

    // Or, using the Form1.txtBox1 property.
    formWhereButtonPressed.txtBox1 = "whatever";  
}

例如,将对显式文本框的引用传递给您的其他方法:

// Event handler on your form
private void button1_Click(object sender, EventArgs e)
{
    ButtonWasPressedOnForm(textBox1);   
}

// Other method in your other class
public void ButtonWasPressedOnForm(TextBox textBoxToUpdate)
{
    textBoxToUpdate.Text = "whatever";
}

例如,将事件对象传递给您的其他方法:

// Event handler on your form
private void button1_Click(object sender, EventArgs e)
{
    Button clickedButton = (Button)sender;
    ButtonWasPressedOnForm(clickedButton);  
}

// Other method in your other class
public void ButtonWasPressedOnForm(Button clickedButton)
{
    Form theParentForm = clickedButton.FindForm();

    // To act on the text box directly:
    TextBox textBoxToUpdate = (TextBox)theParentForm.Controls.Find("textBox1");
    textBoxToUpdate.Text = "whatever";

    // Or, To act on the text box, via the form's property:
    theParentForm.txtBox1 = "whatever";
}

另外,在您的“其他方法”上设置一个断点,以确保此代码甚至被触发。如果没有,请返回您的事件处理程序,确保它被触发。如果没有,请检查您的活动线路。


尽管在所有情况下,您都需要注意要更新的控件的保护级别...您需要将其设为公开、内部或受保护,具体取决于您的表单和其他类之间的关系, 如果你想从 Form1 类之外更新它。

更好的 OO 方法是在Form1 上有一个方法,允许其他类告诉Form1 为它们更新控件(例如updateTextBox(string newText))。因为这不是面向对象的最佳实践,所以允许外部对象直接作用于类的成员(因为这需要了解类的内部结构......应该封装,以便您的实现可以在不破坏现有接口的情况下进行更改在你的班级和外界之间)。

编辑: 实际上,在重新阅读您的问题时,您确实已经使用 get/set 属性封装了您的文本框。好的。因此,您应该将对您的表单的引用传递给您的其他方法,然后通过该属性更新表单的文本。在上面的例子中添加了这个方法。

【讨论】:

  • 谢谢伙计!这就说得通了!但是当我传递发送者和事件参数时。如何使用它们来编辑文本框的文本?你能给我一个其他类中的代码示例吗?
  • @RonaDona 我很高兴。增加了一些例子。从我的脑海中拉出来,所以无法保证语法......但你会明白有几种不同的方法可以给猫剥皮;-) 只需根据具体情况选择对你最有意义的一种您需要如何使用其他类中的信息。
  • 传奇!!!我用的是第一个。工作,我在卡住几个小时后进入下一步。再次非常感谢。我真的很感激。
  • @RonaDona 您好,再次意识到您已经用属性封装了您的文本框,因此在示例中添加了一些额外的信息,因为您确实应该使用该机制。不客气,感谢您的接受。
【解决方案2】:

我找到了一个简单的方法来做到这一点。 首先在你的类中创建一个文本框

class class1
   {
   public static TextBox txt1=new TextBox();
   public static void Hello()
     {
      txt1.Text="Hello";
     }
   }

form1 上有一个按钮(button1) 和一个 TextBox(textBox1)。 好的,现在复制您想要的文本框的地址必须更改 我测试了,它可以正常工作

public partial class Form1 : Form
{
 public Form1()
    {
     InitializeComponent();  
    }
 private void button1_Click(object sender, EventArgs e)
     {
      class1.txt1=textBox1;
      class1.Hello();
     }
}

【讨论】:

    【解决方案3】:

    另外,Form1 类的保护级别是多少?这就是我经常遇到问题的地方......我忘记了如果该类不是公共的,那么它之外的类就不能访问它。 “受保护”也可以使用,但这取决于两个类之间的关系。

    【讨论】:

    • +1 值得一提的好观点。 默认 Forms 被明确 定义为public(至少在 Visual Studio 生成的代码中是这样)。这与 classes 通常不同,其保护级别没有显式声明(由 VS 自动声明),因此对于未嵌套的类或 private 如果类嵌套在另一个类中,则隐式声明为 internal。但是,如果没有显式应用访问修饰符,则从 Form 继承的类的行为将与任何其他类一样。
    【解决方案4】:

    我发现在这种情况下,将信息从一种形式传递到另一种形式是将信息保存在类文件中,而不是其自身的形式

    示例 表格一:

    public partial class customerHistory : Form
    {
        private string passtexboxvaluetoclass = "";   
    
    
        // load class dependant.cs
        dependents cls_dependents = new dependents();
    
        public customerHistory()
        {
            InitializeComponent();
        }
    
    private void button1_Click(object sender, EventArgs e)
        {
            dependents.passtexboxvaluetoclass = textbox1.text;
            // load next form
        }
    

    那么我要做的就是在第二个表单上调用 form_load

    label1.text = dependents.passtexboxvaluetoclass;
    

    通过这种方式,您可以调用大量信息,因为它们都将存储在类中,而不是物理形式本身

    【讨论】:

    • 但是您的dependants 被实例化为customerHistory:Form成员,因此无论如何您都不能独立于customerHistory 访问dependants。您的意思是将这个新类实例化为 customerHistory 的对等体吗?
    【解决方案5】:

    您也可以通过在您的类中创建事件并且您的表单订阅该事件并将要更新的数据以EventArgs...传递到 UI 来做到这一点...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多