【问题标题】:MethodNotFoundException when adding a user control to another form将用户控件添加到另一个表单时出现 MethodNotFoundException
【发布时间】:2012-05-01 11:00:07
【问题描述】:

我有两个自定义 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)

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

注意控件本身的设计器每次都可以正常打开,只有在添加到另一个表单时才会出现问题。

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

    一般来说,使用 Fuslogvw.exe 来解决程序集解析问题。它对 VS 和对您自己的程序一样有效。您想要记录所有绑定,以便您还可以看到那些成功但可能从错误文件夹中选择了程序集副本的绑定。

    【讨论】:

    • 虽然是一篇有趣的帖子,但我没有手动向工具箱中添加任何内容。这两个列表框类已经存在,它们只是用给定的代码更新,新的用户控件自动出现在那里。
    • 这并没有留下太多。它以某种方式在某处找到了程序集的旧副本。您可以使用 fuslogvw.exe 并记录所有绑定以获得洞察力。
    • 您确实是正确的,它在我们众多的输出文件夹之一中找到了程序集的旧副本。如果您想在答案中添加一些具有这种效果的词,那么我可以继续接受它。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-01
    • 1970-01-01
    • 2014-05-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多