小编Ada*_*dam的帖子

自定义DataGridViewCell不会触发DataSource更改事件

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

它在行动中看起来如何

这是绑定设置:

  • DataSet S只包含一个DataTable,T
  • DataView V包装了所述表
  • DataGridView.DataSource设置为V.
  • 应用程序的某些部分订阅了T.RowChanged事件.这是至关重要的部分.

就功能而言,我的自定义单元格的行为完全符合预期.但是,它不会导致触发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)

.net c# data-binding datatable datagridview

5
推荐指数
1
解决办法
1314
查看次数

为什么Parallel.For执行WinForms消息泵,以及如何防止它?

我正在尝试使用来加快冗长的操作(几毫秒)* Parallel.For,但是在方法返回之前,我正在整个WinForms应用程序中获取Paint事件-建议以某种方式触发消息泵。但是,整体重绘会导致以不一致的状态访问数据,从而产生错误的错误和异常。我需要确保Parallel.For阻止时不会触发UI代码。

到目前为止,我对此的研究尚无定论,并大致向我指出了诸如同步上下文和TaskScheduler实现之类的内容,但是我还没有弄清这一切。

如果有人在整个过程中可以帮助我解决一些问题,将不胜感激。

  1. 什么是导致Parallel.For触发WinForms消息泵的事件链?
  2. 有什么办法可以完全防止这种情况发生?
  3. 另外,是否有任何方法可以判断是否从常规消息泵中调用了UI事件处理程序,还是由“触发”消息触发了“忙”消息泵Parallel.For

编辑: *一些上下文:以上几毫秒的操作是游戏引擎循环的一部分,其中16毫秒可用于完全更新-因此属性为“长”。此问题的上下文是在其编辑器(即WinForms应用程序)中执行游戏引擎核心。Parallel.For发生在内部引擎更新期间。

.net c# winforms task-parallel-library parallel.foreach

5
推荐指数
1
解决办法
361
查看次数

为什么更新结构数组比使用类数组更快?

为了在现有的软件框架中进行优化,我进行了独立的性能测试,因此我可以在花费大量时间之前评估潜在的收益.

情况

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 c# optimization performance jit

3
推荐指数
1
解决办法
259
查看次数