C# 用面向对象的思想去编程
再接上一篇博文,之前写的两篇博文虽然实现了功能,但是和控件之间的粘性太大,依赖于控件进行操作,所以这篇博文主要用面向对象的思想做一个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;
}
}
}
最后的效果如图所示:
C# 用面向对象的思想去编程的更多相关文章
- C#基础第七天-作业答案-利用面向对象的思想去实现名片-动态添加
class Card { private string name; public string Name { get { return name; } set { name = value; } } ...
- C#基础第七天-作业-利用面向对象的思想去实现名片-动态添加
1.利用面向对象的思想去实现: (增加,修改,删除,查询,查询全部)需求:根据人名去(删除/查询).指定列:姓名,年龄,性别,爱好,电话. 多条添加 , 动态添加 名片 本系列教程: C#基础总结之八 ...
- C#基础第六天-作业-利用面向对象的思想去实现名片
1.利用面向对象的思想去实现: (增加,修改,删除,查询,查询全部)需求:根据人名去(删除/查询).指定列:姓名,年龄,性别,爱好,电话. 本系列教程: C#基础总结之八面向对象知识点总结-继承与多态 ...
- C#基础第六天-作业答案-利用面向对象的思想去实现名片
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- 【quick-cocos2d-x】Lua 面向对象(OOP)编程与元表元方法
版权声明:本文为博主原创文章,转载请注明出处. 面向对象是一种对现实世界理解和抽象的方法,是计算机编程技术发展到一定阶段后的产物. 早期的计算机编程是基于面向过程的方法,通过设计一个算法就可以解决当时 ...
- python 面向对象设计思想发展史
这篇主要说的是程序设计思想发展历史,分为概述和详细发展历史 一,概述 1940年以前:面向机器 最早的程序设计都是采用机器语言来编写的,直接使用二进制码来表示机器能够识别和执行的 指令和数 据.简单来 ...
- java面向对象的思想(java三大特性)
用通俗易懂的语言来理解java面向对象的思想 大家都知道,java是面向对象的编程,掌握面向对象的编程思想是掌握java编程语言的核心,但是很多人在面向对象方面都存在或多或少的误区,有的是刚学完C语言 ...
- 聚焦JavaScript面向对象的思想
面向对象是一种软件开发方法,是一种对现实世界理解和抽象的方法,是计算机编程技术发展到一定阶段后的产物.随着时代的发展,计算机被用于解决越来越复杂的问题.一切事物皆对象,通过面向对象的方式,将现实世界的 ...
- 【Java并发基础】利用面向对象的思想写好并发程序
前言 下面简单总结学习Java并发的笔记,关于如何利用面向对象思想写好并发程序的建议.面向对象的思想和并发编程属于两个领域,但是在Java中这两个领域却可以融合到一起.在Java语言中,面向对象编程的 ...
随机推荐
- [转载]PowerDesigner生成的ORACLE 建表脚本中去掉对象的双引号,设置大、小写
若要将 CDM 中将 Entity的标识符都设为指定的大小写,则可以这么设定: 打开cdm的情况下,进入Tools-Model Options-Naming Convention,把Name和Code ...
- Java中在java.sql.Date的系统时间上加上30天并写入oracle
在java.sql.Date的系统时间上加上30天,并写入oracle 思路:通过 Calendar.getInstance() 获得对象,然后 add() 方法添加 时间,再通过 new java. ...
- react复习总结(2)--react生命周期和组件通信
这是react项目复习总结第二讲, 第一讲:https://www.cnblogs.com/wuhairui/p/10367620.html 首先我们来学习下react的生命周期(钩子)函数. 什么是 ...
- 流媒体协议(RTMP、RTSP、UDP、HTTP、MMS)转换小工具(RTSP转成RTMP案例展示)(转)
源: 流媒体协议(RTMP.RTSP.UDP.HTTP.MMS)转换小工具(RTSP转成RTMP案例展示)
- Prometheus监控学习笔记之初识PromQL
0x00 概述 Prometheus 提供了一种功能表达式语言 PromQL,允许用户实时选择和汇聚时间序列数据.表达式的结果可以在浏览器中显示为图形,也可以显示为表格数据,或者由外部系统通过 HTT ...
- 小程序 canvas实现图片预览,图片保存
wxml 代码: <view class="result-page"> <canvas bindtap="previewImage" canv ...
- Golang字符串函数认识(一)
package main import ( "fmt" "strings" "strconv" ) func main(){ //返回字符串 ...
- P4890 Never·island(dp)
P4890 Never·island 求门开的最小时间,其实也就是求门关的最大时间. 坐标这么大....显然坐标要离散化 离散化排序后,我们发现x轴被这些点划分成若干条线段$(l,r)$,并且有4种情 ...
- 强大的shell(一键redis,mysql,php,openresty,jdk)
前序 集成了一键安装离线包redis,mysql,php,openresty,jdk,系统优化等脚本, 一个shell搞掂. JDK:自动识别本地安装包,自动解压,部署,配置环境变量. REDIS:自 ...
- linux下部署git服务器
我这里用的是redhat7.4, 直接开始吧. 环境 服务端: Redhat7.4 + git(version 1.8.3.1) IP:192.168.137.168 客户端: win7 + git ...