一、主要程序段
1.登录表格,创建datagridview1
#region 程序登录即创建datagridview
private void Form1_Load(object sender, EventArgs e)
{
//根据Header和所有单元格的内容自动调整行的高度
dataGridView1.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells;
//添加10列
for (int i = 0; i < 11; i++)
{
dataGridView1.Columns.Add(new DataGridViewTextBoxColumn());
dataGridView1.Columns[i].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells; //设置所有列自适应宽度
}
//三列的标题
dataGridView1.Columns[0].HeaderText = label12.Text;
dataGridView1.Columns[1].HeaderText = label5.Text;
dataGridView1.Columns[2].HeaderText = label9.Text;
dataGridView1.Columns[3].HeaderText = label10.Text;
dataGridView1.Columns[4].HeaderText = label1.Text;
dataGridView1.Columns[5].HeaderText = label2.Text;
dataGridView1.Columns[6].HeaderText = label3.Text;
dataGridView1.Columns[7].HeaderText = label4.Text;
dataGridView1.Columns[8].HeaderText = label8.Text;
dataGridView1.Columns[9].HeaderText = label7.Text;
dataGridView1.Columns[10].HeaderText = label6.Text;
//设置对齐方式和字体
dataGridView1.RowsDefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
dataGridView1.Font = new Font("宋体", 15);
textBox1.Text = "150";
textBox2.Text = "20";
textBox3.Text = "10";
textBox4.Text = "3";
textBox5.Text = "4";
textBox6.Text = "5";
textBox7.Text = "6";
button2.Enabled = false;
}
#endregion
2.设计矩形线圈磁场计算公式实现
#region 矩形线圈磁场计算公式实现
private void button1_Click(object sender, EventArgs e)
{
try
{
//令结果显示文本框只读。
textBox8.ReadOnly = true;
textBox9.ReadOnly = true;
textBox10.ReadOnly = true;
textBox11.ReadOnly = true;
//读取线圈参数和坐标值
double la_in = Convert.ToSingle(textBox1.Text);
double lb_in = Convert.ToSingle(textBox2.Text);
double lI = Convert.ToSingle(textBox3.Text);
double ln = Convert.ToSingle(textBox4.Text);
double Xi = Convert.ToSingle(textBox5.Text);
double Yi = Convert.ToSingle(textBox6.Text);
double Zi = Convert.ToSingle(textBox7.Text);
double la = la_in / 2;
double lb = lb_in / 2; //长方形线圈长150米,宽20米。
double u0 = 4 * Math.PI * Math.Pow(10, -7);// 令U0 = 4π * 10(-7),计算得磁感应强度(T)
double beita = Math.Pow(10, 9);// 比例系数,磁感应强度(T)转换为磁感应强度(nT)
//空间坐标Xi,Yi,Zi; Xi为 - 0.9l1到 + 0.9l1; Yi为 - 0.9l2到 + 0.9l2; Zi为0到 - 20;
if (Math.Abs(Xi) <= 1.9 * la)
{
if (Math.Abs(Yi) <= 1.9 * lb)
{
if (Math.Abs(Zi) <= 21)
{
//1.Bz计算
//Babz计算
double zab1 = (1 / (4 * Math.PI * (Math.Pow((lb + Yi), 2) + Math.Pow(Zi, 2)))) * u0 * lI * (lb + Yi);
double zab2 = (1 / (Math.Sqrt(Math.Pow((la + Xi), 2) + Math.Pow((lb + Yi), 2) + Math.Pow(Zi, 2)))) * (la + Xi);
double zab3 = (1 / (Math.Sqrt(Math.Pow((la - Xi), 2) + Math.Pow((lb + Yi), 2) + Math.Pow(Zi, 2)))) * (la - Xi);
double Babz = zab1 * (zab2 + zab3);
//Bbcz计算
double zbc1 = (1 / (4 * Math.PI * (Math.Pow((lb - Yi), 2) + Math.Pow(Zi, 2)))) * u0 * lI * (lb - Yi);
double zbc2 = (1 / (Math.Sqrt(Math.Pow((la - Xi), 2) + Math.Pow((lb - Yi), 2) + Math.Pow(Zi, 2)))) * (la - Xi);
double zbc3 = (1 / (Math.Sqrt(Math.Pow((la + Xi), 2) + Math.Pow((lb - Yi), 2) + Math.Pow(Zi, 2)))) * (la + Xi);
double Bbcz = zbc1 * (zbc2 + zbc3);
//Bcdz计算
double zcd1 = (1 / (4 * Math.PI * (Math.Pow((la - Xi), 2) + Math.Pow(Zi, 2)))) * u0 * lI * (la - Xi);
double zcd2 = (1 / (Math.Sqrt(Math.Pow((la - Xi), 2) + Math.Pow((lb + Yi), 2) + Math.Pow(Zi, 2)))) * (lb + Yi);
double zcd3 = (1 / (Math.Sqrt(Math.Pow((la - Xi), 2) + Math.Pow((lb - Yi), 2) + Math.Pow(Zi, 2)))) * (lb - Yi);
double Bcdz = zcd1 * (zcd2 + zcd3);
//Bdaz计算
double zda1 = (1 / (4 * Math.PI * (Math.Pow((la + Xi), 2) + Math.Pow(Zi, 2)))) * u0 * lI * (la + Xi);
double zda2 = (1 / (Math.Sqrt(Math.Pow((la + Xi), 2) + Math.Pow((lb - Yi), 2) + Math.Pow(Zi, 2)))) * (lb - Yi);
double zda3 = (1 / (Math.Sqrt(Math.Pow((la + Xi), 2) + Math.Pow((lb + Yi), 2) + Math.Pow(Zi, 2)))) * (lb + Yi);
double Bdaz = zda1 * (zda2 + zda3);
double Bz_tmp = (Babz + Bbcz + Bcdz + Bdaz) * ln * beita;// 单位为nT
double Bz = Math.Round(Bz_tmp, 3);
//2.Bx计算
//Babx计算
double xab1 = (1 / (4 * Math.PI * (Math.Pow((la - Xi), 2) + Math.Pow(Zi, 2)))) * u0 * lI * Zi;
double xab2 = (1 / (Math.Sqrt(Math.Pow((la - Xi), 2) + Math.Pow((lb + Yi), 2) + Math.Pow(Zi, 2)))) * (lb + Yi);
double xab3 = (1 / (Math.Sqrt(Math.Pow((la - Xi), 2) + Math.Pow((lb - Yi), 2) + Math.Pow(Zi, 2)))) * (lb - Yi);
double Babx = xab1 * (xab2 + xab3);
//Bdax计算
double xda1 = (1 / (4 * Math.PI * (Math.Pow((la + Xi), 2) + Math.Pow(Zi, 2)))) * u0 * lI * Zi;
double xda2 = (1 / (Math.Sqrt(Math.Pow((la + Xi), 2) + Math.Pow((lb - Yi), 2) + Math.Pow(Zi, 2)))) * (lb - Yi);
double xda3 = (1 / (Math.Sqrt(Math.Pow((la + Xi), 2) + Math.Pow((lb + Yi), 2) + Math.Pow(Zi, 2)))) * (lb + Yi);
double Bdax = xda1 * (xda2 + xda3);
double Bx_tmp = (Babx - Bdax) * ln * beita;// 单位为nT
double Bx = Math.Round(Bx_tmp, 3);
//3.By计算
//Bbcy计算
double ybc1 = (1 / (4 * Math.PI * (Math.Pow((lb - Yi), 2) + Math.Pow(Zi, 2)))) * u0 * lI * Zi;
double ybc2 = (1 / (Math.Sqrt(Math.Pow((la - Xi), 2) + Math.Pow((lb - Yi), 2) + Math.Pow(Zi, 2)))) * (la - Xi);
double ybc3 = (1 / (Math.Sqrt(Math.Pow((la + Xi), 2) + Math.Pow((lb - Yi), 2) + Math.Pow(Zi, 2)))) * (la + Xi);
double Bbcy = ybc1 * (ybc2 + ybc3);
//Babz计算
double yab1 = (1 / (4 * Math.PI * (Math.Pow((lb + Yi), 2) + Math.Pow(Zi, 2)))) * u0 * lI * Zi;
double yab2 = (1 / (Math.Sqrt(Math.Pow((la + Xi), 2) + Math.Pow((lb + Yi), 2) + Math.Pow(Zi, 2)))) * (la + Xi);
double yab3 = (1 / (Math.Sqrt(Math.Pow((la - Xi), 2) + Math.Pow((lb + Yi), 2) + Math.Pow(Zi, 2)))) * (la - Xi);
double Baby = yab1 * (yab2 + yab3);
double By_tmp = (Bbcy - Baby) * ln * beita;// 单位为nT
double By = Math.Round(By_tmp, 3);
double B = Math.Round(Math.Sqrt(Math.Pow(Bx_tmp, 2) + Math.Pow(By_tmp, 2) + Math.Pow(Bz_tmp, 2)),3);
textBox8.Text = Convert.ToString(Bz);
textBox9.Text = Convert.ToString(Bx);
textBox10.Text = Convert.ToString(By);
textBox11.Text = Convert.ToString(B);
//datagridview操作
int index = this.dataGridView1.Rows.Add();//添加新行,index返回行号
this.dataGridView1.Rows[index].Cells[0].Value = textBox11.Text;
this.dataGridView1.Rows[index].Cells[1].Value = textBox8.Text;
this.dataGridView1.Rows[index].Cells[2].Value = textBox9.Text;
this.dataGridView1.Rows[index].Cells[3].Value = textBox10.Text;
this.dataGridView1.Rows[index].Cells[4].Value = textBox1.Text;
this.dataGridView1.Rows[index].Cells[5].Value = textBox2.Text;
this.dataGridView1.Rows[index].Cells[6].Value = textBox3.Text;
this.dataGridView1.Rows[index].Cells[7].Value = textBox4.Text;
this.dataGridView1.Rows[index].Cells[8].Value = textBox5.Text;
this.dataGridView1.Rows[index].Cells[9].Value = textBox6.Text;
this.dataGridView1.Rows[index].Cells[10].Value = textBox7.Text;
//自动滚动显示到最后一行
this.dataGridView1.FirstDisplayedScrollingRowIndex = this.dataGridView1.Rows.Count - 1;
//datagridview换行变色
for (int i = 0; i < dataGridView1.Rows.Count; i++)//遍历所有的行
{
if (i % 2 == 0) //判断行索引为偶数
dataGridView1.Rows[i].DefaultCellStyle.BackColor = Color.LightSkyBlue;//隔行更换背景色
}
button2.Enabled = true;
}
else
{
MessageBox.Show("Zi的值要在±21内");
}
}
else
{
MessageBox.Show("Yi的值要在±0.95倍线圈宽度之间");
}
}
else
{
MessageBox.Show("Xi的值要在±0.95倍线圈宽度之间");
}
}//end try
catch (Exception ex)
{
MessageBox.Show("错误!");
}
}
#endregion
3.保存数据至表格,表格位置设定在D盘根目录
#region ExportExcel
public void ExportExcel(string fileName, DataGridView dgv,string strDate )
{
//设置导出文件路径
//string path = HttpContext.Current.Server.MapPath("Export/");
//设置新建文件路径及名称
//string savePath = path + DateTime.Now.ToString("yyyy-MM-dd-HH-mm-ss") + ".xls";
FileInfo finfo = new FileInfo(fileName);
FileStream file = null;
if (finfo.Exists)
{
try
{
//打开文件
//file = new FileStream(fileName, FileMode.Append, FileAccess.Write);
//以指定的字符编码向指定的流写入字符
}
catch (Exception ex)
{
MessageBox.Show("文件打开失败!");
GC.Collect();//强行销毁,系统回收资源
}
}
else
{
try
{
string saveFileName = "";
SaveFileDialog saveDialog = new SaveFileDialog();
saveDialog.DefaultExt = "xls";
saveDialog.Filter = "Excel文件|*.xls";
saveDialog.FileName = fileName;
saveDialog.ShowDialog();
saveFileName = saveDialog.FileName;
if (saveFileName.IndexOf(":") < 0) return; //被点了取消
//创建文件
file = new FileStream(saveFileName, FileMode.OpenOrCreate, FileAccess.Write);
}
catch (Exception ex)
{
MessageBox.Show("文件已存在,保存失败!");
GC.Collect();//强行销毁,系统回收资源
}
}
sw.Flush();
file.Flush();
sw.Close();
sw.Dispose();
file.Close();
file.Dispose();
MessageBox.Show("保存成功!");
dgv.Rows.Clear();
}
#endregion
二、关键点
1.自动滚动显示到最后一行
this.dataGridView1.FirstDisplayedScrollingRowIndex = this.dataGridView1.Rows.Count - 1;
2.datagridview换行变色
for (int i = 0; i < dataGridView1.Rows.Count; i++)//遍历所有的行
{
if (i % 2 == 0) //判断行索引为偶数
dataGridView1.Rows[i].DefaultCellStyle.BackColor = Color.LightSkyBlue;//隔行更换背景色
}
3.写数据到excel
此处只考虑将数据写入到exl文件中,经过网上查找方法,采用较为简单的字符串方式处理。
打包资源已上传:
C#实现线圈磁场计算,数据datagridview可视化,在.net4.5基础上不依赖任何其他组件完成数据保存至excel表格。-C#文档类资源-CSDN下载