前一篇主要是串口数据的接收,显示和存入数据库。但是这样在客户实际使用时还是很不方便。
现在要如下修改:先把数据先记录在datagridview的表格中,之后当单击“保存数据”时,再批量将数据存储到数据库中。若不想保存数据可以使用“清除显示”按钮。
“导出到excel表格”考虑将整个Access数据库的数据导出。最后还要实现对数据库进行日期管理,分日期操作。
首先修改了一个小地方: 通常 DataGridView 的最下面一行是用户新追加的行(行头显示 * )。不太喜欢,把他去掉了。
dataGridView1.AllowUserToAddRows = false;//通常 DataGridView 的最下面一行是用户新追加的行(行头显示 * )。
//如果不想让用户新追加行即不想显示该新行,可以将 DataGridView 对象的 AllowUserToAddRows 属性设置为 False。
这样接下来清除显示就不会报错了。如不加这句,会提示不能操作新加入数据。
清除显示如下:
private void button6_Click(object sender, EventArgs e) { while (dataGridView1.Rows.Count != 0) { dataGridView1.Rows.RemoveAt(0); } }
在使用过程中还是出现这么两个问题:
1.我的timer1是在tebcontrol的“数据采集与测试”分页中,当我切换到tebcontrol的“数据存储与分析”分页时,timer1就停止了,串口发送数据也就停止了,没有新的数据传过来了。
2.同时,已经存在于数据库中的数据在Formload时会在dataGridView中显示出来,这样当数据库中存有很多数据时就要托动滚动条去找新数据了,而且还不好找。
暂时没找到好的办法,先把导出做了。
使用按钮
private void button5_Click(object sender, EventArgs e)
{
FormAC Form2 = new FormAC();
Form2.Show();
}
重新打开了一个窗口:
由于参考了这样就实现了导出。主要代码如下:
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; namespace WindowsFormsApplication1 { public partial class FormAC : Form { public FormAC() { InitializeComponent(); } public void AccessGuideJoinExcel(string Access, string AccTable, string Excel) { try { string tem_sql = "";//定义字符串 string connstr = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + Access + ";Persist Security Info=True";//记录连接Access的语句 System.Data.OleDb.OleDbConnection tem_conn = new System.Data.OleDb.OleDbConnection(connstr);//连接Access数据库 System.Data.OleDb.OleDbCommand tem_comm;//定义OleDbCommand类 tem_conn.Open();//打开连接的Access数据库 tem_sql = "select Count(*) From " + AccTable;//设置SQL语句,获取记录个数 tem_comm = new System.Data.OleDb.OleDbCommand(tem_sql, tem_conn);//实例化OleDbCommand类 int RecordCount = (int)tem_comm.ExecuteScalar();//执行SQL语句,并返回结果 //每个Sheet只能最多保存65536条记录。 tem_sql = @"select top 65535 * into [Excel 8.0;database=" + Excel + @".xls].[Sheet2] from 博达电池数据表";//记录连接Excel的语句 tem_comm = new System.Data.OleDb.OleDbCommand(tem_sql, tem_conn);//实例化OleDbCommand类 tem_comm.ExecuteNonQuery();//执行SQL语句,将数据表的内容导入到Excel中 tem_conn.Close();//关闭连接 tem_conn.Dispose();//释放资源 tem_conn = null; MessageBox.Show("导入完成"); } catch (Exception ex) { MessageBox.Show(ex.Message, "提示!"); } } public void GetTable(string Apath, ComboBox ComBox) { string connstr = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + Apath + ";Persist Security Info=True"; System.Data.OleDb.OleDbConnection tem_OleConn = new System.Data.OleDb.OleDbConnection(connstr); tem_OleConn.Open(); DataTable tem_DataTable = tem_OleConn.GetOleDbSchemaTable(System.Data.OleDb.OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" }); tem_OleConn.Close(); ComBox.Items.Clear(); for (int i = 0; i < tem_DataTable.Rows.Count; i++) { ComBox.Items.Add(tem_DataTable.Rows[i][2]); } if (ComBox.Items.Count > 0) ComBox.SelectedIndex = 0; } private void button1_Click(object sender, EventArgs e) { openFileDialog1.FileName = ""; if (openFileDialog1.ShowDialog() == DialogResult.OK) { textBox1.Text = openFileDialog1.FileName; GetTable(textBox1.Text, comboBox1); } } private void button4_Click(object sender, EventArgs e) { AccessGuideJoinExcel(textBox1.Text, comboBox1.Text, textBox3.Text + "\\" + textBox4.Text); } private void button3_Click(object sender, EventArgs e) { folderBrowserDialog1.SelectedPath = ""; if (folderBrowserDialog1.ShowDialog() == DialogResult.OK) textBox3.Text = folderBrowserDialog1.SelectedPath; } } }
今天工作到此吧,留了两个问题,只能有空再解决了,话说又是星期一了!