再接上一篇博文,之前写的两篇博文虽然实现了功能,但是和控件之间的粘性太大,依赖于控件进行操作,所以这篇博文主要用面向对象的思想做一个Demo,将逻辑层与显示层剥离开
首先新建一个窗体文件,搭建界面完毕:
新建一个类,命名为LawHelper
在LawHelper里新建两个对象,分别存放法律法规的名称编号和具体的位置:
public class Law
{
public string Nmae;
public int ID;
} public class LawNode
{
public string Name;
public int Level;
public int Parent;
public int ID;
public string LawName;
public int LawID;
}
再新建三个函数,分别对应着界面上的combobox选项,左边树状图的Node的具体位置以及右边textbox里的具体法律条款的显示:
public List<Law> GetLaws()
{
//实例化Law类
Law law = new Law();
return null;
} public List<LawNode> GetLawNodes(Law law)
{
LawNode lawNode = new LawNode();
return null;
} public string GetLawText(LawNode lawnode)
{
return null;
}
编写第一个函数GetLaws(),获取到对应的法律法规的名称:
public List<Law> GetLaws()
{
//新建List
List<Law> laws = new List<Law>(); //输入想关联的数据库的基本信息
SqlConnection conn = new SqlConnection(@"server = DESKTOP-5SDB4D4;Initial Catalog= test;User ID=sa;Password=lmz123LMZ");
//打开数据库连接
conn.Open();
//sql语句
string str = " select * from [test].[dbo].[TRaw] where c1 = 0";
//创建命令对象
SqlCommand lo_cmd = conn.CreateCommand();
lo_cmd.CommandText = str;
SqlDataReader dtr = lo_cmd.ExecuteReader();
while (dtr.Read())
{
//实例化Law类
Law law = new Law();
//法律名称
law.Nmae = (string)dtr["c3"];
//法律代码
law.ID = (int)dtr["c0"];
//将值赋到List中
laws.Add(law);
}
return laws;
}
值得一提的是,我一开始将对象的实例放在了循环的外面,导致往List赋值的时候后面的值会将前面的值全部覆盖,解决方法就是在循环里实例化
编写第二个和第三个函数,分别获取具体的法律条文的位置以及输出最后的法律条文信息
编写完成后去主界面编写程序,首先实例化LawHelper类:
//实例化LawHelper类
LawHelper lawhelper = new LawHelper();
Law law = new Law();
List<LawNode> lawslocation = new List<LawNode>();
再对应编写对应的函数代码,具体代码如下显示:
LawHelper:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data.SqlClient; namespace WindowsFormsApp4
{
public class Law
{
public string Name;
public int ID;
} public class LawNode
{
//节点的名称
public string name;
//法律的层级
public int Level;
//父节点
public int Parent;
//具体法律条例的ID
public int ID;
//所选法律名称对应的编号
public int LawID;
} public class LawHelper
{
//获取带法律名称及对应的法律编号
public List<Law> GetLaws()
{
//新建List
List<Law> laws = new List<Law>();
//输入想关联的数据库的基本信息
SqlConnection conn = new SqlConnection(@"server = DESKTOP-5SDB4D4;Initial Catalog= test;User ID=sa;Password=lmz123LMZ");
//打开数据库连接
conn.Open();
//sql语句
string str = " select * from [test].[dbo].[TRaw] where c1 = 0";
//创建命令对象
SqlCommand lo_cmd = conn.CreateCommand();
lo_cmd.CommandText = str;
SqlDataReader dtr = lo_cmd.ExecuteReader();
while (dtr.Read())
{
//实例化Law类
Law law = new Law();
//法律名称
law.Name = (string)dtr["c3"];
//法律代码
law.ID = (int)dtr["c0"];
//将值赋到List中
laws.Add(law);
}
dtr.Close();
conn.Close();
return laws;
} //获取法律条文的位置
public List<LawNode> GetLawNodes(Law law)
{
//新建List存放对应的值
List<LawNode> lawslocation = new List<LawNode>();
SqlConnection conn = new SqlConnection(@"server = DESKTOP-5SDB4D4;Initial Catalog= test;User ID=sa;Password=lmz123LMZ");
//打开数据库连接
conn.Open();
//sql语句
string str = " select * from [test].[dbo].[TRaw] where c0 =" + law.ID;
//创建命令对象
SqlCommand lo_cmd = conn.CreateCommand();
lo_cmd.CommandText = str;
SqlDataReader dtr = lo_cmd.ExecuteReader();
while (dtr.Read())
{
//实例化LawNode类
LawNode lawNode = new LawNode();
//层级
lawNode.Level = (int)dtr["c4"];
//法律名称代码
lawNode.LawID = (int)dtr["c0"];
//父节点
lawNode.Parent = (int)dtr["c1"];
//法律名称代码
lawNode.ID = (int)dtr["c2"];
//将值赋到List中
lawslocation.Add(lawNode);
}
dtr.Close();
conn.Close();
return lawslocation;
} //获取具体的法律条文
public string GetLawText(LawNode lawnode)
{ //获取到法律的层级
int level = lawnode.Level;
//获取到法律的编号
int ID = lawnode.ID;
//获取法律名称的ID
int LawID = lawnode.LawID; string lawItem = ""; SqlConnection conn = new SqlConnection(@"server = DESKTOP-5SDB4D4;Initial Catalog= test;User ID=sa;Password=lmz123LMZ");
//打开数据库连接
conn.Open();
//sql语句
string str = "select * from [test].[dbo].[TRaw] where c4 =" + level + "and c0 = " + LawID + "and c2 = " + ID;
//创建命令对象
SqlCommand lo_cmd = conn.CreateCommand();
lo_cmd.CommandText = str;
SqlDataReader dtr = lo_cmd.ExecuteReader();
while (dtr.Read())
{
if((int)dtr["c6"] == )
{
//获取到具体的法律条例
lawItem = (string)dtr["c3"];
}
}
dtr.Close();
conn.Close();
return lawItem;
}
}
}
Form1:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms; namespace WindowsFormsApp4
{
public partial class Form1 : Form
{
//实例化LawHelper类
LawHelper lawhelper = new LawHelper();
Law law = new Law();
List<LawNode> lawslocation = new List<LawNode>(); public Form1()
{
InitializeComponent();
SetComboboxValue();
comboBox1.SelectedIndex = ;
} //设置combobox1的值
public void SetComboboxValue()
{
List<Law> laws = lawhelper.GetLaws();
for (int i = ;i< laws.Count; i++)
{
comboBox1.Items.AddRange(new object[] { laws[i].Name});
}
} //选择不同的法律法规
private void comboBox1_SelectedValueChanged(object sender, EventArgs e)
{
//获取到选中的法律名称
int inx = comboBox1.SelectedIndex;
//树节点清空
treeView1.Nodes.Clear();
List<Law> laws = lawhelper.GetLaws();
law.Name = laws[inx].Name;
law.ID = laws[inx].ID;
lawslocation = lawhelper.GetLawNodes(law);
int count = ; //循环所有的节点
for (int i = ; i < lawslocation.Count; i++)
{
//当level层级为1时,生成所有的父节点
if (lawslocation[i].Level == )
{
TreeNode node = new TreeNode();
node.Text = "第" + NumberToChinese(count) + "条";
treeView1.Nodes.Add(node);
count++;
lawslocation[i].name = node.Text;
}
//当父节点ID与法律法规ID相吻合的时候,生成子节点
//if ()
//{ //} }
} //单击节点弹出消息
private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
{
TreeNode TN = e.Node;
int inx = comboBox1.SelectedIndex;
List<Law> laws = lawhelper.GetLaws();
law.Name = laws[inx].Name;
law.ID = laws[inx].ID;
// List<LawNode> lawslocation = lawhelper.GetLawNodes(law);
for (int i = ; i < lawslocation.Count; i++)
{
LawNode getinfo = new LawNode();
if (TN.Text == lawslocation[i].name)
{
getinfo.ID = lawslocation[i].ID;
getinfo.LawID = lawslocation[i].LawID;
getinfo.Level = lawslocation[i].Level;
textBox1.Text = lawhelper.GetLawText(getinfo);
break;
} }
} //数字转中文
public string NumberToChinese(int number)
{
string res;
string str = number.ToString();
string schar = str.Substring(, );
switch (schar)
{
case "":
res = "一";
break;
case "":
res = "二";
break;
case "":
res = "三";
break;
case "":
res = "四";
break;
case "":
res = "五";
break;
case "":
res = "六";
break;
case "":
res = "七";
break;
case "":
res = "八";
break;
case "":
res = "九";
break;
default:
res = "零";
break;
}
if (str.Length > )
{
switch (str.Length)
{
case :
case :
res += "十";
break;
case :
case :
res += "百";
break;
case :
res += "千";
break;
case :
res += "万";
break;
default:
res += "";
break;
}
res += NumberToChinese(int.Parse(str.Substring(, str.Length - )));
} res = res.Replace("十零", "十").Replace("一十", "十");
return res;
}
}
}
最后的效果如图所示: