父窗体的委托,子窗体注册,this.Owner是关键

//声明委托
public delegate void RefreshParentHandler<T>(T obj);

//父窗体的委托
public RefreshParentHandler<op_client_add_fee> RefreshParent;

//父窗体调用子窗体
frmAddCharge frm = new frmAddCharge(isUp, _SelectRow);
frm.RefreshParent += model =>  
{
                   //方法
 };
 frm.RefreshIsNext += isnext =>//后台线程工作
{
      _isNext = isnext;//是上一条数据还是下一条
       StartTask();//开启子线程窗体数据
};
frm.Owner = this;//申明当前窗体是子窗体
frm.ShowDialog();

//子线程传递数据  就是选择查询的数据
#region 上下条数据
        /// <summary>
        /// 子线程
        /// </summary>
        private void StartTask()
        {
            var task = new System.Threading.Tasks.Task(() => Transmit(_isNext));
            task.Start();
        }
        /// <summary>
        /// 委托传值上下数据
        /// </summary>
        private void Transmit(bool isNext)
        {
            if (isNext)
            {
                for (int i = _index + 1; i < DataSource.Count(); i++)
                {
                    if (ReturnData(i))
                    {
                        return;
                    }
                }
            }
            else
            {
                for (int i = _index - 1; i >= 0; i--)
                {
                    if (ReturnData(i))
                    {
                        return;
                    }
                }
            }
            if (RefreshParent != null)
            {
                RefreshParent(null);
            }
        }
        private bool ReturnData(int index)
        {
            _SelectRow = gridView1.GetRow(index) as op_client_add_fee;
            if (_SelectRow != null)
            {
                if (Enum.GetName(_SelectRow.fstate.GetType(), _SelectRow.fstate).Equals("未处理"))
                {
                    if (RefreshParent != null)
                    {
                        RefreshParent(_SelectRow);
                        _index = index;
                        gridView1.ClearSelection();
                        gridView1.SelectRow(_index);
                    }
                    return true;
                }
            }
            return false;
        }
        #endregion

//子窗体注册父窗委托
//父窗只有注册一次,因为父窗资源没有释放,必须清空以前注册的委托
frmExtraCharge frm = (frmExtraCharge)this.Owner;//调用父窗体
frm.RefreshParent = null;
//注册父窗体委托
frm.RefreshParent += row => { GetSelectRow(row, ey, ey2, mess); };
if (RefreshIsNext != null)
     RefreshIsNext(isNext);

效果图

原文地址:https://www.cnblogs.com/shuaimeng/p/10456268.html