【问题标题】:Calling a Method of parent form in showdialog of child form in Compact Framework Causing ThreadAbortException在 Compact Framework 的子窗体的 showdialog 中调用父窗体的方法导致 ThreadAbortException
【发布时间】:2013-09-03 21:48:34
【问题描述】:

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

父表单中的方法更新表单中的控件值。

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

说喜欢

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

在 ChildForm 中

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

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

我正在调用每个控件,但我仍然收到 ThreadAbort 异常

注意:我使用的是 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
        }
    }

提前致谢

【问题讨论】:

  • 贴出相关代码。这段代码不够有用
  • @SriramSakthivel 请查看编辑后的帖子
  • 你在哪里打电话给Thread.Abort
  • 如果你没有线程任何东西,没有理由调用。
  • 另外,ChildForm 不应创建ParentForm 的实例。相反,请在 ChildForm 中创建一个 ParentForm 属性,您可以在显示之前对其进行设置。

标签: c# .net compact-framework invoke


【解决方案1】:

这里有一些问题。

首先,您的“父”表单不是调用 ShowDialog 的表单。您实际上是在 Child 中创建一个全新的 Form 实例,因此它与创建 Child 的 Parent 不同。

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

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

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/whatever 并将其传递给子级。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多