【问题标题】:Visual C# Stop Code Generation For Custom Control用于自定义控件的 Visual C# 停止代码生成
【发布时间】:2014-06-03 21:52:15
【问题描述】:

希望我能得到一些帮助来解决我的问题,可能是一个简单的解决方法。我正在尝试创建一个自定义图表控件(从 Chart 类继承)。在我的构造函数中,我添加了 ChartArea 和 Legend。当我将控件添加到表单时一切都很好,但是当我运行它时,我在表单设计器中收到一个错误,说已经存在一个与我在构造函数中添加的同名的图表区域。所以我的问题是图表区域试图在表单设计器生成的代码中第二次添加。我可以从生成的代码中删除它,但我想看看在我的自定义图表类中是否有更简单的方法来控制它。图表的构造函数代码为:

    public MultiFunctionalGraph(DataForGraph dataA, DataForGraph dataB, DataForGraph dataC, DataForGraph dataD)
    {
        this.dataA = dataA;
        this.dataB = dataB;
        this.dataC = dataC;
        this.dataD = dataD;

        ChartArea chartArea = new ChartArea();
        Legend legend = new Legend();
        Axis xAxis = new Axis(chartArea, AxisName.X);
        Axis yAxis = new Axis(chartArea, AxisName.Y);

        chartArea.Name = "ChartArea";
        chartArea.Visible = true;
        this.ChartAreas.Add(chartArea);
        legend.Name = "Legend";
        this.Legends.Add(legend);

    }

我在设计器的代码生成中得到了这个:

        this.Graph1 = Graph();
        ((System.ComponentModel.ISupportInitialize)(this.Graph1)).BeginInit();

        // Graph1
        // 
        this.Graph1.BackColor = System.Drawing.Color.Transparent;
        chartArea1.AxisX.Interval = 5D;
        chartArea1.AxisX.MajorGrid.Interval = 10D;
        chartArea1.AxisX.MajorTickMark.Interval = 5D;
        chartArea1.AxisY.LabelStyle.Interval = 500D;
        chartArea1.AxisY.MajorGrid.Interval = 500D;
        chartArea1.AxisY.MajorTickMark.Interval = 500D;
        chartArea1.AxisY.MinorGrid.Interval = 500D;
        chartArea1.AxisY.MinorTickMark.Interval = 500D;
        chartArea1.CursorX.LineColor = System.Drawing.Color.LimeGreen;
        chartArea1.CursorX.LineWidth = 2;
        chartArea1.CursorY.LineColor = System.Drawing.Color.LimeGreen;
        chartArea1.CursorY.LineWidth = 2;
        chartArea1.Name = "ChartArea";
        this.Graph1.ChartAreas.Add(chartArea1);
        legend1.AutoFitMinFontSize = 5;
        legend1.Name = "Legend";
        legend1.TextWrapThreshold = 20;
        this.Graph1.Legends.Add(legend1);
        this.Graph1.Location = new System.Drawing.Point(46, 302);
        this.Graph1.Name = "Graph1";
        this.Graph1.Size = new System.Drawing.Size(569, 300);
        this.Graph1.TabIndex = 7;
        this.Graph1.Text = "Graph1";

所以基本上我必须停止生成代码才能在设计器中添加图表区域。我想我可以在某处使用 DesignerSerialize 属性来获得它,但我真的可以使用一些帮助。谢谢!

【问题讨论】:

  • 您是否 a) 尝试在添加您的 ChartArea 之前删除生成的 ChartArea? b) 考虑使用不同的名称,这意味着从一开始就使用 2 个 ChartArea 或 c) 仅使用生成的 ChartArea?
  • 我的问题是,在自定义图表的构造函数中,我添加了一个图表区域,比如“ChartArea1”。当我将此图表添加到表单时,设计器中生成的代码会自动添加同一行,因此它添加了一个名为“ChartArea1”的图表区域。现在在设计器和构造器中都调用了相同的东西,我试图添加两个具有相同名称的图表区域,这会爆炸。我需要以某种方式让设计师不生成该代码。
  • 嗯。刚刚遇到this 帖子。您的自定义图表是否在单独的库项目中?
  • 它与我要添加到的表单在同一个项目中。我也遇到了那个帖子,但并没有想太多,因为我没有接近与发布的相同问题。我想把它放在一个单独的库项目中不会有什么坏处。我会试一试的。
  • 如果您成功了,请随时通知我们!蒂亚

标签: c# charts designer


【解决方案1】:

在图形设计器中,打开Chart 上的ChartAreas 集合属性,并删除当前存在的所有内容。

ETA:您也可以通过编程方式执行此操作,在构造函数中调用 InitializeComponent 方法之后:

public MyChartClass()
{
    InitializeComponent();
    ChartAreas.Clear();
    ChartAreas.Add("ChartArea");
}

【讨论】:

  • 这行得通,但它并不完全是我想要采取的路径。不过,我确实以某种方式解决了这个问题,谢谢您的意见。
【解决方案2】:

好吧,我以一种迂回的方式解决了它。我没有扩展 Chart 控件,而是扩展了 UserControl 类并在其中添加了一个图表对象。现在我可以更轻松地控制它了。感谢大家的帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-06
    • 1970-01-01
    • 2015-09-20
    • 1970-01-01
    • 1970-01-01
    • 2015-11-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多