如何从不同的形式调用同一对象的函数?

时间:2010-10-20 05:06:47

标签: c# winforms

我正在使用winform和c#。

我有formA和formB。 formB是一个较小的窗口,有一个文本框和一个按钮,用于保存文本框中写入的内容。

因此我在formB中调用了一个在formA中定义的类的保存函数。我该怎么做?

谢谢,

Ĵ

8 个答案:

答案 0 :(得分:1)

表格A

如果此对象位于表单A 中,请执行以下操作:

// In Form A
MyThing thing = new MyThing();

然后在表单上创建一个公共属性,以便从其他任何地方访问它:

 // still in Form A

public void InvokeSave() {
    myThing.Save();
}

表格B

表单B 内部,您可以调用表单A方法,如下所示:

// Inside Form B

void myButton_Click(..) {
    formAReference.InvokeSave();
}

您必须在某处保留对原始表单的引用 - 这就是我所命名的 formAReference


有多种方法可以在winforms之间传递对象和进行调用。例如,只需谷歌“passing objects between winforms”并选择适合您应用的情况。请记住,winform是一个.NET对象,因此适用于在纯.NET对象之间传递数据和消息的相同概念也适用于winforms。

代码项目中的教程/示例

<强>摘要

您已成功通过表单A上的公共方法从表单B内部访问合成到表单A的对象。您可以从任何位置访问该方法。

答案 1 :(得分:0)

发送对包含该函数的类的引用。像新表格(参考类参考)

答案 2 :(得分:0)

创建对象以形成一个类。如果声明的方法不是私有的,则可以访问。

formA aObj = new formA(); 
aObj.SaveMethod(); // consider `SaveMethod()` is a public in `formA`

答案 3 :(得分:0)

更新: 你可以试试下面的代码。 FormA代码: (在FormA的任何方法中编写此代码,例如FormA上的任何按钮,您可以在该按钮的单击事件中编写它)

            StringBuilder bankName = new StringBuilder();
            FormB objFormBsaveBank = new FormB(bankName);
            objFormBsaveBank.ShowDialog();

           // Text in textbox of the FormB can be access from here and can be stored in any variable
           string bankname = bankName.ToString();

FormB的代码:

public class FormB : Form
   {

    StringBuilder bankName;

    // Constructore for FormB
    public FormB(StringBuilder bankName)
    {
        InitializeComponent();
        this.bankName = bankName;
    }

    // click event for button which is on the FormB
    private void button1_Click(object sender, EventArgs e)
    {
        // name of textbox which is on FormB is "BankNameTextBox"
        this.bankName.Append(BankNameTextBox.Text);           
        this.Close();
    }
}

答案 4 :(得分:0)

到目前为止,我已经看到人们建议使用静态字段并传递对主窗体的引用。没有理由这样做。传递对mainform的引用可能适用于小型的一次性应用程序,但对于“真正的”应用程序,它可能会导致维护问题。

这是使用活动的好地方。在您的子表单类中公开一个名为SaveData的事件。即使创建子表单并从那里根据需要更新UI,您的mainform类也可以处理它。没有静态数据,没有不必要的封装破坏。

一个例子:

class SaveDataEventArgs : EventArgs
{
    public readonly string Data;
    public SaveDataEventArgs( string data )
    {
        Data = data;
    }
}

class ChildForm
{
    public event EventHandler<SaveDataEventArgs> SaveData

    void button_Click( ... )
    {
        OnSaveData( new SaveDataEventArgs( textbox1.Text );
    }

    protected virtual void OnSaveData( SaveDataEventArgs e )
    {
        EventHandler<SaveDataEventArgs> del = SaveData;
        if( del != null )
        {
            SaveData( this, e );
        }
    }
}

class Form1 : Form
{
    void ShowChildForm( )
    {
        using( ChildForm frm = new ChildForm() )
        {
            frm.SaveData += frm_SaveData;
            frm.ShowDialog();
        }
    }

    void frm_SaveData( object sender, SaveDataEventArgs e )
    {
        label1 = e.Data;  // data from the child form, do what you need to do with it
    }
}

答案 5 :(得分:0)

Hay John ...,如果我说得对,那么为什么不在formB中创建该类的新实例(在formA中定义)然后调用save方法..?

我帮你找对了吗?

答案 6 :(得分:0)

你好john ........ 最简单的方法是吼叫

string returnValue = Application.OpenForms["OpenFormName"].Controls["ControlName"].Text 

答案 7 :(得分:-1)

为什么不使用静态字段?这是传递信息的简便方法。当您单击保存按钮时,它会将其保存到静态类,然后您将从formB

中读取它