在Compact Framework中的子窗体的showdialog中调用父窗体的方法导致ThreadAbortExce

本文关键字:窗体 方法 ThreadAbortExce 调用 Compact showdialog Framework | 更新日期: 2023-09-27 18:30:07

我从父窗体调用窗体的ShowDialog,并在子窗体中填充一些数据,通过这些数据我想调用父窗体中的方法。

父窗体中的方法更新窗体中的控件值。

这导致我出现线程中止异常

像一样说

ChildForm Cform=new ChildForm();
Cform.ShowDialog();

和ChildForm

ParentForm PForm=new Parentform();
PForm.Somemethod();//method in my parentForm

在某些方法中,我通过调用来更新表单中控件的值

我正在调用每个控件,但仍然得到ThreadAbort Exception

注意:我使用的是Compact Framework

//My parent Form Method
       public void ProcessResponse()
        {
            Result Objresult = new Result();
            Objresult.ShowDialog();
        }
    //My child Form
      public void SendBackResponse()
      {
      //Some Processing
       ParentForm PForm=new Parentform();
        PForm.Somemethod();
      }
And In ParentForm I am having 
    public void Somemethod()
    {
        if(InvokeRequired)
        {
         //I am invoking Through the delegate
        }
    }

提前感谢

在Compact Framework中的子窗体的showdialog中调用父窗体的方法导致ThreadAbortExce

这里有一些问题。

首先,您的"父"窗体不是名为ShowDialog的窗体。实际上,您正在子对象中创建一个全新的Form实例,因此它将与创建子对象的父对象不同。

其次,ShowDialog为正在显示的对话框创建一个单独的消息泵。在对话框关闭并且主消息泵重新开始运行之前,发送给父级的任何Windows消息都不会得到处理。这意味着在对话框关闭之前,不会对父级进行任何UI更新。

第三,你所做的只是糟糕的设计。如果您需要父级以某种UI方式对子级做出反应,那么在子级中公开一个属性,在子级关闭时读取它并处理更新:

class Child : Form
{
    ....
    public string NewInfo { get; set; }
}
....
// code in the Parent
var child = new ChildForm();
if(child.ShowDialog() == DialogResult.OK)
{
   this.UseChildData(child.NewInfo);
}

如果您不是在更新父UI,而是在运行某种形式的业务逻辑,那么您就违反了关注点分离。将该业务逻辑放入Presenter/Controller/ViewModel/Service/Model/中,然后将其传递给子级。

class Service
{
    public void DoSomething() 
    {
        // business logic here 
    } 
}
class Child : Form
{
    Service m_service;
    public Child(Service service)
    {
        m_service = service;
    }
    void Foo()
    {
        // call the business logic
        m_service.DoSomething();
    }
}
....
// code in the Parent
var svc = new Service();
....
var child = new ChildForm(svc);
child.ShowDialog();