如何调用一个只接受另一种形式的参数的方法?
本文关键字:另一种 参数 方法 调用 何调用 一个 | 更新日期: 2023-09-27 18:13:19
我有一个form1(运行程序)和form2(供用户输入的表单)。Form2有一个清除用户输入(文本框、复选框、组合框)的函数。
函数是这样的:
public void CleartheForm(Control groupofcontrols)
{
foreach (Control c in groupofcontrols.Controls)
{
if (c is TextBox)
{
((TextBox)c).Clear();
}
if (c.HasChildren)
{
CleartheForm(c);
}
if (c is CheckBox)
{
((CheckBox)c).Checked = false;
}
label3.Text = "";
comboBox1.SelectedIndex = -1;
comboBox2.SelectedIndex = -1;
}
}
这可以自己工作。在我的主表单上,我需要调用这个函数,它应该是这样的:
我创建一个form2的实例调用Inputform,然后:
private void Addrecord_Click(object sender, EventArgs e)
{
Inputform.ShowDialog();
if(Inputform.Addedrecord == true)
{
Inputform.Addrecord();
Inputform.CleartheForm(WHAT DO I PUT IN HERE??);
}
}
这样,一旦添加了一条记录,输入表单就会自行清除,并准备添加另一条记录。
问题和上面一样,我在里面放什么?我如何从form1调用位于form2中的Inputform.CleartheForm()
中的组控件??我试图在form2的顶部做一个公共控制组控件,然后离开我的form1作为Inputform.CleartheForm(Control groupofcontorls)
,但后来它说我没有对象参考。如果我把它留空,它说Inputform.CleartheForm();
不接受0参数
好吧,如果你想清除所有控件在InputForm你可以写另一个版本的CleartheForm()
没有参数,并调用版本与一个参数,像这样:
public void CleartheForm()
{
ClearTheForm(this); // Passes all the controls in the Form.
}
或者您可以直接调用原始的ClearTheForm(Control)
,将引用传递给InputForm作为参数:InputForm.ClearTheForm(InputForm)
.
如果你总是想清除所有的控件,为了清晰起见,我会写一个单独的无参数方法。
但是,这只在您想要清除InputForm中的所有控件时才有用。
因为Form
继承自Control
,你可以用form作为参数来调用你的方法——它将清除其中所有的TextBoxes
和CheckBoxes
:
Inputform.CleartheForm(Inputform);
但是,您可以简单地创建new(和空!)每次输入form
对于你的方法-你应该写
label3.Text = "";
comboBox1.SelectedIndex = -1;
comboBox2.SelectedIndex = -1;
从你所说的(即你把groupofcontrols作为公共的form2),这应该工作:
Inputform.CleartheForm(Inputform.groupofcontrols);
(这是考虑到Inputform是主窗体上的属性或字段-我观察到它是在它上调用ShowDialog。)
我不明白你的程序的工作流程。
如果是:
- Form1打开Form2
- 用户输入数据到Form2
- 用户按下Form2上的OK键
- Form2关闭
- Form1反映了用户在Form2 中所做的更改
- 用户可以从步骤1开始重复
您应该为每次迭代使用Form2的新实例
要做到这一点,你应该从你的Form2中删除任何清晰的代码,并将你的代码改为下一个:
private void Addrecord_Click(object sender, EventArgs e)
{
var inputForm = new Form2();
inputForm.ShowDialog();
if(inputForm.Addedrecord == true)
{
...Reflect changes here...
}
}
但是如果你需要一个Form2应该保持打开状态,而Form1在每次用户点击Form2上的"确定"按钮时添加新记录
你应该从Form2中调用Form1,下一个设计将会很好
interface IDataTarget
{
void Update(int id, string name); // you should reflect here all of your data
}
class Form1
: Form, IDataTarget
{
public void Update(int id, string name)
{
// add new record here
}
private void AddButton_Click(...)
{
using(var form2 = new Form2(this))
{
form.ShowDialog(this);
}
}
}
class Form2
: Form
{
private readobly IDataTarget dataTarget;
public Form2(IDatatarget dataTarget)
{
this.dataTarget = dataTarget;
}
private OK_Click(...)
{
dataTarget.Update(textBox1.Text, textBox2.Text);
ClearTheControls();
}
}
我个人会把这个方法移到类库中。你可以把它设为静态类然后调用
FromControls.CleartheForm(Inputform.groupOfControls)
所以,你在类库中的新类是(这里没有测试过任何东西,所以很可能出错!)
public static class FormControls
{
public static void CleartheForm(Control groupofcontrols)
{
foreach (Control c in groupofcontrols.Controls)
{
if (c is TextBox)
((TextBox)c).Clear();
if (c.HasChildren)
CleartheForm(c);
if (c is CheckBox)
((CheckBox)c).Checked = false;
}
}
}
我将删除以下代码:
label3.Text = "";
comboBox1.SelectedIndex = -1;
comboBox2.SelectedIndex = -1;
…因为上面的CleartheForm代码会清除它。
因此,您的代码将是(记住添加对类库的引用)
private void Addrecord_Click(object sender, EventArgs e)
{
AddRecord();
}
private void AddRecord()
{
Inputform.ShowDialog();
if(Inputform.Addedrecord)
{
Inputform.Addrecord();
FromControls.CleartheForm(GetControlOnPage())
}
}
private control GetControlOnPage()
{
//logic to return control if needed although it may just be this:
return Inputform.groupofcontrols
}