C# 学习笔记 三层架构系列(控件一)
下面是我两周的学习总结:这是我写给自己的,如果哪位朋友有幸看到这篇文章就是缘分。如果所说的内容不对,就请纠正。勿喷!!!
想要将两周的学习知识通过文字、通过代码、通过图片储备起来,以防自己那天思维短路可以再次方便自己回顾。
下面第一节我将要学习三层架构基础东西
C#结构分为三层:1、UI层:就是Winform的框架集,方便用户对控件的操作与对控件的事件处理等。
2、BLL层:用于自己是JAVA出身,做东西喜欢和JAVA比较,我认为这层就是java的接口或service,用来声明void和有返回值的接口。用于在UI层调用相应的接口,并在DAL层实现所要执行的操作。
3、DAL层:对我来说就是JAVA中的IMPL实现,有返回值方法和无返回值方法等。也可在这里做事务处理等(后期再聊)。
百度:--------------
3层架构是一种“客户端-服务器”架构,在此架构中用户接口,商业逻辑,数据保存以及数据访问被设计为独立的模块。主要有3个层面,第一层(表现层,GUI层),第二层(商业对象,商业逻辑层),第三层(数据访问层)。这些层可以单独开发,单独测试。
----------------------
下面将做的是对控件的处理:
1、
拖入三个复选框在页面上,对name进行简单的命名
2、下载对三个复选框做状态的更改 ‘选中、非选中’。
首先在加载窗口中定义
ArrayList tab1_ArrayList_CheckBox = new ArrayList();
tab1_ArrayList_CheckBox.Add(checkBox1_jjxx);
tab1_ArrayList_CheckBox.Add(checkBox2_kwjlj);
tab1_ArrayList_CheckBox.Add(checkBox3_jg);
// 通过[QueryFrmSetControlINFO]存储过程 查询出Operator所有数据 CheckStutas,BaseName,TabIndex
DataSet ds = setControl_BLL.QueryFrmSetControlINFO();
GetTabArrayListCheckBox(ds, tab1_ArrayList_CheckBox);
//GetTabArrayListCheckBox(ds, tab1_ArrayList_CheckBox);
private void GetTabArrayListCheckBox(DataSet ds, ArrayList tabArrayList)
{
// 遍历CheckBox复选框集合
for (var i = 0; i < tabArrayList.Count; i++)
{
CheckBox CheckBox = (CheckBox)tabArrayList[i];
// 遍历Operator表中的记录 进行列名称比较
for (var j = 0; j < ds.Tables[0].Rows.Count; j++)
{
// 比较页面上字段与数据库属性是否相同
if (CheckBox.Text == ds.Tables[0].Rows[j]["BaseName"].ToString())
{
Boolean checkBox_Checked_Flag = ds.Tables[0].Rows[j]["CheckStutas"].ToString() == "True" ? true : false;
CheckBox.Checked = checkBox_Checked_Flag;
break;
}
}
}
}
这段代码就意味着数据库中会有对应的数据表存储的三个复选框中的数据,会保存三个复选框的数值和选中状态。

之后会通过窗体加载事件将三个复选框的checked的状态通过名称做比较,如果true代表选中。
--------------
下面将通过按钮保存三个复选框的数据状态等。
通过按钮单击事件:保存数据
private void button_OK_Click(object sender, EventArgs e)
{
//Tab1
//int index = 1;
//int index = int.Parse(tabPage1.Name.Substring(tabPage1.Text.Length - 1));
int index1 = int.Parse(tabPage1.Name.Substring(tabPage1.Name.Length - 1));
UpdateOperatorCheckBoxCheckStutas(tab1_ArrayList_CheckBox, index1);
}
private void UpdateOperatorCheckBoxCheckStutas(ArrayList tab_ArrayList_CheckBox, int index)
{
int Check_Stutas;
string Check_Title;
// 遍历CheckBox复选框集合
for (var i = 0; i < tab_ArrayList_CheckBox.Count; i++)
{
CheckBox CheckBox = (CheckBox)tab_ArrayList_CheckBox[i];
if (CheckBox.Checked)
{
Check_Stutas = 1;
Check_Title = CheckBox.Text;
}
else
{
Check_Stutas = 0;
Check_Title = CheckBox.Text;
}
//更新Operator表中CheckStatus,BaseName两个字段
UpdateCheckBox(Check_Stutas, Check_Title, index);
}
}
。。。。。。。。。。。。。。。。割了 上面是对CheckBox的加载和处理
第二内容:是对groupbox的处理
1、如通过按钮来控制groupbox容器的显示与否。
数据库中数据及状态:

