2010-11-05 52 views
2

我創建了一個winforms應用程序。它所做的是查詢數據庫並將數據顯示在屏幕上的圖表上。c#初學者對類問題感到沮喪

我的問題是,這是適當的使用類嗎?我知道答案可能是肯定的,但我不知道如何使用這個類的課程。

這是我的代碼。請給我如何把它變成一個類的建議幾塊,如果你認爲是正確的事情:

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 
using System.Windows.Forms.DataVisualization.Charting; 
using System.Data.OleDb; 
using System.Data.SqlClient; 

namespace WindowsFormsApplication1 
{ 

    public partial class Form1 : Form 
    { 

     public Form1() 
     { 
      InitializeComponent(); 
     } 
     private DataTable qResults = new DataTable(); 
     private void Form1_Load(object sender, EventArgs e) 
     { 
      string qcvalues_query = "SELECT DISTINCT name FROM qvalues ORDER by name"; 
      string analytes_query = "SELECT DISTINCT compound FROM qvalues ORDER by compound"; 
      string instruments_query = "SELECT DISTINCT instrument FROM batchinfo WHERE instrument <> '' AND instrument is not Null ORDER by instrument"; 

      dataGridView1.MultiSelect = false; 

      cbAnalytes.DisplayMember = "name"; 
      cbAnalytes.DataSource = ConnectandReadList(qcvalues_query); 

      cbQCValues.DisplayMember = "compound"; 
      cbQCValues.DataSource = ConnectandReadList(analytes_query); 

      cbInstruments.DisplayMember = "instrument"; 
      cbInstruments.DataSource = ConnectandReadList(instruments_query); 
     } 
     private DataSet GetSeriesValues() 
     { 

      Series ser = this.chart1.Series["Series1"]; 

      DataSet dataSet = new DataSet(); 
      DataTable seriesTable = new DataTable(ser.Name); 

      seriesTable.Columns.Add(new DataColumn("No", typeof(int))); 
      seriesTable.Columns.Add(new DataColumn("X", typeof(string))); 
      seriesTable.Columns.Add(new DataColumn("Y", typeof(double))); 

      for (int count = 0; count < ser.Points.Count; count++) 
      { 
       DataPoint p = ser.Points[count]; 
       seriesTable.Rows.Add(new object[] { count, p.XValue, p.YValues[0] }); 
      } 

      dataSet.Tables.Add(seriesTable); 
      return dataSet; 
     } 

     private void chart1_MouseMove(object sender, MouseEventArgs e) 
     { 
      // Call Hit Test Method 
      HitTestResult result = chart1.HitTest(e.X, e.Y); 

      // Reset Data Point Attributes 
      foreach (DataPoint point in chart1.Series[0].Points) 
      { 
       point.BackSecondaryColor = Color.Black; 
       point.BackHatchStyle = ChartHatchStyle.None; 
       point.BorderWidth = 1; 
      } 

      // If a Data Point or a Legend item is selected. 
      if 
      (result.ChartElementType == ChartElementType.DataPoint || 
       result.ChartElementType == ChartElementType.LegendItem) 

       { 
        try 
        { 
         // Set cursor type 
         this.Cursor = Cursors.Hand; 


         // Find selected data point 
         DataPoint point = chart1.Series[0].Points[result.PointIndex]; 

         // Set End Gradient Color to White 
         point.BackSecondaryColor = Color.White; 

         // Set selected hatch style 
         point.BackHatchStyle = ChartHatchStyle.Percent25; 

         // Increase border width 
         point.BorderWidth = 2; 
        } 
        catch { } 
       } 
      else 
      { 
       // Set default cursor 
       this.Cursor = Cursors.Default; 
      } 
     } 


     private void InitializeChart() 
     { 
      chart1.Series["Series1"].ChartType = SeriesChartType.Line; 
      chart1.Series["Series1"].MarkerStyle = MarkerStyle.Circle; 
      chart1.Series["Series1"].MarkerSize = 8; 

      // Set series members names for the X and Y values 
      chart1.Series["Series1"].XValueMember = "datapath"; 
      chart1.Series["Series1"].YValueMembers = "finalconc"; 



      chart1.DataBind(); 

      // Calculate Mean 
      double mean = chart1.DataManipulator.Statistics.Mean("Series1"); 

      // Calculate Median 
      double median = chart1.DataManipulator.Statistics.Median("Series1"); 

      // Calculate Standard Deviation from the Variance 
      double variance = chart1.DataManipulator.Statistics.Variance("Series1", true); 
      double standardDeviation = Math.Sqrt(variance); 

      // Set Strip line item 
      chart1.ChartAreas[0].AxisY.StripLines[0].IntervalOffset = mean - Math.Sqrt(variance); 
      chart1.ChartAreas[0].AxisY.StripLines[0].StripWidth = 2.0 * Math.Sqrt(variance); 

      // Set Strip line item 
      chart1.ChartAreas[0].AxisY.StripLines[1].IntervalOffset = mean; 

      // Set Strip line item 
      chart1.ChartAreas[0].AxisY.StripLines[2].IntervalOffset = median; 

      DataPoint maxValuePoint = chart1.Series["Series1"].Points.FindMaxByValue(); 
      DataPoint minValuePoint = chart1.Series["Series1"].Points.FindMinByValue(); 

      chart1.ChartAreas[0].AxisY.Maximum = maxValuePoint.YValues.Max(); 
      chart1.ChartAreas[0].AxisY.Minimum = minValuePoint.YValues.Min(); 

      // Refresh Chart 
      chart1.Invalidate(); 

     } 

