2 разные формы, которые могут открывать форму3 - PullRequest
0 голосов
/ 19 февраля 2012

* Я не могу понять, как разрешить, чтобы form1 передавалась в form3 и form2, чтобы можно было также передавать в form3.ПОЖАЛУЙСТА, ПОМОГИТЕ!

он имеет эту ошибку: не содержит конструктора, который принимает аргумент '1' в строках ff:

f3 = new Form3 (this); в Форме 1

f3 = новая Форма 3 (это); в форме 2

Вот коды:

Базовая форма (выберите форму 1 или форму 2):

namespace WindowsFormsApplication1
{
    public partial class baseform : Form
    {
        Form1 f1;
        Form2 f2;

        public baseform()
        {
            InitializeComponent();
            f1 = new Form1(this);
            f2 = new Form2(this);
        }

        private void baseform_Load(object sender, EventArgs e)
        {

        }

        private void button2_Click(object sender, EventArgs e)
        {
            f1.Show();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            f2.Show();
        }
    }
}

Форма 1:

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
            baseform bf;
            Form3 f3;

            public Form1(baseform bf1)
            {
                    InitializeComponent();
                    f3 = new Form3(this);
                    bf = bf1;
            }

            private void button1_Click(object sender, EventArgs e)
            {

            }
    }
}

Форма 2:

namespace WindowsFormsApplication1
{
    public partial class Form2 : Form
    {
            baseform bs;
            Form3 f3;

            public Form2(baseform bs1)
            {
                    InitializeComponent();
                    f3 = new Form3(this);
                    bs = bs1;
            }

            private void button1_Click(object sender, EventArgs e)
            {

            }
    }
}

Форма 3:

namespace WindowsFormsApplication1
{
    public partial class Form3 : Form
    {
            Form1 f1;
            Form2 f2;

            public Form3(Form1 f1a, Form2 f2a)
            {
                    InitializeComponent();
                    f1 = f1a;
                    f2 = f2a;
            }

            private void Form3_Load(object sender, EventArgs e)
            {

            }
    }
}

Ответы [ 5 ]

1 голос
/ 19 февраля 2012

Ну, вы единственный конструктор в классе Form3 имеет два аргумента:

public Form3(Form1 f1a, Form2 f2a)

но в обоих местах вы пытаетесь назвать его только одним:

f3 = new Form3(this);

Итак, либо вызовите его с двумя аргументами (возможно, null?), Либо создайте конструктор (или два), который принимает один аргумент. В первом случае вам понадобится:

f3 = new Form3(this, null);

при звонке с Form1 и:

f3 = new Form3(null, this);

при звонке с Form2

0 голосов
/ 19 февраля 2012
            //This code is placed where you want to Switch Back to Form 1, so 
            // wherever in Form2 that you determine you have completed using Form2, such as
            // a submit button or whatever... 

            private void submitButton_Click(object sender, EventArgs e)
            {
                Form1 switchBack = (Form1)Application.OpenForms["Form1"];
                switchBack.childFormMethodCall(submitItemTextBox.Text);
            }

            //Then in Form1.cs, define the Method you wish to call from the second Form
            //In my case, I did a simple method called childFormMethodCall with a single passed
            //in parameter, a string 
            //I then set the string that was Passed in from Form2 as the Text for richTextBox1
            //richTextBox1 is located on Form1

            internal void childFormMethodCall(string p)
            {
                richTextBox1.Text = p; 
            }
0 голосов
/ 19 февраля 2012

Вы пытаетесь создать форму 3 с конструктором с 1 параметром.

  f3 = new Form3(this);

Но ваш конструктор в Form3 определен для 2 параметров

   public Form3(Form1 f1a, Form2 f2a)

измените ваш код на это.

0 голосов
/ 19 февраля 2012

Проще говоря, ошибка довольно очевидна: Form3 не имеет конструктора, который принимает один аргумент.Это может принимать только 2 аргумента.

Однако ваша проблема глубже.Самый простой обходной путь для вашей проблемы - сделать поля статичными, а затем добавить дополнительный метод для их инициализации:

public partial class Form3 : Form
{
    static Form1 f1;
    static Form2 f2;

    public Form3()
    {
        InitializeComponent();
    }

    public static void InitForms(Form1 f1a, Form2 f2a)
    {
        f1 = f1a;
        f2 = f2a;
    }

    private void Form3_Load(object sender, EventArgs e)
    {   
        //use f1 and f2...
    }
}

Затем получите следующее:

    public baseform()
    {
        InitializeComponent();
        f1 = new Form1(this);
        f2 = new Form2(this);
        Form3.InitForms(f1, f2);
    }
0 голосов
/ 19 февраля 2012

У вас есть циклические ссылки здесь.Я предлагаю вместо параметров конструктора использовать открытые свойства, чтобы каждая форма знала о других формах.Прежде чем делать что-либо с такой ссылкой, проверьте, назначен ли он (! = Null).Сначала необходимо создать все формы, а затем назначить их свойства для установления ссылок.

public partial class Form3 : Form
{
    public Form1 f1 { get;set;}
    public Form2 f2 { get;set;}

    ...

    private void button1_Click(object sender, EventArgs e)
    {
        if(f1 != null)
            f1.Show();
    }
}

Затем сделайте это:

Form f1 = new Form1();
Form f2 = new Form2();
Form f3 = new Form3();
f3.f1 = f1;
f3.f2 = f2;

Следуйте этому шаблону и для других форм.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...