你如何使(Windows)表格成为一个参数?

时间:2017-12-13 08:58:30

标签: c# winforms

这对大多数人来说可能是一个相当容易的问题,但我只是一个初学者而且真的很好奇。我试图将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窗体成为参数的正确方法是什么?或者这个想法是无效的?

3 个答案:

答案 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)。