2011-09-10 42 views
0

我實現圖表控件.... 我有三種形式說Form1的窗口2 form3 .....我該怎麼讓來自兩種形式的兩個圖表的另一種形式像概述

在Form1我顯示在餅圖的形式,一些數據

窗口2我顯示在柱狀圖的形式的一些數據..這就是工作的罰款...

我的問題是我要顯示在表格3像這兩個圖表在視圖窗體中...用戶將看到所有圖表...

因此,當我點擊按鈕時,表單3將與兩個圖表並排(一個是form1中的餅圖,另一個是form2中的條形圖)打開,如果您單擊form3中的某個圖表,它將會轉到相應的form..like這個....

會不會有人對此有如何實現任何想法...

提前許多感謝....

+0

什麼阻止你把它產生在形式1和一個圖表的方法調用在Form3中的Form 2中的其他圖表的所以,當Form3加載時,你生成它的兩個圖表?然後單擊可以使用form1.Show()例如顯示任何您喜歡的表單。我說方法調用不是一個可怕的複製粘貼,如果你認爲涉及太多的複製,那麼你應該考慮創建一個包含你的圖表生成邏輯的助手類,以便從這兩個表單中調用這樣的助手。 –

+0

當您單擊Form3中的兩個圖表中的一個時,是否已關閉Form3?總之,form3總是可見或不可以? – digEmAll

+0

@digEmall ..當我點擊圖表中的任何一個時,form3將被關閉,並且其中一個圖表將被打開..並且form3將被關閉... –

回答

3

我會做一些這樣的:

1)創建一個包含2個MSChart的用戶控件,並且如給他們打電話PieChartControlBarChartControl。暴露AA方法來設置當前的數據源(例如SetDataSource(DataTable dt))和放在那裏的邏輯到數據源的餅圖或條形圖結合

2)創建的3種形式:在Form1添加PieChartControl,在Form2添加BarChartControlForm3添加一個SplitContainer,您將在其中添加PieChartControlBarChartControl

3)暴露SetDataSource()方法也Form1Form2和(它只是調用相應的內控制方法)

4)暴露也SetDataSource()方法在Form3;它會調用內部PieChartControlBarChartControlSetDataSource()方法。

5)Form3也必須公開定製屬性(例如,ChartClicked),表示已單擊

6圖表)在Form3認購Click事件(或DoubleClick,如你所願)爲PieChartControlBarChartControl

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

我能想到的有幾種方法可以做到這一點。

1)讓你的圖表連接到他們的數據的數據源。表單1中的圖表和表單3中的圖表1連接到數據源1.表單2中的圖表和表單3中的圖表2連接到其他數據源。圖表將顯示相同的數據,因此它們的外觀將是相同的。這將會像許多標準控件一樣。但是,如果用戶可以與圖表交互,則需要爲表單3中的圖表阻止該交互(具有隻讀屬性),並將表單1和表格2中的圖表中的所有事件複製到表單3中的圖表。

2)在窗體1和窗體2(或圖表1和2)中添加一個方法,使其當前顯示爲圖像。表單3包含2個顯示這些圖像的PictureBox控件。如果有任何交互,您可以定期在計時器事件上獲取圖像。無論如何,您的圖表控件可能會有一張緩存的圖像副本,可以快速恢復。