将用户控件添加到另一个窗体时的方法未发现异常



我有两个自定义列表框类:

public class MyListBox : ListBox
public class MyCheckedListBox : ListBox

它们是围绕 winforms 的包装器,System.Windows.Forms.ListBox控件添加一些实现和样式等。

我为每个代码

添加了以下代码,以便在必要时删除垂直滚动条:

private const int WS_VSCROLL = 0x00200000;
private bool verticalScrollbar = true;
[DefaultValue(true)]
public bool VerticalScrollbar
{
    get { return this.verticalScrollbar; }
    set
    {
        if (this.verticalScrollbar != value)
        {
            this.verticalScrollbar = value;
            this.RecreateHandle();
        }
    }
}
protected override System.Windows.Forms.CreateParams CreateParams
{
    get
    {
        System.Windows.Forms.CreateParams parms = base.CreateParams;
        if (!this.verticalScrollbar)
            parms.Style &= ~WS_VSCROLL;
        return parms;
    }
}

我将每个中的一个添加到现有的用户控件ProfileGeneralPanel并且它们按预期工作,默认情况下显示滚动条,将 VerticalScrollbar 属性设置为 false 将其删除。虽然,现在需要在多个地方使用这种安排,所以我正在将此结构提取到一个名为 PrivilegesListView 的单独新用户控件中。此新控件在表中具有单个MyCheckedListBox和两个MyListBox。这三个VerticalScrollbar都设置为false。到目前为止一切都很好,设计师正确显示所有内容。

但是,当我尝试将此控件从工具箱拖到另一个用户控件上时,会引发异常,指出它找不到该方法:MyCheckedListBox.set_VerticalScrollbar(Boolean)

所讨论的方法显然是属性的生成方法。我已经尝试了所有常规方法,清理和重建,重新启动了Visual Studio。出于纯粹的绝望,我还检查了构建时生成的 IL,类MyCheckedListBox确实定义了该方法。知道为什么找不到它吗?

请注意,控件本身的设计器每次都能正常打开,只有在将其添加到另一个窗体时才会出现问题。

请注意,仅当VerticalScrollbar设置为 false 时,才会出现问题,无论是在设计器生成的 PrivilegesListView 代码中,还是在构造函数本身中手写。

注意:不幸的是,在此阶段,无法使用其他控件(如DataGridView(代替列表框...

以前使用"选择项"对话框将控件添加到工具箱时,会出现错误。 这会创建控件程序集的副本,该副本存储在保存工具箱项程序集的专用目录中。 你现在可以看到这出了问题,也许,你正在将旧版本的控件放在你的窗体上,一个还没有添加方法

的控件。

避免此陷阱的最佳方法是让 Visual Studio 自动将您正在处理的控件添加到工具箱中。 确保设置仍然正确,它往往会因不明智的尝试而改变 VS 性能。 "工具 + 选项"、"窗口窗体设计器"、"常规"、"自动工具箱填充"应设置为 True。 然后,解决方案中具有派生自控件或组件的类的任何项目都将在编译后自动将其控件添加到工具箱顶部。 对控件代码所做的更改现在始终保持同步。

通常,使用 Fuslogvw.exe 来解决程序集解析问题。 它适用于VS和您自己的程序一样好。 您希望记录所有绑定,以便您还看到成功但可能从错误文件夹中选取程序集副本的绑定。

最新更新