2011-09-21 60 views
2

我有一个tabpage用户控件和3个属性页,用于tabpage用户控件,它们是动态分配的。该tabpage控件将显示在对话框中。如何在显示Windows对话框后进行处理?

对于tabpage控件的数据处理和过滤需要更多的时间,并且这会导致在打开对话框之前出现超过10秒的繁忙图标。

我想显示一个空的Dialog打开并显示繁忙的图标,同时处理和数据过滤完成并最终显示在Dialog内部。

这基本上改变了处理的顺序。

但是,我无法做到这一点,并且一旦打开对话框,它将等待用户输入,并在给出输入后才会进入下一行。 (如在调试期间观察到的)。

在下面的代码中,行MnemonicSelector.InitializeMnemonicSelectorParameters(parameters); 负责处理和移动showdialog后导致对象未找到操作,当用户单击对话框下属性页面内的任何项目。

public override MnemonicSelectorResult ShowMnemonicSelector(MnemonicSelectorSearchParameters parameters) 
{ 
    MnemonicSelector.InitializeMnemonicSelectorParameters(parameters); 
    ResizeMnemonicSelectorIfNeeded(); 
    SetupMnemonicDialog(m_PropertyDialog, MnemonicSelector, MnemonicSelector.Title); 

    DialogResult dResult = ShowFakeDialog(m_PropertyDialog, MnemonicSelector.Title); 
    return MnemonicSelector.Result; 
} 
private void ResizeMnemonicSelectorIfNeeded() 
{ 
    if ((MnemonicSelector.ClientSize.Width < 909) || (MnemonicSelector.ClientSize.Height < 620)) 
     m_PropertyDialog.ClientSize = new System.Drawing.Size(939, 697); 
} 
protected void SetupMnemonicDialog(PropertiesDialogControl propertydialog, PropertyPage page, string title) 
{ 
    List<PropertyPage> pages = new List<PropertyPage>(); 
    pages.Insert(0, page); 
    PropertyPage[] propertyPages = pages.ToArray(); 

    if (title != null) 
     propertydialog.Text = title; 

    propertydialog.SetPropertyPages(new List<PropertyPage>(propertyPages)); 
} 
public virtual DialogResult ShowFakeDialog(Control contents, string title) 
{ 
    return ShowFakeDialog(contents, title, false, ""); 
} 

public DialogResult ShowFakeDialog(Control contents, string title, bool isCancelButtonVisible, string cancelButtonText) 
{ 
    FakeDialog fakeDialog = new FakeDialog(this, contents, title, isCancelButtonVisible, cancelButtonText); 
    using (fakeDialog) 
    { 
     lock (this) 
     { 
      FakeDialog previousFakeDialog = _activeFakeDialog; 
      _activeFakeDialog = fakeDialog; 

      try 
      { 
       return fakeDialog.ShowDialog(); 
      } 
      finally 
      { 
       _activeFakeDialog = previousFakeDialog; 
      } 
     } 
    } 
} 

请指点上我能实现所需的功能,其中,我可以显示对话框,后来加载属性页(处理)。

+0

这是C#的问题吗? – VMAtm

+5

显示一个对话框不可用10秒对用户没有帮助。使用BackgroundWorker获取数据,以便UI不会冻结。显示一个litte“我正在处理它,而不是死”窗口,同时它在一个像marquee模式下的进度条一样的动画中运行。关闭该窗口并在RunWorkerCompleted事件处理程序中显示对话框。 –

回答

0

您应该为此使用后台工作线程。检查this。它应该有助于您使用后台工作人员将您的进度动画与处理逻辑分开。