Как я могу показать две диаграммы из двух форм в другой форме, как обзор - PullRequest
0 голосов
/ 10 сентября 2011

Я реализую элементы управления диаграммой .... У меня есть три формы, скажем, form1 form2 form3 .....

в form1 Я показываю некоторые данные в виде круговой диаграммы

form2 я показываю некоторые данные в виде гистограммы ... это нормально работает ...

моя проблема в том, что я хочу показать эти две диаграммы в форме 3, как в форме просмотра ... где пользователь будетпросмотреть все графики ...

Поэтому, когда я нажму на кнопку, форма 3 будет открыта с двумя диаграммами рядом (одна круговая диаграмма в форме 1, другая - гистограмма в форме 2), если выщелкните на одной из диаграмм в форме 3, она перейдет в соответствующую форму ... вот так ....

кто-нибудь мог бы иметь представление об этом, как реализовать ...

Большое спасибо заранее ....

Ответы [ 2 ]

3 голосов
/ 10 сентября 2011

Я бы сделал что-то такое:

1) Создайте 2 пользовательских элемента управления, содержащие mschart, и назовите их, например, PieChartControl и BarChartControl. Предоставьте метод для установки текущего источника данных (например, SetDataSource(DataTable dt)) и поместите туда логику для привязки источника данных к PieChart или BarChart

2) Создайте 3 формы: в Form1 добавьте PieChartControl, в Form2 добавьте BarChartControl и в Form3 добавьте SplitContainer, где вы добавите PieChartControl и BarChartControl.

3) Экспонировать метод SetDataSource() также в Form1 и Form2 (он просто вызовет соответствующий метод внутреннего контроля)

4) Выставить также SetDataSource() метод в Form3; он будет вызывать как SetDataSource() методы внутреннего PieChartControl, так и BarChartControl.

5) Form3 должен также предоставить пользовательское свойство (например, ChartClicked), указывающее на диаграмму, по которой щелкнули

6) В форме 3 подпишитесь на событие Click (или DoubleClick, если хотите) на PieChartControl и BarChartControl

7) Когда срабатывает событие Click, просто установите свойство ChartClicked и закройте форму


Ниже приведены примеры кода, которые помогут вам понять мое объяснение.

Список помощников:

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

MainForm:

// 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);
   }
}

Форма 2:

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

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

PieChartControl:

public partial PieChartControl: UserControl
{
   // other methods ...
   public void SetDataSource(object src)
   {
      // set the series type to Pie etc... 
      this.chart.DataSource = src;
   }
}
0 голосов
/ 10 сентября 2011

Я могу придумать пару способов сделать это.

1) Подключите свои диаграммы к источнику данных для своих данных.Диаграмма в форме 1 и диаграмма 1 в форме 3 соединяются с источником данных 1. Диаграмма в форме 2 и диаграмма 2 в форме 3 соединяются с другим источником данных.Графики будут отображать те же данные, поэтому их внешний вид будет таким же.Это было бы похоже на многие стандартные элементы управления.Однако если пользователь может взаимодействовать с вашими диаграммами, вам необходимо заблокировать это взаимодействие (иметь свойство только для чтения) для диаграмм в форме 3 и дублировать все события из диаграмм в формах 1 и 2 в диаграммы в форме 3.

2) Добавьте метод к формам 1 и 2 (или к диаграммам 1 и 2), чтобы получить их текущее отображение в виде изображения.Форма 3 содержит 2 элемента управления PictureBox, которые показывают эти изображения.Если есть какое-либо взаимодействие, вы можете периодически получать изображение на событие таймера.Ваш элемент управления диаграммой, вероятно, в любом случае будет иметь кэшированную копию изображения, которую можно быстро получить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...