2

我有一个名为 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";

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

任何帮助将不胜感激

4

5 回答 5

6

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

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

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

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

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

// 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 属性封装了您的文本框。好的。因此,您应该将对您的表单的引用传递给您的其他方法,然后通过属性更新表单的文本。已将此方法添加到上面的示例中。

于 2012-10-14T04:03:26.867 回答
3

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

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();
     }
}
于 2013-02-25T15:04:38.977 回答
1

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

于 2012-10-14T04:05:08.357 回答
0

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

示例表格 1:

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;

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

于 2012-10-14T04:07:23.530 回答
0

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

于 2012-10-14T06:05:02.073 回答