C# 来源=爱马仕;数据库=qc值;综合安全=SSPI;"; 正在使用(var myConnection=newsqlconnection(连接\字符串)) { myConnection.Open(); var命令=新的SqlCommand(查询,myConnection); var adapter=newsqldataadapter(命令); 适配器。填充(ds); } 返回ds; } 私有void btnGenerateGraph_单击(对象发送者,事件参数e) { 字符串图_query=@“选择报告时间前1000名, 数据路径, 财政部, 仪器 来自batchinfo 在batchinfo.rowid=qvalues.rowid上加入qvalues 其中复合=“+cbQCValues.Text+”“+ “和名称='”+cbAnalytes.Text+“”+ “和batchinfo.instrument='”+cbInstruments.Text+“”+ “和batchinfo.reporttime类似于'10/%/2010%'”; qResults=ConnectandReadList(图形查询); if(qResults.Rows.Count==0) { Show(“您的查询没有返回任何结果!”); 返回; } 图表1.DataSource=qResults; InitializeChart(); dataGridView1.Columns.Clear(); dataGridView1.DataBindings.Clear(); dataGridView1.DataSource=qResults; } 私有无效图表1\u鼠标向下(对象发送方,鼠标目标e) { //呼叫命中测试方法 HitTestResult=图表1.HitTest(e.X,e.Y); if(result.ChartElementType==ChartElementType.DataPoint) { dataGridView1.Rows[result.PointIndex].Selected=true; dataGridView1.FirstDisplayedScrollingRowIndex=result.PointIndex; } } 私有void btnDelete\u单击(对象发送者,事件参数e) { Int32 selectedRowCount= dataGridView1.Rows.GetRowCount(DataGridViewElementState.Selected); 如果(selectedRowCount==1) { qResults.Rows.RemoveAt(dataGridView1.SelectedRows[0].Index); InitializeChart(); } } } }

C# 来源=爱马仕;数据库=qc值;综合安全=SSPI;"; 正在使用(var myConnection=newsqlconnection(连接\字符串)) { myConnection.Open(); var命令=新的SqlCommand(查询,myConnection); var adapter=newsqldataadapter(命令); 适配器。填充(ds); } 返回ds; } 私有void btnGenerateGraph_单击(对象发送者,事件参数e) { 字符串图_query=@“选择报告时间前1000名, 数据路径, 财政部, 仪器 来自batchinfo 在batchinfo.rowid=qvalues.rowid上加入qvalues 其中复合=“+cbQCValues.Text+”“+ “和名称='”+cbAnalytes.Text+“”+ “和batchinfo.instrument='”+cbInstruments.Text+“”+ “和batchinfo.reporttime类似于'10/%/2010%'”; qResults=ConnectandReadList(图形查询); if(qResults.Rows.Count==0) { Show(“您的查询没有返回任何结果!”); 返回; } 图表1.DataSource=qResults; InitializeChart(); dataGridView1.Columns.Clear(); dataGridView1.DataBindings.Clear(); dataGridView1.DataSource=qResults; } 私有无效图表1\u鼠标向下(对象发送方,鼠标目标e) { //呼叫命中测试方法 HitTestResult=图表1.HitTest(e.X,e.Y); if(result.ChartElementType==ChartElementType.DataPoint) { dataGridView1.Rows[result.PointIndex].Selected=true; dataGridView1.FirstDisplayedScrollingRowIndex=result.PointIndex; } } 私有void btnDelete\u单击(对象发送者,事件参数e) { Int32 selectedRowCount= dataGridView1.Rows.GetRowCount(DataGridViewElementState.Selected); 如果(selectedRowCount==1) { qResults.Rows.RemoveAt(dataGridView1.SelectedRows[0].Index); InitializeChart(); } } } },c#,.net,winforms,class,C#,.net,Winforms,Class,如何组织代码取决于应用程序的规模和复杂性 如果要编写大型应用程序,可能需要使用不同的层来处理数据库、业务逻辑和表示 对于像您这样的小型应用程序,直接使用数据绑定到数据库查询可能更简单。您已经在使用类,但不是最干净、最模块化的方式。通常认为将数据操作和业务逻辑组合到一个UI类中是一个坏主意。这就是为什么要发明数据绑定来分离数据,将UI和业务逻辑分成更模块化的部分 我认为这是一个主观问题……如果它已经起作用了,为什么要修复它 但从另一个角度来看,如果这是一个更大系统的一部分,我会将它不仅拆分为单独的

如何组织代码取决于应用程序的规模和复杂性

如果要编写大型应用程序,可能需要使用不同的层来处理数据库、业务逻辑和表示


对于像您这样的小型应用程序,直接使用数据绑定到数据库查询可能更简单。

您已经在使用类,但不是最干净、最模块化的方式。通常认为将数据操作和业务逻辑组合到一个UI类中是一个坏主意。这就是为什么要发明数据绑定来分离数据,将UI和业务逻辑分成更模块化的部分


我认为这是一个主观问题……如果它已经起作用了,为什么要修复它

但从另一个角度来看,如果这是一个更大系统的一部分,我会将它不仅拆分为单独的类,而且拆分为单独的程序集和名称空间


对于手头的任务,您的代码是正确的。我现在不会担心它,除非您已经是一名熟练的程序员(了解语法),并且目标是为更大规模的系统实现良好的模块化系统设计。

我对这一点很感兴趣。Form1是一个类

在这一点上,我唯一可能建议的真正改变是将其转换为复合控件。这样,您可以根据需要将该功能放到不同的表单上

看看这张照片和一张照片


你这样做可能是为了学习新的东西。

@slaks你应该准备好参加沙巴派对,不要在这里浪费时间。我会让大狗来回答这个问题,但最重要的问题是,以后会发生什么?这个节目的唯一目的是显示信息吗?那么你可能不需要工作了但是,如果你在未来的数据中使用更多的面向对象,那么你最好在数据中考虑更多的面向对象。如果你以前从未处理过面向对象编程,那么这需要时间来掌握。nt问题基于你只是学习这些东西还是为了工作?因为使用内置向导确实可以提高你的工作效率。@austin我只是学习和做一些事情job@iamagirl:那么项目的大小是多少?您可能希望将其拆分为单独的程序集,用于数据访问代码和UI逻辑。可能即使是在一个业务逻辑级别/层中进行混合。系统设计也不仅仅是将内容拆分为类。类必须针对其任务进行良好的设计。我要说的是,一个SO答案不能涵盖正确答案所需的所有方面,这更多的是关于主题地址的书籍。。。
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();                          

            }
        }


    }
}