我正在使用winform和c#。
我有formA和formB。 formB是一个较小的窗口,有一个文本框和一个按钮,用于保存文本框中写入的内容。
因此我在formB中调用了一个在formA中定义的类的保存函数。我该怎么做?
谢谢,
Ĵ
答案 0 :(得分:1)
如果此对象位于表单A 中,请执行以下操作:
// In Form A
MyThing thing = new MyThing();
然后在表单上创建一个公共属性,以便从其他任何地方访问它:
// still in Form A
public void InvokeSave() {
myThing.Save();
}
从表单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
中读取它