ArrayList arrayList1_GroupBox = new ArrayList();
private void Frmsetting_Load(object sender, EventArgs e)
{
// 通过[GetFrmSettingINFO]存储过程 查询出Operator所有数据
DataSet ds = frmsetting_BLL.Frmsetting_Operator_BLL();
// 将GroupBox加载到ArrayList集合
arrayList1_GroupBox.Add(groupBox2_jjxx);
arrayList1_GroupBox.Add(groupBox1_kwjlj);
arrayList1_GroupBox.Add(groupBox4_jj);
// 传参ArrayList 进行遍历
GetArrayList_GroupBox(ds, arrayList1_GroupBox);
// 通过[GetFrmSettingINFO]存储过程 查询出Operator所有数据
// 传参ArrayList 进行遍历
private void GetArrayList_GroupBox(DataSet ds, ArrayList alist)
{
// 遍历ArrayList中存储的个数
for (int i = 0; i < alist.Count; i++)
{
GroupBox groupBox = (GroupBox)alist[i];
// 遍历数据库表Operator 中数据的个数
for (var j = 0; j < ds.Tables[0].Rows.Count; j++)
{
// 名称和数据库表Operator表中属性做比较
if (groupBox.Text == ds.Tables[0].Rows[j]["BaseName"].ToString())
{
Boolean groupBox_Visible = ds.Tables[0].Rows[j]["CheckStutas"].ToString() == "True" ? true : false;
groupBox.Enabled = groupBox_Visible;
break;
}
}
}
}
在数据库中查询groupbox的属性 之后通过判断来决定是否groupbox的容器控件是否可用。
....................................................割了。。。。。。。。。。。。
--------------------------------------下面是对textbox控件的梳理
在页面上拖动几个textbox控件在界面上

修改名称,之后通过名称来保存数据到数据库中
UI层代码:
private void button_CaoZuo_ok_Click(object sender, EventArgs e)
{
// tabpage1 操作
string caoZuoZhe = txt_CZZ.Text;
string jianCeDiDian = txt_JCDD.Text;
string caiJiShiJian = txt_CJSJ.Text;
if (caoZuoZhe != "" || jianCeDiDian != "" || caiJiShiJian != "")
{
frmsetting_BLL.Insert_Frmsetting_BaseInfo(caoZuoZhe, jianCeDiDian, caiJiShiJian);
}
}
BLL层:
public void Insert_Frmsetting_BaseInfo(string caoZuoZhe, string jianCeDiDian, string caiJiShiJian)
{
Frmsetting_DAL.InsertFrmSetting_BaseInfo_INFO(caoZuoZhe, jianCeDiDian, caiJiShiJian);
}
DAL层:
#region "插入BaseInfo信息"
/// <summary>
///插入BaseInfo表数据
/// </summary>
/// <param name="caoZuoZhe">Operatorer</param>
/// <param name="caoZuoZhe">Address</param>
/// <param name="caoZuoZhe">CollectionTime</param>
public static void InsertFrmSetting_BaseInfo_INFO(string caoZuoZhe, string jianCeDiDian, string caiJiShiJian)
{
string sqlCommand = "InsertFrmSettingBaseInfo";
SqlParameter[] param ={
new SqlParameter("@caoZuoZhe",SqlDbType.VarChar,50),
new SqlParameter("@jianCeDiDian",SqlDbType.VarChar,50),
new SqlParameter("@caiJiShiJian",SqlDbType.VarChar,50)
};
param[0].Value = caoZuoZhe;
param[1].Value = jianCeDiDian;
param[2].Value = caiJiShiJian;
SqlHelper.ExecuteNonQuery(GHGD.Conn.Conn.SqlConn, CommandType.StoredProcedure, sqlCommand, param);
}
#endregion
以上代码就是c# 三层架构的简单代码。
。。。。。。。。。。。。。。。。。。割了
-------------------------------------下面是对ComboBox 下拉框控件的操作:
对下拉框的操作有两种方式:
一种是在其通过手动方式添加ComboBox 下拉项;另一种是通过字典表中数据之后通过限制条件添加ComboBox 下拉项中。
我记录的是通过字典表加入添加ComboBox 下拉项数据:上代码
数据库数据:

窗体加载事件:
// tabpage2
// 温度
string tabpage2_str = "温度";
DataSet tabpage2_dsComboBox = dic_Bll.GetDic(tabpage2_str);
DataTable dt = new DataTable();
dt = tabpage2_dsComboBox.Tables[0];
comboBox6_wendu.DataSource = dt;
comboBox6_wendu.DisplayMember = "DICName";
comboBox6_wendu.ValueMember = "ID";
// 湿度
string tabpage2_str2 = "湿度";
DataSet tabpage2_dsComboBox2 = dic_Bll.GetDic(tabpage2_str2);
DataTable dt2 = new DataTable();
dt2 = tabpage2_dsComboBox2.Tables[0];
comboBox7_shidu.DataSource = dt2;
comboBox7_shidu.DisplayMember = "DICName";
comboBox7_shidu.ValueMember = "ID";
以上代码是将字典表数据加载到ComboBox下拉框中:
下面代码是保存ComboBox数据到数据库中:
UI:
private void button4_YingJian_ok_Click(object sender, EventArgs e)
{
int wendu = comboBox6_wendu.SelectedIndex;
int shidu = comboBox7_shidu.SelectedIndex;
// tabpage2 数据
frmsetting_BLL.Insert_Frmsetting_SensorInfo(wendu, shidu);
}
BLL:
public void Insert_Frmsetting_SensorInfo(int wendu, int shidu)
{
Frmsetting_DAL.Insert_Frmsetting_SensorInfo(wendu, shidu);
}
DAL:
#region "插入Sensor表信息"
/// <summary>
///插入Sensor表信息
/// </summary>
/// <param name=""></param>
/// <param name=""></param>
public static void Insert_Frmsetting_SensorInfo(int wendu, int shidu)
{
string sqlCommand = "Insert_Frmsetting_SensorInfo";
SqlParameter[] param ={
new SqlParameter("@wendu",SqlDbType.Int),
new SqlParameter("@shidu",SqlDbType.Int)
};
param[0].Value = wendu;
param[1].Value = shidu;
SqlHelper.ExecuteNonQuery(GHGD.Conn.Conn.SqlConn, CommandType.StoredProcedure, sqlCommand, param);
}
#endregion
..................。。。。。。。。。。。。。。。。割了
以上是对几个简单的控件的使用。
C# 学习笔记 三层架构系列(控件一)的更多相关文章
- Duilib学习笔记《03》— 控件使用
在前面已经对duilib有个一个基本的了解,并且创建了简单的空白窗体.这仅仅只是一个开始,如何去创建一个绚丽多彩的界面呢?这就需要一些控件元素(按钮.文本框.列表框等等)来完善. 一. Duilib控 ...
- 第六周学习笔记,vc各类控件的输入输出
6w学习笔记 vc控件的输入输出 单选按钮 当单击 RadioButton 控件时,其 Checked 属性设置为 true,并且调用 Click 事件处理程序.当 Checked 属性的值更改时,将 ...
- c#学习笔记之使用 TableLayoutPanel 控件设置窗体布局
使用 TableLayoutPanel 控件设置窗体布局 在 Visual Studio IDE 左侧,找到“工具箱”选项卡. 选择“工具箱”选项卡,随即将显示工具箱.(或者,在菜单栏上,依次选择“视 ...
- ODAC(V9.5.15) 学习笔记(二)控件列表
ODAC的控件有26个,简单介绍如下: TOraSession 管理Oracle的连接 TOraQuery 使用SQL进行数据获取,自动将更新提交数据库 TSmartQuery 在处理字 ...
- IOS开发学习笔记019-动态创建控件
动态创建控件 一.按钮 二.文本输入框 三.lable标签 注意: 只是简单的拖拽控件会毁了你,所以最好还是手动通过代码创建控件. 如果要通过代码生成按钮的话,可以在系统自带的函数viewDidLoa ...
- Java学习笔记——三层架构
Layer: UI层: user interface 用户接口层 Biz层: service business login layer 业务逻辑层 DAO层: Date Access Obje ...
- 学习笔记13_第三方js控件&EasyUI使用
第三方UI包使用思路: 1.先映入各种JS包,包含JS版本包,第三方CSS包,第三方主JS包,第三方语言包. 2.确定要做什么,是对话框还是表格.3.根据Demo和目的,在<body>内, ...
- Android Studio 学习笔记(三):简单控件及实例
控件.组件.插件概念区分 说到控件,就不得不区分一些概念. 控件(Control):编程中用到的部件 组件(Component):软件的组成部分 插件(plugin): 应用程序中已经预留接口的组件 ...
- <WP8开发学习笔记>修改panorama全景控件的标题的大小
panorama(全景)控件非常具有WinPhone特色,但是那个巨大的标题许多时候会让人觉得违和.怎么修改它呢? 最开始想到的是加一个FontSize,结果毫无影响.╮(╯-╰)╭ <phon ...
随机推荐
- CAD使用GetxDataLong读数据(网页版)
主要用到函数说明: MxDrawEntity::GetxDataLong2 读取一个Long扩展数据,详细说明如下: 参数 说明 [in] LONG lItem 该值所在位置 [out, retval ...
- 05JavaScript中的事件处理
JavaScript中的事件处理 在JavaScript中,事件的发生主要是由窗口中内容变化.键盘和鼠标引起的.JavaScript在某些事件发生的时候,可以通过一些相应的事件处理器来捕获这些事件,并 ...
- jquery onclick 问题
var str = ''; for(var i = 0;i<data.list.length;i++){ str += "<tr><td>" + (i ...
- 剑指offer---以O(1)时间删除链表节点
问题:删除链表节点 要求:以O(1)时间 对于删除指定索引的链表元素大家都很熟悉,思路一般是从头遍历链表直到指定索引位置删除元素,然后维护一下指针即可,时间复杂度O(n).代码如下: // 删除pos ...
- CCF201609-2 火车购票 java(100分)
试题编号: 201609-2 试题名称: 火车购票 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 请实现一个铁路购票系统的简单座位分配算法,来处理一节车厢的座位分配. 假设一 ...
- 洛谷 4216 BZOJ 4448 [SCOI2015]情报传递
[题解] 每个情报员的危险值val[i]应该是一个分段函数,前面一段是平行于x轴的横线,后面一段是一次函数.我们可以用fx(t)=t-b[x]表示这个一次函数.每次询问一条链上fx(t)大于c的点的个 ...
- saltstack(二) master、minion常用配置选项
master常用配置选项: interface: 指定bind的地址(默认0.) publish_port:指定发布端口(默认4505) ret_port: 指定结果返回端口,与minion配置文件的 ...
- getContextPath和getRealPath的区别-----其实主要区别就是相对路径和绝对路径
getContextPath和getRealPath的区别 其实主要区别就是相对路径和绝对路径 https://blog.csdn.net/zsmj_2011/article/details/4121 ...
- gif & tools
gif & tools https://www.cockos.com/licecap/ https://www.cockos.com/licecap/licecap128-install.ex ...
- HDU 1540 区间合并线段树
题目大意: 就是给定一堆位置,进行删除还原,最后找到 t 位置上的最大连续位置 #include <cstdio> #include <cstring> #include &l ...