Hardevsinh Mori Ответов: 1

Как получить fata из скрытой формы в текущую форму, если вы не используете MDI?


я работаю над приложением c# windows и не использую контейнер MDI,
мой вопрос заключается в том, как получить данные скрытой формы, как только мы скроем форму,

Для Бывших:
Form1 : форма, которая состоит в том, что значение и оно скрыты после сохранения значений
Form2 : форма, которая в данный момент активирована и нуждается в данных Form1

Как получить или передать данные в этой ситуации,есть идеи?

Форма 2[checknonstd]
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace pms
{
    public partial class checknonstd : Form
    {
       //To Get boxes From Form1
        public string Boxes
        {
            get { return textBox1.Text; }
            set { textBox1.Text = value; }
        }
        // To Get standard KGs From Form1
        public string Kgs
        {
            get { return textBox2.Text; }
            set { textBox2.Text = value; }
        }
        // To Get standard pcs From Form1
        public string Pcs
        {
            get { return textBox3.Text; }
            set { textBox3.Text = value; }
        }
        
        
        public class nonstd
        {
            private IList<int> nboxes;
            private IList<float> nkgs;
            private IList<float> nPcs;
            private IList<string> nremarks;
            public IList<int> BoxesList { get { return nboxes; } set { nboxes = value; } }
            public IList<float> KgsList { get { return nkgs; } set { nkgs = value; } }
            public IList<float> PcsList { get { return nPcs; } set { nPcs = value; } }
            public IList<string> RemarkList { get { return nremarks; } set { nremarks = value; } }

        }

        public checknonstd()
        {
            InitializeComponent();
            dataGridView1.Columns.Add("Boxes", "Boxes");
            dataGridView1.Columns.Add("Kgs","Kgs");
            dataGridView1.Columns.Add("Pcs","Pcs");
            dataGridView1.Columns.Add("Remark", "Remark");

          
        }
 
        //to write datagridview first column 1 as per textbox53 data
        private void checknonstd_Load(object sender, EventArgs e)
        {
            dataGridView1.Rows.Clear();
                int a = Int32.Parse(textBox1.Text);
                for (int i = 0; i < a; i++)
                {
                    dataGridView1.Rows.Add();
                    dataGridView1.Rows[i].Cells[0].Value = "1";
                }
        }

       
        //button to close form
        private void btnclose_Click(object sender, EventArgs e)
        {
            for (int i = 0; i < dataGridView1.Rows.Count - 1;i++ )
            {
                nonstd s=new nonstd();
                s.BoxesList.Add(Int32.Parse(dataGridView1.Rows[i].Cells[0].Value.ToString()));
                s.KgsList.Add(float.Parse(dataGridView1.Rows[i].Cells[1].Value.ToString()));
                s.PcsList.Add(float.Parse(dataGridView1.Rows[i].Cells[2].Value.ToString()));
                s.RemarkList.Add(dataGridView1.Rows[i].Cells[2].Value.ToString());
            }
                MessageBox.Show("1" + textBox1.Text + " 2" + textBox2.Text + " 3" + textBox3.Text);
            this.Hide();
        }

       
        private void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e)
        {
            if(e.ColumnIndex==1)
            {
                var sw = float.Parse(textBox2.Text);
                var sp = float.Parse(textBox3.Text);
                var cvalue=float.Parse(dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Value.ToString());

                var fpcs = (cvalue * sp) / sw;
                dataGridView1.Rows[e.RowIndex].Cells[2].Value = fpcs;
            }
        }
    }
}

<big>Form 1 code To Get Form2 nonstd class data</big>
<pre>private void btnsave_Click(object sender, EventArgs e)
        {
            try
            {
                checknonstd.nonstd ss=new checknonstd.nonstd();
                List<int> list= ss.BoxesList.ToList<int>();
                for(int i=0;i<list.Count;i++)
                {
                    MessageBox.Show(list[i].ToString());
                }
            
            }
            catch(Exception eli)
            {
                MessageBox.Show(eli.Message);
            }
        }


Что я уже пробовал:

я пробовал это сделать, но не думаю, что это правильное решение

из формы 2 textbox1

form2 f=new form2();
f.textBox1.Text


у меня есть trried свойство datagridview, но оно не работает

1 Ответов

Рейтинг:
5

OriginalGriff

Это не сработает - вы создаете новый экземпляр формы, поэтому вы не получите данные, которые есть в форме, которую вы спрятали, так же как если бы вы положили свой мобильный телефон в бардачок моей машины, вы ожидали бы найти его в бардачке своей машины позже!

Вам нужно использовать экземпляр формы, которую вы спрятали. Как именно, зависит от" отношения " между этими двумя формами.
Взгляните на них, один из них подойдет
Форма, которая создает экземпляр другого:

MyForm mf = new MyForm();
mf.Show();
Это "родитель", другая форма - "Ребенок".
(Это не подразумевает каких-либо формальных отношений MDI)

