如何访问另一个表单的表单控件?

时间:2011-01-27 23:01:24

标签: c# winforms controls

我有两个Form个类,其中一个有ListBox个。我需要SelectedIndex ListBox属性的setter,我想从第二个Form调用。

目前我正在做以下事情:

表单1

public int MyListBoxSelectedIndex
{
     set { lsbMyList.SelectedIndex = value; }
}

表格2

private ControlForm mainForm; // form 1

public AddNewObjForm()
{
     InitializeComponent();
     mainForm = new ControlForm();           
}

public void SomeMethod()
{
     mainForm.MyListBoxSelectedIndex = -1;
}

这是最好的方法吗?

6 个答案:

答案 0 :(得分:22)

让他们成为单身人士并不是一个完全糟糕的主意,但我个人不喜欢这样做。我宁愿将一个引用传递给另一个表单。这是一个例子。

Form1触发Form2打开。 Form2重载了构造函数,它将调用form作为参数,并提供对Form2成员的引用。这解决了通信问题。例如,我在Form1中将Label Property公开为public,并在Form2中进行了修改。

通过这种方法,您可以以不同的方式进行沟通。

<强> Download Link for Sample Project

// 您的Form1

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

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

    public string LabelText
    {
        get { return Lbl.Text; }
        set { Lbl.Text = value; }
    }
}

// 您的Form2

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

    private Form1 mainForm = null;
    public Form2(Form callingForm)
    {
        mainForm = callingForm as Form1; 
        InitializeComponent();
    }

    private void Form2_Load(object sender, EventArgs e)
    {

    }

    private void button1_Click(object sender, EventArgs e)
    {
        this.mainForm.LabelText = txtMessage.Text;
    }
}

alt text http://demo.ruchitsurati.net/files/frm1.png

alt text http://demo.ruchitsurati.net/files/frm2.png

答案 1 :(得分:3)

我通常使用Singleton设计模式来实现这样的http://en.wikipedia.org/wiki/Singleton_pattern。我将创建应用程序在单例下运行的主窗体,然后创建我希望在其他区域中触摸的窗体和控件的访问器。然后,其他表单可以获得指向他们想要修改的控件的指针,也可以获取他们希望更改的应用程序主要部分中的数据。

另一种方法是在不同的表单上设置事件进行通信,并使用主表单作为排序的中心,将事件消息从一个表单传递到应用程序中的另一个表单。

答案 2 :(得分:2)

访问表单的控件,如下所示:

formname.controls[Index]

您可以转换为适当的控件类型,例如:

DataGridView dgv = (DataGridView) formname.Controls[Index];

答案 3 :(得分:2)

这很简单,首先你可以像这样访问另一个表单: (假设你的另一种形式是asdasdasdads<one or more spaces>

Form2

就是这样,你只需在//in Form 1 Form2 F2 = new Form2(); foreach (Control c in F2.Controls) if(c.Name == "TextBox1") c.Text = "hello from Form1"; 的{​​{1}}中写TextBox1

答案 4 :(得分:1)

还有一种方法,如果你不想像Joe Dabones所说的那样循环通过“ALL”控件。 在Form2中创建一个函数并从Form1中调用它。

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

    public void SetIndex(int value)
    {
        lsbMyList.SelectedIndex = value;
    }
}

public partial class Form1 : Form
{
    public Form2 frm;

    public Form1()
    {
        InitializeComponent();
    }

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

    private void button1_Click(object sender, EventArgs e)
    {
        frm.SetIndex(Int.Parse(textBox1.Text));
    }
}

答案 5 :(得分:0)

如果ChildForm要访问ParentForm

ParentForm实例传递给ChildForm构造函数。

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

    public string ParentProperty{get;set;}

    private void CreateChild()
    {
         var childForm = new ChildForm(this);
         childForm.Show();
    }
}

public partial class ChildForm : Form
{
    private ParentForm parentForm;

    public ChildForm(ParentForm parent)
    {
        InitializeComponent();

        parentForm = parent;
        parentForm.ParentProperty = "Value from Child";
    }   
}