【问题标题】:how can i show the two charts from two forms in another form like overview我如何以另一种形式(例如概览)显示两种形式的两个图表
【发布时间】:2011-09-10 09:52:38
【问题描述】:

我正在实现图表控件.... 我有三个表格说 form1 form2 form3 .....

在form1中我以饼图的形式展示了一些数据

form2 我正在以条形图的形式显示一些数据.. 工作正常...

我的问题是我想在表格 3 中显示这两个图表,例如概览表格...用户将在其中看到所有图表...

因此,当我单击按钮时,如果您单击 form3 中的图表之一,表格 3 将与两个图表并排打开(一个是 form1 中的饼图,另一个是 form2 中的条形图)它会转到相应的表格..就像这样....

有没有人知道如何实现这个...

提前非常感谢....

【问题讨论】:

  • 是什么阻止您将在 Form 1 中生成一个图表的方法调用和在 Form3 中的 Form 2 中生成另一个图表的方法调用,所以当 Form3 加载时,您会在其中生成两个图表?然后单击时,您可以使用 form1.Show() 显示您喜欢的任何形式。我说方法调用不是可怕的复制粘贴,如果您认为涉及的复制过多,那么您应该考虑创建一个包含图表生成逻辑的帮助器类,以便简单地从两种表单中调用此类帮助器。
  • 当您点击form3中的两个图表之一时,form3是否关闭?简而言之,form3 是否始终可见?
  • @digEmall.. 当我点击任何一个图表时,form3 将被关闭,具有该图表的表单将被打开.. 并且 form3 将被关闭......
  • Form3 是否是模态的(即使用 ShowDialog 打开)?

标签: c# .net winforms charts


【解决方案1】:

我会这样做:

1) 创建 2 个包含 mschart 的用户控件,并调用它们,例如PieChartControlBarChartControl。公开一个方法来设置当前数据源(例如 SetDataSource(DataTable dt) )并将数据源绑定到 PieChart 或 BarChart 的逻辑

2) 创建 3 个表单:在 Form1 中添加 PieChartControl,在 Form2 中添加 BarChartControl,在 Form3 中添加 SplitContainer,您将在其中添加 PieChartControl 和 @987654331 @。

3) 在Form1Form2 中也暴露SetDataSource() 方法(它只会调用相应的内部控制方法)

4) 在Form3 中也公开SetDataSource() 方法;它将同时调用内部PieChartControlBarChartControlSetDataSource() 方法。

5) Form3 还必须公开一个自定义属性(例如 ChartClicked )指示已单击的图表

6) 在 Form3 中为 PieChartControlBarChartControl 订阅 Click 事件(或 DoubleClick,如您所愿)

7) 当Click事件触发时,只需设置ChartClicked属性并关闭表单


后面会跟着一些代码示例来帮助你理解我的解释。

助手枚举:

public enum ChartClicked {  None = 0, Pie = 1, Bar = 2 }

主窗体:

// this is the form that have the button to open Form3
public partial class MainForm: Form
{
   // other methods ...

   private void openForm3ButtonClick(object sender,Eventargs e)
   {
      Form3 f3 = new Form3();
      f3.SetDataSource(this.dataSrc)
      f3.ShowDialog();

      if(f3.ChartClicked == ChartClicked .Pie)
      {
         Form1 f1 = new Form1();
         f1.SetDataSource(this.dataSrc);
         f1.ShowDialog();
      }
      else if(f3.ChartClicked == ChartClicked .Bar)
      {
         Form2 f2 = new Form2();
         f2.SetDataSource(this.dataSrc);
         f2.ShowDialog();
      }    
   }
}

Form3:

// the form having the 2 controls
public partial class Form3: Form
{
   // other methods ...

   public ChartClicked ChartClicked { get; private set; }

   public Form3()
   {
      this.InitializeComponents();
      this.PieChartControl.Click += chartControlClicked;
      this.BarChartControl.Click += chartControlClicked;
   } 

   public void SetDataSource(object src)
   {
      this.PieChartControl.SetDataSource(src);
      this.BarChartControl.SetDataSource(src);
   }

   private void chartControlClicked(object sender, EventArgs e)
   { 
      if(sender == this.PieChartControl)
          this.ChartClicked = ChartClicked .Pie;
      else if(sender == this.BarChartControl)
          this.ChartClicked = ChartClicked .Bar;
      this.Close();
   }
}

Form1:

// the form having the pie chart control
public partial class Form1: Form
{
   // other methods ...

   public void SetDataSource(object src)
   {
      this.PieChartControl.SetDataSource(src);
   }
}

Form2:

// the form having the bar chart control
public partial class Form2: Form
{
   // other methods ...

   public void SetDataSource(object src)
   {
      this.BarChartControl.SetDataSource(src);
   }
}

饼图控件:

public partial PieChartControl: UserControl
{
   // other methods ...
   public void SetDataSource(object src)
   {
      // set the series type to Pie etc... 
      this.chart.DataSource = src;
   }
}

【讨论】:

    【解决方案2】:

    我可以想到几种方法。

    1) 让您的图表连接到数据源以获取数据。表格 1 中的图表和表格 3 中的图表 1 连接到数据源 1。表格 2 中的图表和表格 3 中的图表 2 连接到另一个数据源。图表将显示相同的数据,因此它们的外观将相同。这就像许多标准控件一样。但是,如果用户可以与您的图表交互,则您需要阻止表单 3 中图表的交互(具有只读属性),并将表单 1 和 2 中的图表中的所有事件复制到表单 3 中的图表中。

    2) 向表单 1 和 2(或图表 1 和 2)添加方法,以将其当前显示为图像。表格 3 包含 2 个显示这些图像的 PictureBox 控件。如果有任何交互,您可以定期在计时器事件中获取图像。无论如何,您的图表控件可能会有一个图像的缓存副本,可以快速检索。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-09-28
      • 1970-01-01
      • 2012-06-27
      • 2011-02-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多