我在与数据绑定相结合的WinForms DataGridView方面遇到了困难.我将一个包含DataSet的DataView分配给DataGridView.DataSource,它到目前为止运行良好.实现自定义DataGridViewCell时,问题就出现了.我的目标是提供一个ComboBoxCell,用于选择始终完全交互的Enum值,并且不要求用户明确地进入编辑模式.

这是绑定设置:
就功能而言,我的自定义单元格的行为完全符合预期.但是,它不会导致触发DataTable.RowChanged事件,除非整个DataGridView失去焦点...但所有其他非自定义单元格都会失去焦点.我仍然得到一个CellValueChanged事件,并且DataSet具有新值..但是既没有DataTable.RowChanged也没有DataGridView.DataBindingComplete,并且该行不会像通常那样自动失效.
我显然做错了什么.我可能错过了通知程序事件或执行了错误的操作,但经过两天的搜索,踩踏和反汇编.Net代码我仍然完全陷入困境.
以下是类定义中最重要的部分(不是完整的源代码):
public class DataGridViewEnumCell : DataGridViewCell, IDataGridViewEditingCell
{
private Type enumType = null;
private Enum enumValue = default(Enum);
private bool enumValueChanged = false;
public virtual object EditingCellFormattedValue
{
get { return this.GetEditingCellFormattedValue(DataGridViewDataErrorContexts.Formatting); }
set { this.enumValue = (Enum)Utility.SafeCast(value, this.enumType); }
}
public virtual bool EditingCellValueChanged
{
get { return this.enumValueChanged; }
set { this.enumValueChanged = value; }
}
public override Type EditType
{
get { …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用来加快冗长的操作(几毫秒)* Parallel.For,但是在方法返回之前,我正在整个WinForms应用程序中获取Paint事件-建议以某种方式触发消息泵。但是,整体重绘会导致以不一致的状态访问数据,从而产生错误的错误和异常。我需要确保Parallel.For阻止时不会触发UI代码。
到目前为止,我对此的研究尚无定论,并大致向我指出了诸如同步上下文和TaskScheduler实现之类的内容,但是我还没有弄清这一切。
如果有人在整个过程中可以帮助我解决一些问题,将不胜感激。
Parallel.For触发WinForms消息泵的事件链?Parallel.For?编辑: *一些上下文:以上几毫秒的操作是游戏引擎循环的一部分,其中16毫秒可用于完全更新-因此属性为“长”。此问题的上下文是在其编辑器(即WinForms应用程序)中执行游戏引擎核心。Parallel.For发生在内部引擎更新期间。
为了在现有的软件框架中进行优化,我进行了独立的性能测试,因此我可以在花费大量时间之前评估潜在的收益.
有N不同类型的组件,其中一些实现了IUpdatable接口 - 这些是有趣的.它们分组在M对象中,每个对象都维护一个组件列表.更新它们的方式如下:
foreach (GroupObject obj in objects)
{
foreach (Component comp in obj.Components)
{
IUpdatable updatable = comp as IUpdatable;
if (updatable != null)
updatable.Update();
}
}
Run Code Online (Sandbox Code Playgroud)
我的目标是为大量分组对象和组件优化这些更新.首先,确保连续更新一种类型的所有组件,方法是将它们缓存在每种类型的一个数组中.基本上,这个:
foreach (IUpdatable[] compOfType in typeSortedComponents)
{
foreach (IUpdatable updatable in compOfType)
{
updatable.Update();
}
}
Run Code Online (Sandbox Code Playgroud)
它背后的想法是,JIT或CPU可能比在洗牌版本中一次又一次地在相同的对象类型上操作更容易.
在下一步中,我希望通过确保一个Component类型的所有数据在内存中对齐 - 通过将其存储在结构数组中来进一步改善这种情况,如下所示:
foreach (ComponentDataStruct[] compDataOfType in typeSortedComponentData)
{
for (int i = 0; i < compDataOfType.Length; i++)
{
compDataOfType[i].Update();
}
}
Run Code Online (Sandbox Code Playgroud)
在我的独立性能测试中,这些变化都没有显着的性能提升.我不知道为什么.没有显着的性能提升意味着,10000个组件,每个批处理运行100个更新周期,所有主要测试大约需要85毫秒+/- …
.net ×3
c# ×3
data-binding ×1
datagridview ×1
datatable ×1
jit ×1
optimization ×1
performance ×1
winforms ×1