将用户控件添加到另一个表单时的MethodNotFoundException

时间:2012-05-01 11:00:07

标签: c# winforms visual-studio-2010 windows-forms-designer

我有两个自定义ListBox类:

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)

有问题的方法显然是属性的生成方法。我已经尝试了所有常规,清理和重建,重新启动视觉工作室。出于绝望的考虑,我还检查了构建时生成的IL,并且类MyCheckedListBox确实已经定义了该方法。任何想法,为什么它无法找到它?

注意控件的设计者每次都打开正常,只有当它被添加到另一个表单时才会出现问题。

注意该问题仅在VerticalScrollbar设置为false时发生,可以在设计器生成的PrivilegesListView代码中设置,也可以在构造函数本身中手写。

注意:不幸的是,在这个阶段,不可能使用像DataGridView这样的其他控件而不是列表框......

1 个答案:

答案 0 :(得分:3)

以前使用“选择项目”对话框将控件添加到工具箱时会出错。这使得控件程序集的 copy 存储在保存工具箱项目程序集的私有目录中。你现在可能会看到这个问题,你在表单上放置了一个旧版控件,一个还没有添加方法的控件。

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

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