这对大多数人来说可能是一个相当容易的问题,但我只是一个初学者而且真的很好奇。我试图将Form1(Windows窗体..)转换为函数的参数,以及其他形式(Say,Form2)。
我有一个类,其中包含所有表单按钮最常用代码的代码。
我目前尝试的代码是打开一个新表单并隐藏前一个表单:
public static void navigationButton(Form currentForm, Form nextForm)
{
currentForm.Hide();
nextForm form = new nextForm();
form.Show();
}
我得到的错误是nextForm form = new nextForm()
,其中' nextForm是一个变量,但用作类型。'
我试图这样做,所以我不必一遍又一遍地执行三行代码,我可以写一些像navigationButton(Form1, Form2)
这样的东西。
使Windows窗体成为参数的正确方法是什么?或者这个想法是无效的?
答案 0 :(得分:1)
您应该只使用第二个表单参数,如下所示:
Navigate(activeForm, new Form2());
然后你应该这样称呼它:
interface Classroom<T> {
someAction: (cb: ActionCb<T>) => void;
}
type ActionCb<T> = (state: T) => T;
type User = {
name: string;
age: number;
}
答案 1 :(得分:1)
让我给出答案(我不能100%正确,但......)
所以,让我们看看你的代码。
public static void navigationButton(Form currentForm, Form nextForm)
{
currentForm.Hide();
nextForm form = new nextForm();
form.Show();
}
首先,nextForm form = new nextForm()
中有错误,因为nextForm是Form类的对象。其次,生成的表单对象将被标记为gc并在未确定的时间/方式中被销毁(因此,如果我没有记错),因为您不会回复任何关于它的引用。
第三,最好为你的代码创建“语法糖”。
所以,让我们以可能的方式重写它:
public static void NavigationButton(this Form currentForm, out Form nextForm)
{
currentForm.Hide();
nextForm = new Form();
nextForm.Show();
}
你可以用同样的方式调用你的代码:
Form testForm;
myForm.NavigationButton(out testForm);
更新1: 在C#7.0中,您可以用相同的方式编写代码的最后一部分:
myForm.NavigationButton(out Form testForm);
更新2: 如果要创建“广泛”的语法糖,请使用以下代码:
public static void NavigationButton<T>(this Form currentForm, out Form nextForm) where T: Form
{
currentForm.Hide();
nextForm = (T)Activator.CreateInstance(typeof(T));
nextForm.Show();
}
myForm.NavigationButton<Form2>(out Form2 testForm);
(适用于C#7.0)或
Form2 testForm;
myForm.NavigationButton<Form2>(out testForm);
一般。
答案 2 :(得分:1)
我们假设您有两种形式;我们将它们称为formIndex和formNext。
如果我理解正确,您在formIndex中有一个按钮,单击该按钮然后会打开一个新窗口。我们将按下按钮1。
private void button1_Click(object sender, EventArgs e) {
// User clicks on button, close this form, open next
NavigateToNextForm(this, new FormNext(this));
// Call next method with instance of current object and new form
// Passing current instance to next form, so we can navigate back
}
internal void NavigateToNextForm(Form formIndex, Form formNext) {
// Assuming you want to return back to this form,
// we'll just hide the window
formIndex.Hide();
// Now we'll show the next one
formNext.Show();
}
当然,根据您想要实现的目标,您可能需要等到下一个表单关闭(并且可能返回一个DialogResult)。
在这种情况下,您可以使用async-await模型和Task.Run(Action)。