【问题标题】:Inheriting user controls in C# .NET 2010在 C# .NET 2010 中继承用户控件
【发布时间】:2013-12-10 19:23:38
【问题描述】:

我正在使用 WinForms 在 C# .NET 2010 中开发一个程序,并且难以将 System.windows.Forms.DataVisualization.Charting.Chart 类继承到自定义图表中。

当我在 Visual Studio 设计器中查看表单时,我收到一条错误消息:

找不到类型“ExpeView.ExpeDataChart”。请确保引用了包含此类型的程序集。如果此类型是您的开发项目的一部分,请确保已使用当前平台或任何 CPU 的设置成功构建项目。

文件 ExpeDataChart.cs 是这个项目的一部分,每当我编译和运行程序时,它都能完美运行。此错误仅出现在设计器视图中,使我无法通过 GUI 编辑表单。

文件 ExpeDataChart.cs 看起来像这样(这被精简了,但明白了重点):

namespace ExpeView
{
    public class ExpeDataChart : Chart
    {
        public ExpeDataChart()
        {
            MouseMove += SampleMouseMove;
            MouseLeave += SampleMouseLeave;
            MouseDoubleClick += SampleDoubleClick;
            MouseDown += SampleMouseDown;
            MouseUp += SampleMouseUp;
            MouseEnter += SampleMouseEnter;
            MouseLeave += SampleMouseLeave;
            MouseWheel += SampleMouseWheel;
        }

        private void SampleMouseMove(object sender, MouseEventArgs e) { }
        private void SampleMouseLeave(object sender, EventArgs e) { }
        private void SampleDoubleClick(object sender, MouseEventArgs e) { }
        private void SampleMouseDown(object sender, MouseEventArgs e) { }
        private void SampleMouseUp(object sender, MouseEventArgs e) { }
        private void SampleMouseEnter(object sender, EventArgs e) { }
        private void SampleMouseWheel(object sender, MouseEventArgs e) { }
        private void SampleZoomIn(int x) { }
        private void SampleZoomOut() { }
    }
}

什么会导致它无法在设计器中正确加载,但在编译时仍能正确加载?错误的调用栈是:

ExpeView FormExpeView.Designer.cs Line:438 Column:1 at System.ComponentModel.Design.Serialization.CodeDomSerializerBase.Error(IDesignerSerializationManager manager, String exceptionText, String helpLink) at System.ComponentModel.Design.Serialization.CodeDomSerializerBase.DeserializeExpression(IDesignerSerializationManager manager,字符串名称,CodeExpression 表达式)在 System.ComponentModel.Design.Serialization.CodeDomSerializerBase.DeserializeExpression(IDesignerSerializationManager manager,字符串名称,CodeExpression 表达式)在 System.ComponentModel.Design.Serialization.CodeDomSerializerBase.DeserializeStatement(IDesignerSerializationManager 经理,CodeStatement 语句)

【问题讨论】:

  • 我试图快速重现该问题,但它似乎工作正常。看起来表单的 Designer 文件中可能有错误。您是否尝试过从表单中删除控件(在 FormExpeView.Designer.cs 文件中的代码中)?从窗体中删除控件后,重新构建项目,验证您可以显示窗体的设计器,然后通过设计器再次添加控件。
  • 我确实这样做了,它工作正常。不过,groverboy 给了我一个可行的解决方案 - 将 ExpeDataChart.cs 与表单放在一个单独的项目中。
  • 在一个测试项目中,我将控件添加到与表单相同的项目中,并且设计器工作正常。我想这个问题是由其他原因引起的(可能是设计器文件中的一些旧代码),这可能由于更改控件的位置而自动解决。
  • 使用 Visual Studio 2010 和 WinForms?你是像我一样扩展 Chart 还是其他控件?有一次,我将 ExpeDataChart 删除为重命名的图表,但它仍然无法正常工作。但是,当我用常规图表替换它时,它确实有效。在我将它移到另一个项目之前,它似乎非常不想使用扩展的 ExpeDataChart。
  • 我扩展了Chart 课程。我通过两种方式做到这一点(通过添加一个从 Chart 继承的简单类和通过添加从 Chart 派生的用户控件)。我能够使用设计器将这两个都添加到表单中。我使用了 VS 2010 Express 和一个带有 WinForms 表单的控制台项目(但我想这在这种情况下应该没有任何区别)。

标签: c# .net winforms


【解决方案1】:

将文件 ExpeDataChart.cs 移动到一个单独的项目,一个库项目。新项目可以是 Visual C# 解决方案的一部分,也可以是单独的解决方案,例如自定义控件。然后将库项目的引用添加到使用自定义控件的项目中。现在您应该可以使用可视化设计器编辑自定义控件了。

【讨论】:

  • 这是一个必须实施的荒谬解决方案,但这解决了它。谢谢!
  • @kingcoyote - 没问题,感谢您的确认。但为什么可笑?可视化设计器使用以前编译的控件,当自定义控件源是当前项目的一部分时,情况当然不是这样。
  • 这似乎是一个任意的箍跳。但我认为由于编译顺序问题,该项目的设计器无法使用该项目的自定义控件是有道理的。
猜你喜欢
  • 2013-09-03
  • 2023-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多