我有方法
public override void InitializeRow(object sender, InitializeRowEventArgs e)
{
if (!e.ReInitialize)
Task.Factory.StartNew(() =>
{
AfterInitializeRow(sender, e);
});
}
public override void AfterInitializeRow(object sender, InitializeRowEventArgs e)
{
foreach (UltraGridColumn ugc in e.Row.Band.Columns)
{
if (IsNumeric(ugc.Key))
{
e.Row.Cells[ugc].DroppedDown = true;
e.Row.Cells[ugc].ValueList = “Some value”;
e.Row.Cells[ugc].SetValue(e.Row.Cells[ugc.Key].Value, false);
e.Row.Cells[ugc].Style = Infragistics.Win.UltraWinGrid.ColumnStyle.DropDownList;
}
}
}
但在e.Row.Cells[ugc].DroppedDown=true处出现Giving错误;我了解到只有主线程才能更新UI。但有没有可能在更新DroppedDown时只切换到主线程。Bcoz的1000多行是以这种方式初始化的,这使得网格的加载非常缓慢。所以我想在这个过程中做一些并行处理。
在Form
或UserControl
中的任何函数中,您都可以使用以下类型的代码:
public void SetText(string text)
{
if (InvokeRequired)
{
BeginInvoke(new Action<string>(SetText), text);
}
else
{
label1.Text = text;
}
}
CCD_ 3将是在这种情况下进行更新的控制
这将确保您在UI线程上调用该函数
不过,您仍然应该小心同步,但简单地从另一个线程更新UI就可以很容易地完成。
这个问题的答案是,不应该在InitialzieRow事件中使用线程来设置甚至访问网格或其相关对象上的属性。
相反,你应该首先寻找优化你在这个方法中所做的事情的方法。例如,为什么要将单元格的值设置为它已经具有的值,这行代码应该能够在不影响行为的情况下删除。
此外,提供的所有逻辑都仅基于列键,因此如果该列具有一致的值集,则可以在InitializeLayout中设置该列的ValueList,而不是使用InitializeRow。