2010-11-05 53 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