【问题标题】:Controlling the order of controls being populated on a form in VB 2008控制在 VB 2008 中的窗体上填充控件的顺序
【发布时间】:2011-07-29 05:09:56
【问题描述】:

我的表单包含一个数据网格和一个选中的列表框。列表框在 form_load 事件上填充。当触发数据网格的 SelectionChanged 事件时,会调用一个函数来修改列表框中的复选标记。当我手动单击数据网格中的任何项目时,一切正常。

但是,表单第一次运行时,复选标记不受影响,即使数据网格中的第一项显示为选中状态。我发现这是因为在触发第一个 SelectionChanged 事件时,实际的列表框尚未填充到表单上。因此,当该函数尝试设置复选框时,它不会到达任何地方,因为它看不到列表框中的任何项目。

数据网格以某种方式被填充,甚至在触发 form_load 事件之前。我需要在填充数据网格之前填充列表框,但我不知道如何控制它。

任何想法如何解决我的困境?

谢谢。

【问题讨论】:

    标签: vb.net datagrid listbox population


    【解决方案1】:

    这不会直接回答您的问题,但也许在您加载列表框后,您可以调用 SelectionChanged 子程序以产生您想要的行为。而不是试图控制顺序。

    【讨论】:

    • 这可能有效,但如果不传入正确的参数,您将无法调用事件处理程序。如何创建“sender As Object”、“e As System.EventArgs”参数?我可以只创建 2 个新的此类变量并将它们传递吗?我一直觉得这些东西很特别。
    • 如果 sender 和 e 在您的 sub 中未使用,例如 SelectionChanged(Nothing,Nothing)。否则,您将不得不创建变量来表示参数并发送它们。使用 datagrid 控件作为发送者并创建参数并提供您需要的任何信息。 (通常我什么都找不到,什么都不够)
    • 抱歉,如果您不使用它,您应该发送 args.empty 而不是什么都没有。是的,sender 和 e 并不比任何其他对象更特别。
    【解决方案2】:

    我通过使用计时器解决了这些问题(在表单加载期间做一些事情,但在加载所有控件之后)。 它被禁用,时间为 10 毫秒。 在表单加载中作为最后一个操作我启用它。 在计时器滴答声中,我禁用计时器并执行其余代码。

    因此,timertick 会在表单加载后立即执行。

    【讨论】:

    • 我不认为我会经历这一切感觉有点像作弊。如果你打算做所有这些,那么为什么不创建一些像 AfterLoadComplete() 这样的 sub 作为加载事件的最后一行调用呢?
    • 我必须维护别人写的程序,我保证,当你测试一个程序时,使用像 FormIsLoading 这样的布尔值来编写“如果加载然后退出子”很容易,但很难修改和添加控件。我喜欢我的表格干净,准备好,然后我开始处理。没有技巧,没有欺骗,只是划分事物:布局与处理
    • 我认为您在我的评论末尾误解了我的问题。如果您的目标是在表单加载后立即执行代码......将任何您想要的名称命名为加载的最后一行的 Sub 有什么问题?而不是添加一个计时器,让您有一个计时器滴答声来做完全相同的事情。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-21
    • 1970-01-01
    • 2013-12-09
    • 1970-01-01
    相关资源
    最近更新 更多