【发布时间】: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 表单的控制台项目(但我想这在这种情况下应该没有任何区别)。