Передача информации между двумя формами, Часть 1: Родитель-Ребенок[^]
Передача информации между двумя формами, Часть 2: Ребенок-Родитель[^]
Передача информации между двумя формами, Часть 3: Ребенок ребенку[^]

Цитата:
если я закрою форму, то как я могу получить доступ к этим данным, когда они не были заполнены

Закрытие формы не "убивает" ее или содержащиеся в ней данные - этого не происходит до тех пор, пока форма не будет удалена.
Подумайте об этом: когда вы открываете диалоговое окно файла, вы используете модальное шоу:
OpenFileDialog ofd = new OpenFileDialog()
if (ofd.ShowDialog() == DialogResult.OK)
   {
   string path = ofd.FileName;
   ...
   }
Поскольку ShowDialog не возвращается до тех пор, пока диалоговое окно не будет закрыто, если бы данные в диалоговом окне были недоступны, вы вообще никогда не смогли бы получить путь к файлу!

То же самое происходит и с вашими формами: закрытие формы ничего не делает с ее данными - она просто освобождает все дескрипторы и другие ресурсы, чтобы их можно было переработать (они являются дефицитными ресурсами в Windows, и "засорять их" - плохая идея).
Таким образом, тот же код работает и с вашей формой:
MyForm mf = new MyForm()
if (mf.ShowDialog() == DialogResult.OK)
   {
   MyClass data = mf.TheDataINeed;
   ...
   }


[no name]

но я хочу получить данные дочерней формы datagridview в родительскую форму в виде сводки, а не из базы данных.

OriginalGriff

Почему Источник так важен? Это просто DataTable или что - то подобное-дочерняя форма "знает", какая информация требуется, поэтому она предоставляет ее через свойство, когда ее спрашивают.

[no name]

то, что я пытаюсь сделать, - это когда пользователь вводит в текстовое поле дочернюю форму, и когда пользователь нажимает на кнопку(на дочерней форме), дочерняя форма будет скрыта, а родительская форма получит данные datagridview(скажем, datatable), например, сколько строк в datagridview и т. д..

OriginalGriff

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

Это звучит сложно, но на самом деле это не так. Посмотрите на Часть 2 - это не сложно!

[no name]

абсолютно идеальный и правильный ответ, Хорошо не использовать публичный модификатор, и это также просто, чем любое другое решение, Спасибо, сэр, как всегда спасибо.

OriginalGriff

Пожалуйста!

[no name]

Я могу послать родителей данных для формирования ребенка в соответствии с частью 2 способ.

OriginalGriff

Нет, вы используете Часть 1!

[no name]

Я хочу после заполнения данных в datagridvew пользователь нажимает на кнопку, и только скрывают, через некоторое время, когда пользователь нажимает на кнопку на родительской форме, что я хочу использовать элемент данных, в настоящее время дочерняя форма открывается, когда пользователь введите значение

Поток данных-это:
От Родителя К Ребенку
От Ребенка К Родителю

Родитель будет использовать дочерние данные datagridview во время события нажатия кнопки

OriginalGriff

Затем сохраните ссылку на форму, когда вы ее откроете, и используйте ее для доступа к свойству.
Или лучше не прятать форму, а закрыть. А потом получить информацию и сохранить ее на потом. "Удержание" формы (со всеми ее оконными дескрипторами и подобными ресурсами) неэффективно только для того, чтобы получить доступ к данным позже в вашем приложении. Таким образом, вы можете использовать ShowDialog вместо Show и "направлять" пользователя, чтобы дать вам необходимую информацию.

[no name]

если я закрою форму, то как я могу получить доступ к этим данным, когда они не были заполнены

OriginalGriff

Ответ обновлен.

[no name]

Извините сэр но я действительно не понимаю как подразумевать этот код или использовать его в моей ситуации

OriginalGriff

Какая часть создает проблемы?
Чем вы сейчас занимаетесь? Какой код вы используете и почему?

[no name]

Form1: хочет получить данные datagridview формы 2 и
Form2: имеет datagridview для получения значений в табличном формате от пользователя
Процесс:
- >Form1 показывает диалог From2, когда пользователь входит в текстовое поле

- и GT; теперь пользователь будет писать manully в datagridview и он/она будет закрыть форму Form2

- и GT; теперь, по прошествии некоторого времени form1 для нужд управления datagridview данные, записанные вручную на форме Form2

OriginalGriff

Так почему же ты не можешь понять, что делать? у вас в значительной степени есть точный код, который вам нужен.
Я не пытаюсь быть раздражающим здесь - Помните, что я не могу видеть ваш экран, получить доступ к вашему жесткому диску или прочитать ваши мысли - просто пытаюсь понять, какая помощь вам нужна, кроме того, что я прыгаю в самолет в течение 12 часов, чтобы посмотреть через ваше плечо и сказать "этот бит". :смеяться:

[no name]

Я знаю, что вы беспокоитесь, но я не знаю, почему я не могу получить вас? я тоже смеюсь с этой стороны над своими глупыми комментариями. извиняюсь

