Передача объекта из одной формы окна в другую

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

        LookupModelType="";
        if (e.KeyCode.Equals(Keys.F3))
        {
            foreach (Form frm in Application.OpenForms)
            {
                if (frm is FormControllers.Lookup)
                {
                    if (frm.WindowState == FormWindowState.Minimized)
                    {
                        frm.WindowState = FormWindowState.Normal;
                        frm.Focus();
                        return;
                    }
                }
            }
                LookupModelType = "Product";
                FormControllers.Lookup newLookUp = new FormControllers.Lookup(LookupModelType);                
                newLookUp.ShowDialog(this);
        }

В окне поиска

  private string GridType = "";
        public Lookup(String  LookupModelType)
        {
            InitializeComponent();
            this.GridType = LookupModelType; 
        }

        private void Lookup_Load(object sender, EventArgs e)
        {
            if (GridType == "Product")
            {
                using(DataControllers.RIT_Allocation_Entities RAEntity  = new DataControllers.RIT_Allocation_Entities())
                {
                    dgvLookup.DataSource = RAEntity.TBLM_PRODUCT.ToList<DataControllers.TBLM_PRODUCT>();
                }  
            }
            dgvLookup.ReadOnly = true;
        }

        private void dgvLookup_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            if (e.RowIndex < 0)
            {
                return;
            }
            int index = e.RowIndex;
            dgvLookup.Rows[index].Selected = true;
        }

person chathwind    schedule 03.12.2018    source источник
comment
Вы можете создать событие в форме поиска и позволить ему выдавать выбранное значение в качестве аргументов события. Зарегистрируйте метод в главной форме для получения аргументов.   -  person peeyush singh    schedule 03.12.2018
comment
@peeyushsingh спасибо за идею. можешь показать пример?   -  person chathwind    schedule 03.12.2018


Ответы (3)


ты можешь сделать это как удар:

в основной форме:

   private void textBox1_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.KeyCode == Keys.F3)
        {
            LookupForm look = new LookupForm();
            var result  = look.ShowDialog();

            if(result == DialogResult.OK)
            {
                MessageBox.Show(look.data.ToString());
            }
        }
    }

и в форме поиска вы должны объявить 1 переменную и заполнять каждый раз при нажатии ячейки

public partial class LookupForm : Form
{
    public object data = new object();
    private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
    {
        data = dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Value;
        this.DialogResult = DialogResult.OK;
        this.Close();
    }
}

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

person Alireza Yadegari    schedule 03.12.2018

Вот что необходимо для обмена данными между родительскими дочерними формами с помощью событий:

  1. Открытый класс аргументов настраиваемого события для обмена данными.
  2. Дочерняя форма для события.
  3. В родительской форме всякий раз, когда вы создаете экземпляр дочернего элемента, вам необходимо зарегистрировать обработчики событий

Обратите внимание, что приведенный ниже код - это просто демонстрационный код, и вам нужно будет добавить нулевые проверки и т. Д., Чтобы сделать его «надежным».

Аргументы настраиваемых событий ниже

public class ValueSelectedEventArgs : EventArgs
{
    public object Value { get; set; }
}

В вашей форме поиска должно быть объявлено следующее событие:

        public event EventHandler ValueSelected;

        protected virtual void OnValueSelected(ValueSelectedEventArgs e)
        {
            EventHandler handler = ValueSelected;
            if (handler != null)
            {
                handler(this, e);
            }

            // if you are using recent version of c# you can simplyfy the code to ValueSelected?.Invoke(this, e);     
        }

В моем случае я запускаю событие при изменении выбранного индекса в списке и закрываю форму. Код для этого:

        private void checkedListBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            var i = this.checkedListBox1.SelectedIndex;
            ValueSelectedEventArgs args = new ValueSelectedEventArgs();
            args.Value = i;
            OnValueSelected(args);
            this.Close();
        }

Наконец, в родительской форме вы должны зарегистрироваться для обработчика событий

private void textBox1_Leave(object sender, EventArgs e)
{
    lookup myLookup = new lookup();
    myLookup.ValueSelected += MyLookup_ValueSelected;
    myLookup.Show();
}

    private void MyLookup_ValueSelected(object sender, EventArgs e)
    {
        textBox2.Text = (e as ValueSelectedEventArgs).Value.ToString();

    }
person peeyush singh    schedule 03.12.2018

Мне лично нравится динамически добавлять окно поиска, и я делаю что-то вроде этого:

        //examble object
        class Person
        {
            public string FirstName { get; set; }
            public string LastName { get; set; }
        }
        // the value which you want to get from datagridview
        private Person _selectedValue;
        // the datagridview datasource, which you neet to set 
        private IEnumerable<Person> _gridDataSource = 
            new List<Person>()
                {
                    new Person {FirstName="Bob",LastName="Smith" },
                    new Person {FirstName="Joe",LastName="Doe"}
                };

        private void textBox1_KeyDown(object sender, KeyEventArgs e)
        {
            if(e.KeyCode== Keys.F3)
            {
                var btnOk = new Button() { Text = "Ok", Anchor= AnchorStyles.None };
                var btnCancel = new Button() { Text = "Cancel",Anchor= AnchorStyles.Right };

                var dg = new DataGridView();
                var bs = new BindingSource();
                bs.DataSource = _gridDataSource;
                dg.DataSource = bs;
                dg.Dock = DockStyle.Fill;
                dg.SelectionMode = DataGridViewSelectionMode.FullRowSelect;

                //setup a layout wich will nicely fit to the window
                var layout = new TableLayoutPanel();
                layout.Controls.Add(dg, 0, 0);
                layout.SetColumnSpan(dg, 2);
                layout.Controls.Add(btnCancel, 0, 1);
                layout.Controls.Add(btnOk, 1, 1);
                layout.RowStyles.Add(new RowStyle(SizeType.Percent));
                layout.RowStyles.Add(new RowStyle(SizeType.AutoSize));
                layout.ColumnStyles.Add(new ColumnStyle(SizeType.Percent));
                layout.ColumnStyles.Add(new ColumnStyle(SizeType.AutoSize));
                layout.Dock = DockStyle.Fill;

                //create a new window and add the cotnrols
                var window = new Form();
                window.StartPosition = FormStartPosition.CenterScreen;
                window.Controls.Add(layout);


                // set the ok and cancel buttons of the window
                window.AcceptButton = btnOk;
                window.CancelButton = btnCancel;
                btnOk.Click += (s, ev) => { window.DialogResult = DialogResult.OK; };
                btnCancel.Click += (s, ev) => { window.DialogResult = DialogResult.Cancel; };

                //here we show the window as a dialog
                if (window.ShowDialog() == DialogResult.OK)
                {
                        _selectedValue =(Person) bs.Current;
                        MessageBox.Show(_selectedValue.FirstName);
                }
            }
}
person Lucian Bumb    schedule 03.12.2018