【问题标题】:ListView ColumnWidthChanged Event gets fired 'without reason'ListView ColumnWidthChanged 事件被“无缘无故”触发
【发布时间】:2015-06-24 12:44:01
【问题描述】:

我有一个列表视图和一个用于 ColumnWidthChanged 事件的事件处理程序,它在每次用户更改某些内容时将新的列大小存储在配置文件中。

我已经为每个在内部更改列的进程创建了标志,以便只能对用户输入做出反应。

这个事件仍然在程序启动时触发(列表视图中的每一列一次)。

调用堆栈仅显示事件、“外部代码”和主“program.cs”。

我只是找不到触发事件的位置。有什么想法吗?

【问题讨论】:

  • 如果打开的表单是您的主要表单,那么它会在启动时计算每列的宽度以准备显示。我会等待添加您的事件处理程序,直到 ?Loaded?事件。我不记得渲染完成后触发的是哪一个。
  • 尝试连接到 Shown 事件中的 ColumnWidthChanged 事件。
  • 我测试了表单的 'load' 事件并在那里添加了 listviews 事件处理程序。但是当时根本没有触发 listview 事件。
  • 把它放到 Shown 事件中。在此之前,将当前代码添加到您的问题中,以便我可以看到您如何手动连接到事件。还包括您正在接线的方法。
  • 那行得通!这仍然是奇怪的行为。我也有一个相同形式的 DataGridView,也对列宽变化做出反应,但该事件在启动时不会被触发......

标签: c# winforms visual-studio-2010


【解决方案1】:

您需要将连接ColumnWidthChanged 事件的代码放入表单的Shown 事件中。

发生的情况是 ListView 占用了表单上的物理空间,因此在构建它时,它必须计算每列的大小。因此,在将数据填充到其中时,这些列一旦拥有数据就会调整大小。这就是为什么它会在每列显示之前触发一次。

至于为什么它没有在 DataGridView 上触发,我认为对象的大小是添加到表单的大小。它将等待计算每个列的大小,直到 DataGridView 已经添加到表单中。这是一个有点不直观的行为,但从您看到的结果来看,这似乎是正在发生的事情。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-15
    • 1970-01-01
    相关资源
    最近更新 更多