Как передать форму в качестве параметра методу? (С#)



Я уверен, что получил название ужасно неправильно (не стесняйтесь сделать его правильным), но пример кода прояснит путаницу.



Мне нужно сделать вот что:



    private void a_Click(object sender, EventArgs e)
{
if (abc = "cat")
return;

Form1 f = new Form1(abc);
f.ShowDialog()
}

private void b_Click(object sender, EventArgs e)
{
if (abc = "cat")
return;

Form2 f = new Form2(abc);
f.ShowDialog()
}

private void c_Click(object sender, EventArgs e)
{
if (abc = "cat")
return;

Form3 f = new Form3(abc);
f.ShowDialog()
}


Теперь, как я могу написать один метод, чтобы показать такие формы, передавая сам класс form. Или я порчу саму концепцию классов и объектов? Что-то вроде этого:



   private void ShowForms(Form F)
{
if (abc = "cat")
return;

F f = new F(abc);
f.Showdialog();
}


А затем



    private void a_Click(object sender, EventArgs e)
{
ShowForms(Form1); // I cant pass string abc from here..
}


Спасибо. Я могу прожить и без него, но мне бы очень помогло, если бы я мог один.



EDIT: я немного изменил свой пример, чтобы сделать мое требование более ясным, так как первый ответ не был точно адресован моей проблеме. Извинения.



EDIT2: мой вопрос не в том, как запустить мою программу (это было бы слишком тривиально), а как точно использовать третью общую функцию для отображения форм, передавая форму в качестве аргумента (как описано выше).

832   2  

2 ответов:

Вы можете использовать generics и an interface для достижения этой цели без vs2010 и .net 2.0.

Интерфейс будет выглядеть примерно так:

public interface IAbcForm { public string Abc {get;set;} }

Потому что вам понадобится свойство или метод setter для установки вашего параметра.

Метод ShowForm будет выглядеть следующим образом:

private void ShowForm<T>(string parameter) where T:IAbcForm, new
{
    if(parameter == "cat") return;

    var form = new T();
    form.Abc = parameter;
    form.ShowDialog();
}

Использование будет:

ShowForm<Form1>("abc");
ShowForm<Form2>("abc");
ShowForm<Form3>("abc");

Ваши формы должны будут реализовать интерфейс:

public class Form1 : Form, IAbcForm
{
    // use backing field when .net 2.0 does not support auto properties
    public string Abc { get;set; }

    public Form1() {}

    // I think your current constructor looks something like this:
    public Form1(string abc) { Abc = abc; }
}

}

Есть способ сделать это, но он усложняется, потому что похоже, что вы используете C# v2 (из тега на вопрос).

Измените свой метод ShowForms, чтобы принять экземпляр Func, который может создать экземпляр Form с заданным параметром:

private void ShowForms(Func<string, Form> formCreator)
{
    if (abc == "cat")
    {
        return;
    }

    Form form = formCreator(abc);
    form.ShowDialog();
}

Затем вы можете вызвать его передачу в экземпляре Func , который будет использоваться для создания каждого отдельного экземпляра формы:

private void a_Click(object sender, EventArgs e)
{
    ShowForms(p => new Form1(p));
}

private void b_Click(object sender, EventArgs e)
{
    ShowForms(p => new Form2(p));
}

Поскольку вы используете C# v2, вам также нужно будет объявить Func определение:

public delegate TResult Func<TParameter, TResult>(TParameter parameter);

Если вы можете использовать более позднюю версию C#, вам не нужно будет объявлять эту последнюю часть. Вам, однако, нужно будет скомпилировать это, используя более позднюю версию компилятора (VS2010 должен быть в порядке) - он использует тот факт, что более поздняя версия компилятора понимает синтаксис lamda.

Преимущество этого способа вместо того, чтобы просто создавать форму и передавать ее (например, ShowForms(new Form1(abc));), состоит в том, что форма будет создана только в том случае, если вам нужно это сделать. что-то с ним.

Comments

    Ничего не найдено.