Прехвърляне на обект от една прозоречна форма в друга

Имам две прозорци в приложението си. Първият е основният формуляр, а вторият е формулярът за търсене. Опитвам се да отворя формуляра за справка от главния формуляр в събитие за напускане на ключ на текстово поле и след това отварям формуляра за справка. Моят формуляр за търсене има изглед на мрежа с данни и го зареждам в събитието за зареждане на формуляра на формуляра за търсене. Чета избраната от мен стойност в мрежовия изглед на прозореца за справка към обект. Искам да затворя прозореца за справка веднага щом прочета стойностите на избрания ред на обекта и искам да го предам на главния формуляр? Как мога да направя това? Това съм направил. В основната форма.

        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