如何从主程序重新启动Windows窗体,直到另一个窗口表单退出应用程序?

时间:2015-08-31 20:05:35

标签: c# multithreading forms winforms windows-applications

我有一个C#windows程序,有两种形式可以通过RunApplication从主程序线程连续打开。执行流程基本上是:

  • 用户运行Setup.exe,启动主程序线程(Setup.cs)
  • 主程序启动表单A,其中显示可用配置文件的列表视图
  • 用户选择一个,点击下一个,表单A关闭
  • 主程序线程加载所选的配置文件
  • 主程序线程启动表格B

    Application.Run(new FormB { Size = new Size(530, 421) });
    
  • 表单B有许多可能显示或不显示的选项卡,具体取决于所选的配置文件;用户单击此表单上的“下一页/后退”以在选项卡之间导航
  • 如果用户位于表格B的标签索引0处并且用户点击“返回”按钮,则表格B应该关闭并允许表格A再次显示

最后一点是我遇到了一些问题 - 我希望当用户点击表格B上的后退按钮并且标签索引是0时,我可以设置一些公共静态变量来指示它是'返回'模式,并在主线程中重新启动表单A.但是,我不能使用一个简单的循环来表示虽然它不是ExitMode(并且是ReturnMode),但是启动表单B,因为它会反复打开/关闭表单B的实例。我想我可以设置循环条件来说明它的返回模式和表格B是否还没有被启动,启动表格B - 但是直到表格B重复检查似乎是不好的已被关闭。 (这里需要线程吗?)

我也想过也许我可以在表格B中启动表格A - 例如,如果选择的标签索引是0,那么表格B的btnBack_Click运行一个函数来启动表格A.因为我无法启动{{1在另一个Application。()中,我创建了一个Form A的实例,并尝试了Application.Run()。但是,如果我这样做,表格B会在背景中徘徊,我似乎无法关闭它而不关闭表格A.

formA.Show()

2 个答案:

答案 0 :(得分:0)

你可以将对主线程的引用传递给表单B.从那里,如果用户在索引为0时按下表单B上的后退按钮,则在引用的线程上调用一个方法,该方法将关闭表单B并打开表格A.

答案 1 :(得分:0)

这样的事情怎么样?

<table>
  <tr>
    <?php if(!empty($data['created_at'])){ ?>
    <td colspan="3">
       <strong><?php echo "Created Date:";?>:</strong> <?php echo $data['created_at']; ?>    
   </td>
    <?php } ?>
    
    
    <?php if(!empty($data['username'])){ ?>
    <td colspan="3">
       <strong><?php echo "Username:";?>:</strong> <?php echo $data['username']; ?>
         </td>
    <?php } ?>

  </tr>
  
    <tr>
 
    <?php if(!empty($data['due_date'])){ ?>
         <td colspan="3">
       <strong><?php echo "Date delivery:";?>:</strong> <?php echo $data['due_date']; ?>
     </td>
           <?php } ?>

    
    
    <?php if(!empty($data['copmany'])){ ?>
      <td colspan="3">
       <strong><?php echo "Company:";?>:</strong> <?php echo $data['copmany']; ?>
    </td>
        <?php } ?>
   
  </tr>
  
  </table>