Передача данных из формы B в форму A не работает - PullRequest
0 голосов
/ 02 марта 2019

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

Моя попытка

Форма A Часть кода

private void addevid_Click(object sender, EventArgs e)
{
    Form frm = new add_thing();

    if(frm.ShowDialog() == System.Windows.Forms.DialogResult.OK)
    {
        //do things while using the input
        Console.WriteLine(path); //for debugging reasons
    }
}

Форма B

public partial class add_thing : Form
{
    public string piccpath1 { get; set; }
    public string piccpath2 { get; set; }
    public string description { get; set; }
    public string titlee { get; set; }

    public add_thing()
    {
        InitializeComponent();
        path = piccpath1;
        path2 = piccpath2;
        description = desc;
        titlee = title;
    }

    private void button1_Click(object sender, EventArgs e)
    {
        if (openFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK)
        {
            string picpath = openFileDialog1.FileName;
            pictureBox1.Image = Image.FromFile(picpath);
            string[] extract = Regex.Split(picpath, "evidence");
            string pipath2 = Regex.Replace(extract[1], "evidence", "");
            piccpath1 = picpath;
            piccpath2 = pipath2; 
        }
    }

    private void button3_Click(object sender, EventArgs e)
    {
        description = richTextBox1.Text;
        titlee = textBox1.Text;
        this.DialogResult = DialogResult.OK;
        this.Close();
    }
}

Заранее спасибо!
Центов

Ответы [ 2 ]

0 голосов
/ 03 марта 2019

Это один из возможных способов, возможно, не наибольший , для чтения значений свойств, заданных в форме (форма с именем add_thing здесь) из другой формы (FormA).

Поскольку в FormA вы создаете новый экземпляр add_thing, вы можете подписаться на его событие FormClosing(), которое будет вызвано, когда форма будет закрыта, до DialogResult установлено.
Обратите внимание, что для подписки на событие используется Lambda: frmAddThing.FormClosing += (obj, evt) => { }.
Конечно, вы можете использовать стандартный обработчик событий, если вам не нравится этот синтаксис.

Я предложил событие FormClosing для обработки этого обмена , потому что FormClosingEventArgs дает вам возможность отменить событие, поэтому форма не закроется, если потребуется,Поскольку Dialog не знает , как использовать эти пути, у вас есть второй шанс показать уведомление, например.

В обработчике событий мы можем прочитать значения открытых свойств до закрытия формы.
Если результат add_thing равен DialogResult.OK, то сделать что-то с обновленнымценности.

Другой, возможно, лучший способ заключается в использовании интерфейса INotifyPropertyChanged для уведомления подписчиков об изменении значения свойства.
Или что-то подобное, как вы можете увидеть в этом вопросе.:
Как я могу сделать так, чтобы значение переменной отслеживало значение другого

В любом случае, это могут быть изменения, применяемые к текущим классам без изменения большей части того, что уже естьтам:

В FormA (звонящий):

public partial class FormA : Form 
{
    string frmAddThingPath1 = string.Empty;
    string frmAddThingPath2 = string.Empty;
    string frmAddThingDescription = string.Empty;

    private void addevid_Click(object sender, EventArgs e)
    {
        add_thing frmAddThing = new add_thing();

        frmAddThing.FormClosing += (obj, evt) => {
            this.frmAddThingPath1 = frmAddThing.piccpath1;
            this.frmAddThingPath2 = frmAddThing.piccpath2;
            this.frmAddThingDescription = frmAddThing.description;

            //If something is wrong with these paths, you can set 
            //e.Cancel = true and notify to 'start again'
        };

        ClearDialogResults();

        if(frmAddThing.ShowDialog() == DialogResult.OK) {
            //On Form closed, do something with the results
            Console.WriteLine(this.frmAddThingPath1);
        }
        frmAddThing.Dispose();
    }

    private void ClearDialogResults()
    {
        frmAddThingPath1 = string.Empty;
        frmAddThingPath2 = string.Empty;
        frmAddThingDescription = string.Empty;
    }
}

В форме add_thing:

public partial class add_thing : Form
{
    public string piccpath1 { get; set; }
    public string piccpath2 { get; set; }
    public string description { get; set; }
    public string titlee { get; set; }

    public add_thing() => InitializeComponent();

    private void button1_Click(object sender, EventArgs e)
    {
        if (openFileDialog1.ShowDialog() == DialogResult.OK) {
            string picPath = openFileDialog1.FileName;
            pictureBox1.Image = (Bitmap)Image.FromFile(picpath).Clone();
            string[] extract = Regex.Split(picpath, "evidence");
            string piPath2 = Regex.Replace(extract[1], "evidence", "");
            this.piccpath1 = picPath;
            this.piccpath2 = piPath2; 
        }
    }

    private void button3_Click(object sender, EventArgs e)
    {
        this.description = richTextBox1.Text;
        this.titlee = textBox1.Text;
        this.DialogResult = DialogResult.OK;
    }
}
0 голосов
/ 03 марта 2019

Спасибо @TnTinMn за то, что я понял эту глупую ошибку, вот функциональный код для любого, кто увидит это в будущем:

Форма A Рабочая часть кода

private void addevid_Click(object sender, EventArgs e)
        {                       add_thing frm = new add_thing();          
            if (frm.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {                
                Console.WriteLine(frm.piccpath1); //It works!!
            }

        }

Рабочий код формы B

namespace CC_Case_Maker
{
    public partial class add_thing : Form
    {
        public string piccpath1 { get; set; }
        public string piccpath2 { get; set; }
        public string description { get; set; }
        public string titlee { get; set; }

        public add_thing()
        {
            InitializeComponent();


        }

        private void label1_Click(object sender, EventArgs e)
        {

        }

        private void button1_Click(object sender, EventArgs e)
        {
            if (openFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                string picpath = openFileDialog1.FileName;
                pictureBox1.Image = Image.FromFile(picpath);
                string[] extract = Regex.Split(picpath, "evidence");
                string pipath2 = Regex.Replace(extract[1], "evidence", "");
                piccpath1 = picpath;
                piccpath2 = pipath2;

            }

        }

        private void button3_Click(object sender, EventArgs e)
        {
            description = richTextBox1.Text;
            titlee = textBox1.Text;
            this.DialogResult = DialogResult.OK;
            this.Close();
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...