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