等待控件初始化

时间:2011-03-28 16:02:13

标签: c# winforms

我的表单看起来像三窗格电子邮件客户端。左侧是一个包含人员列表的网格。右上角是当前人的详细记录。右下角是一个自定义控件,其中有许多复选框显示当前人员的专业领域:

  

[x]烹饪[x]窗户清洁[x]脑部手术

     

[x]按摩疗法[x]演唱[]随意的故意破坏行为

当表单打开时,焦点将转移到表单左侧网格中列出的第一个人,并且会触发grid的focused_row_changed事件。在此事件的处理程序中,我获取当前人员的ID,然后从数据库中获取该人员的详细数据并填充详细记录,并获取该人员的专业领域行并设置复选框。所有这一切都正常工作,除非首次打开表单,因为那时自定义控件及其许多复选框尚未初始化。那时MyCustomControl为空。

if (null != MyCustomControl)
{
  MyCustomControl.SetCheckedValues( datasource);
}

处理这种情况的最佳实践设计模式是什么?当我的控件尚未完全初始化时,我该怎么办?

if (null != MyCustomControl)
{
  MyCustomControl.SetCheckedValues( datasource);
} 
else 
{
  // ?? Wait around for a bit and keep trying every 100ms?
}

3 个答案:

答案 0 :(得分:1)

我遇到此问题时,我在控件中解决此问题的方法是实现ISupportInitialize

在你的控制中,你会提出类似的内容:

public class MyCustomControl: ISupportInitialize
{
    private bool _initializing = false;

    private void BeginInit()
    {
        _initializing = true;
    }

    private void EndInit()
    {
        _initializing = false;
    }

    private void SomeMethodThatWouldRaiseAnEventDuringInit()
    {
        if (_initializing) return;
        //...
    }
}

windows表单设计器检查实现接口的控件,并在.Designer.cs文件中生成此代码:

((System.ComponentModel.ISupportInitialize)(this.customControl1)).BeginInit();
///
/// customControl1
///
this.customControl1.SelectedIndex = 0;  //this would normally raise the event
((System.ComponentModel.ISupportInitialize)(this.customControl1)).EndInit();

答案 1 :(得分:0)

在初始化所有其他UI元素之前,未在子程序中调用UI初始化函数,或者将计算基于后端值而不是UI。


在回复评论和其他帖子时,如果您无法获得其他任何工作,可以在UI中添加“刷新”按钮

答案 2 :(得分:0)

根据我的理解,当focused_row_changed事件触发时,您正在设置MyCustomControl.SetCheckedValues( datasource);

当表单只是加载时也会发生这种情况,这通常是不希望的,因为当你选择的索引仍为-1时,你最终会告诉要加载的事件。

我一直在解决的问题是我在名为doneLoading的表单中有一个全局布尔值。它从false开始,并在调用Form_Shown()事件时变为true。

从那里开始,我只需要在任何代码片段周围放置if(doneLoading),这些代码需要等到表单实际完成加载才允许执行。在你的情况下,我会这样做:

if(doneLoading)
{
MyCustomControl.SetCheckedValues( datasource);
}