我有一个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()
中的groupofcontrol?我试图在form2的顶部创建一个公共Control groupofcontrols,然后将我的form1保留为Inputform.CleartheForm(Control groupofcontorls)
,但后来它说我没有对象引用。如果我把它留空,它说Inputform.CleartheForm();
不会引起争论。
答案 0 :(得分:0)
好吧,如果您想清除所有 InputForm中的控件,您可以编写另一个版本的CleartheForm()
而不带参数,并使用调用版本来自它的参数,如下:
public void CleartheForm()
{
ClearTheForm(this); // Passes all the controls in the Form.
}
或者您可以调用原始ClearTheForm(Control)
将对InputForm的引用作为参数传递:InputForm.ClearTheForm(InputForm)
。
如果你总是想要清除所有控件,为了清楚起见,我会写一个单独的无参数方法。
但是,这仅在您想要清除InputForm中的所有控件时才有用。
答案 1 :(得分:0)
由于Form
是从Control
继承的,因此您可以使用表单作为参数调用您的方法 - 它将清除其中的所有TextBoxes
和CheckBoxes
:
Inputform.CleartheForm(Inputform);
但是,可能每次只需创建一个新的(和空!)Inputform。
而且,对于你的方法 - 你应该把
label3.Text = "";
comboBox1.SelectedIndex = -1;
comboBox2.SelectedIndex = -1;
远离循环。
答案 2 :(得分:0)
根据你的说法(即你将groupofcontrols公开放在form2上),这应该有效:
Inputform.CleartheForm(Inputform.groupofcontrols);
(这是考虑到Inputform是主窗体上的属性或字段 - 我发现它就像你在其上调用ShowDialog一样。)
答案 3 :(得分:0)
我不了解你的程序的工作流程。
如果是:
您应该为每次迭代使用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();
}
}
答案 4 :(得分:0)
我个人会将此方法移动到类库中。您可以将其设为静态类,然后调用
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
}