从另一个表单完全访问控件

时间:2016-04-06 06:21:20

标签: c# winforms

我有一个主Windows窗体(From1),其中包含TextBox。我还创建了另一个Windows窗体(FindReplaceForm),我将用它来实现一种查找和替换对话框。我需要在FindReplaceForm窗口的From1中完全访问我的文本框的所有属性和方法。

虽然我将TextBox的修饰符属性设置为Public,但在FindReplaceForm窗口中我无法访问其中的文本。 enter image description here

5 个答案:

答案 0 :(得分:3)

您需要将对控件或表单的引用传递给构造函数,以便可以引用该类的实例。将与调用表单相同类型的参数添加到构造函数:

private Form1 calling_form;

public FindReplaceForm (Form1 calling_form) 

{
    this.InitializeComponent()
    this.calling_form = calling_form;
}

然后在按钮通话中,您可以说:

calling_form.TextBox_value_text.SelectedText = "";

答案 1 :(得分:1)

您可以使用以下方式访问孩子的所有者表单:

((Form1)Owner).textBox1.Text = "blah";

假设您使用以下方式调用了您的子表单:

Form2 form = new Form2();
form.Show(this);

答案 2 :(得分:0)

即使您将文本框访问修饰符设置回private,您也可以简单地将引用传递给第二种形式的构造函数中的textbox,从而启用第二种形式的操作文本框的属性:

第一种形式:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        Form2 frm = new Form2(this.textBox1);
        frm.Show();
    }
}

第二种形式:

public partial class Form2 : Form
{
    private TextBox _OwnerTextBox;

    public Form2(TextBox ownerTextBox)
    {
        InitializeComponent();
        _OwnerTextBox = ownerTextBox;
        this.textBox1.Text = _OwnerTextBox.Text;
    }

    private void textBox1_TextChanged(object sender, EventArgs e)
    {
        _OwnerTextBox.Text = this.textBox1.Text;
    }
}

答案 3 :(得分:0)

在您的代码中,Form1是CLASS,而不是变量。当您显示FindReplaceForm时,您应指定所有者(只需使用this)。 现在,您可以Owner上的FindReplaceForm属性访问Form1。

显示FindReplaceForm

FindReplaceForm.Show(this);

在按钮点击事件中:



void Buttton1_Click(object sender, EventArgs e)
{
  ((Form1)this.Owner).TextBox_value_text.SelectedText = "";
}




答案 4 :(得分:0)

在FindReplaceForm.button1_Click函数中,您想要控制类Form1的对象。代码中的错误说明您不调用Form1类对象的函数,而是调用Form1类本身的函数。后者只能在静态函数上完成

您描述了您有一个现有的Form1对象,并且您的FindReplaceForm需要通过调用Form1中的函数来更改Form1。可能有超过1个Form1对象。因此,您的FindReplaceForm实例需要知道它需要控制哪个Form1对象。有人需要告诉你的FindReplaceForm。这通常使用FindReplaceForm的构造函数或使用属性来完成。

public class FindReplaceForm
{
    private Form1 formToControl = null;

    public FindReplaceForm(Form1 formToControl)
    {
        this.formToControl = formToControl;
    }

    private void OnButton1_Click(...)
    {
        this.formToControl.TextBox_Value_Text.SelectedText = ...
    }

另一种方法是不将formToControl放在构造函数中,而是作为可以单独设置的属性。这两种方法都有其优点:

  • via constructor:你的FindReplaceForm肯定知道总是有一个formToControl。您必须检查formToControl是否确实存在的唯一位置是构造函数。
  • 如果人们忘记设置FormToControl,则使用具有单独FormToControl属性的默认构造函数可能会导致运行时错误。
  • 如果您有很多属性,或者某些属性可能有默认值,或者稍后可能会更改,那么属性方法会更灵活。