     private DataTable ConnectandReadList(string query) 
     { 
      DataTable ds = new DataTable(); 
      string connection_string = "Data Source=hermes;database=qcvalues; Integrated Security=SSPI;"; 
      using (var myConnection = new SqlConnection(connection_string)) 
      { 
       myConnection.Open(); 
       var command = new SqlCommand(query, myConnection); 
       var adapter = new SqlDataAdapter(command); 
       adapter.Fill(ds); 
      } 
      return ds; 
     } 


     private void btnGenerateGraph_Click(object sender, EventArgs e) 
     { 
      string graph_query = @"SELECT top 1000 reporttime, 
        datapath, 
        finalconc, 
        instrument 
        FROM batchinfo 
        JOIN qvalues ON batchinfo.rowid = qvalues.rowid 
        WHERE compound = '" + cbQCValues.Text + "'" + 
        "AND name = '" + cbAnalytes.Text + "'" + 
        "AND batchinfo.instrument = '" + cbInstruments.Text + "'" + 
        "AND batchinfo.reporttime LIKE '10/%/2010%'"; 


      qResults = ConnectandReadList(graph_query); 
      if (qResults.Rows.Count == 0) 
      { 
       MessageBox.Show("Your query did not return any results!"); 
       return; 
      } 

      chart1.DataSource = qResults; 
      InitializeChart(); 


      dataGridView1.Columns.Clear(); 
      dataGridView1.DataBindings.Clear(); 
      dataGridView1.DataSource = qResults; 

     } 

     private void chart1_MouseDown(object sender, MouseEventArgs e) 
     { 
      // Call Hit Test Method 
      HitTestResult result = chart1.HitTest(e.X, e.Y); 

      if (result.ChartElementType == ChartElementType.DataPoint) 
      { 

       dataGridView1.Rows[result.PointIndex].Selected = true; 
       dataGridView1.FirstDisplayedScrollingRowIndex = result.PointIndex; 

      } 


     } 

     private void btnDelete_Click(object sender, EventArgs e) 
     { 
      Int32 selectedRowCount = 
     dataGridView1.Rows.GetRowCount(DataGridViewElementStates.Selected); 
      if (selectedRowCount == 1) 
      {         
       qResults.Rows.RemoveAt(dataGridView1.SelectedRows[0].Index); 
       InitializeChart();       

      } 
     } 


    } 
} 
+5

'Form1'是一個類。 – SLaks 2010-11-05 20:26:50

+0

@slaks你應該準備好shabbas而不是在這裏浪費時間 – 2010-11-05 20:27:58

+0

我會留給大狗來回答,但最重要的問題是後面會發生什麼?該計劃的唯一目的是*顯示*信息?那麼你可能不需要擔心使這個面向對象的東西比現在更多。但是,如果將來可能會用到更多,那麼您最好在數據中考慮更多的面向對象。 – Crisfole 2010-11-05 20:28:45

回答

1

我與slaks在此。 Form1是一個類。

我現在可能會建議的唯一真正的變化就是將它變成一個複合控制。這樣,您可以根據需要將該功能放到不同的表單上。

查看MS walkthroughsmaller article here

你可能會這樣做,除了學習新東西外沒有別的原因。

2

你如何組織你的代碼依賴於應用程序的規模和複雜性。

如果您正在編寫一個大型應用程序,您可能希望使用不同的圖層來處理數據庫,業務邏輯和演示文稿。

對於像您這樣的小型應用程序,使用數據綁定直接到數據庫查詢可能會更簡單。

2

您已經在使用類,但不是最乾淨,最模塊化的方式。在單個UI類中組合數據操作和業務邏輯通常被認爲是一個糟糕的主意。這就是爲什麼MVC composite pattern是爲了將你的數據,UI和biz邏輯分離成更多模塊化的東西而發明的。

Here's another article,C#具體,要看。

2

我認爲這是一個主觀的問題...如果它已經工作,爲什麼要修復它?但是從另一個角度來看,如果這是一個更大的系統的一部分,我不僅將它分成單獨的類,而且還分離出不同的程序集和名稱空間。

你的代碼是正確的,對於手頭的任務。除非您已經是一名熟練的程序員(瞭解語法),並且其目標是爲大規模系統實現良好的模塊化系統設計,否則我現在不會擔心它。

+1

我想要正確地做事 – 2010-11-05 20:35:06

+1

@iamagirl:那麼項目的規模是什麼?您可能希望將其分解爲單獨的程序集以獲取數據訪問代碼和UI邏輯。也許甚至可以通過業務邏輯層/混合層進行。系統設計也不僅僅是將東西分成類。這些課程必須爲他們的任務做好設計。我所說的是,一個SO的答案不能涵蓋一個正確的答案所需的全部理由,這是關於這個問題的書的更多內容...... – 2010-11-05 20:38:19