OriginalGriff

Итак, у вас есть код для создания Form2 и его отображения, да?
Копировать-Н-'paste его.

[no name]

у меня есть улучшенный вопрос.

OriginalGriff

OK-ShowDialog-это модальный, или" блокирующий " вызов - он не возвращается до тех пор, пока форма не будет закрыта (не скрыта, закрыта - есть большая разница).

Таким образом, сразу после вызова ShowDialog вы можете использовать свойство в checknonstd через переменную ss для доступа к данным. Все, что вам нужно сделать, это собрать его вместе и вернуть. - Я? Я бы использовал класс для хранения всех трех элементов данных и вернул бы их коллекцию - возможно, список - вместо того, чтобы возиться с тремя отдельными строками.

Но сделай себе пару одолжений:
1) прекратите использовать имена Visual Studio по умолчанию для всего - вы можете помнить, что" TextBox8 " - это номер мобильного телефона сегодня, но когда вам нужно будет изменить его через три недели, вы это сделаете? Используйте описательные имена - например, "tbMobileNo" - и ваш код станет легче читать, более самодокументируемым, более легким в обслуживании-и на удивление быстрее кодировать, потому что Intellisense может добраться до" tbMobile "за три нажатия клавиш, где" TextBox8 " занимает размышление и 8 нажатий клавиш...
2) Если вы считаете, что 50+ текстовых полей в одной форме-это хорошая идея, ваши пользователи будут ненавидеть вас. И у вас также будут проблемы с различными разрешениями экрана... Никогда не ожидайте, что пользователи будут обрабатывать столько данных сразу: разбивать их на отдельные страницы, или вкладки, или что - то еще-но одна форма с таким количеством данных-это Пита для работы.

[no name]

я уважаю вас, сэр, и благодарю за прекрасные предложения, и вы также знаете, что я новичок и у меня нет большого опыта работы с c#(два года).

[no name]

Извините @OriginalGriff Сэр, я снова беспокою вас, как я могу получить данные datagridview, значения которых могут быть более одного за раз.

OriginalGriff

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

public class IHaveNoIdeaWhatTheseAreUsedForSoICantGiveItASensibleName
   {
   public string Boxes {get; set;}
   public string Boxes {get; set;}
   public string Boxes {get; set;}
   }

и создайте свойство checknonstd, которое возвращает их список.
Геттер свойств создает список и заполняет его из DataGridView; таким образом, элементы управления никогда не отображаются вне формы.

Есть ли в этом смысл?

[no name]

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

OriginalGriff

:вздыхать:
Ты сравнил свой код с моим?
Почему ваш так дико отличается? Я полагаю, вы знаете, как использовать классы , или это придет позже в вашем курсе?

[no name]

я сожалею, что не могу понять, пожалуйста, объясните, если можете

[no name]

Да.

[no name]

Извините, но я получил свое решение по-своему, извините за то, что потратил ваше драгоценное время @OriginalGriff, сэр. Спасибо, что проявили интерес к этому вопросу.

Я навсегда ухожу из проекта кода. Я больше никогда тебя не побеспокою

Я рад обсудить это с вами

OriginalGriff

Не уходи, просто учись! :смеяться:
Если я вас расстроил, то прошу прощения - у меня сегодня очень раздражительное утро...

Посмотрите на свой новый класс и на мой: почему ваш состоит из объектов IList? Вам это не нужно, вам нужен класс, который содержит по одной строке для каждой из отображаемых вами строк. Затем вы добавляете в форму свойство, которое возвращает список экземпляров этого класса.

Имеет ли это смысл до сих пор?

[no name]

нет, сэр, вовсе нет, я уважаю вас, я не дурак, чтобы уйти из-за какого-то глупого вопроса, потому что я хочу выучить правильный c#, а затем попытаться сделать что-то " ".

OriginalGriff

Если вы хотите выучить C#, возьмите книгу - или лучше курс (вы можете задавать вопросы преподавателю, когда не понимаете, что вы не можете сделать с книгой)
Чему вы сейчас учитесь?

[no name]

я никогда не жду от вас, чтобы дать мне код и всегда хочу от любого эксперта правильное направление, чтобы сделать код.

[no name]

я занимаюсь MCA в Университете ИГНОУ, и мой любимый язык-c# , а в extra я также знаю java,php,c, c++(все базовые знания), но я хочу узнать больше c#.
В настоящее время я работаю над ежедневной производственной системой, поэтому задаю весь этот вопрос.
Я думаю, что вижу себя вашим учеником, а вы-учителем , это большой опыт общения с вами

[no name]

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

OriginalGriff

:смеяться:
Здесь такой системы нет: в настоящее время в бета-версии есть система "Follow", но она этого не делает и почти наверняка не сделает в будущем.
И здесь есть гораздо лучшие авторы, чем я!

[no name]

нет, я не думаю... для меня это только ты