首页 > 解决方案 > 将对象从一个窗体传递到另一个窗体

问题描述

我的应用程序中有两个窗体。第一个是主表单,第二个是查找表单。我正在尝试从文本框键离开事件中的主表单打开查找表单,然后我正在打开查找表单。我的查找表单有一个数据网格视图,我在查找表单的表单加载事件中加载它。我正在将查找窗口的网格视图上的选定值读取到对象。我想在将所选行的值读取到对象后立即关闭查找窗口并将其传递给主窗体?我怎样才能做到这一点?这就是我所做的。在主窗体中。

        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;
        }

标签: c#winformsobjectentity-framework-6

解决方案


要使用事件在父子表单之间共享数据,需要做以下事情:

  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();

    }

推荐阅读