类与对象
定义类
定义一个类型,比如车辆,他的框架都是一个类型的,但是换一个颜色就是不同的车,在这里就好比定义一个类型框架方便其他程序调用 创建类方法:右键项目 - 添加 - 类 创建完类后需要自定义一些需要的类型 访问修饰符 类型 自定义名称;
演示:public int a;
访问修饰符可以忽略,如果忽略默认public公开类型 代码演示:
//自定义空间名
namespace CSGO
{
//定义武器类
class GUN
{
//定义类,public公开参数
public int serialNumber;
public string name;
public int price;
public int surplus;
}
实例化对象
创建了类,那么现在去主函数去调用这个类,这就叫做创建对象 在主函数创建对象,使用到new 类名 变量名 = new 类名();
基于上方代码,我的类名是GUN,因此我实例化一个对象为 ```
//基于种类定义出新的对象(实例化)
GUN awp = new GUN();
现在我创建了一个叫做awp的对象,awp这个变量他调用了类里面设置的一些属性,那么现在我们来调用这些属性给这个变量赋值 使用英文的 . 即可让变量调用类的属性进行赋值
//定义新对象AWP
awp.serialNumber = 1;
awp.name = AWP;
awp.price = 4750;
awp.surplus = 5;
AWP的赋值完成,那么我们基于这个类继续创建新的对象,对象名为ak47 使用类名 变量名 = new 类名();
来创建一个新的对象,并用 . 作为属性连接符来给变量赋值
//new开辟新的内存
GUN ak47 = new GUN();
//定义新对象AK47
ak47.serialNumber = 2;
ak47.name = AK-47;
ak47.price = 2800;
ak47.surplus = 10;
实例化对象后就可以用对象去调用类的属性并且赋值 ## namespace命名空间
在实际开发中一个完善的程序会存在数不清的类,但是总不能把全部类都写在一个空间里面吧? 空间的作用也就是更方便的管理类,可以理解为图书馆,不同种类的书会分开放置,每一块区域都是某一类型的书,这就是空间的作用 命名空间分为两种:系统命名 / 自定义命名 新建命名空间方法:新建类 - 更改namespace的名称 新建一个名为wdnmd的命名空间和baigei的命名空间,并建立一模一样的类awp
namespace wdnmd
{
class awp
{
}
}
namespace baigei
{
class awp
{
}
}
回到主函数,加入我要调用这两个空间的awp类,但是他们两个表都是一模一样的属性,如何区分呢? 区分方法很简单,可以用 导入命名空间 / 完全限定名 来解决
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
//导入命名空间wdnmd
using wdnmd;
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
//实例化wdnmd命名空间的awp对象
awp qz = new awp();
//使用完全限定名来实例化baigei命名空间的awp对象
baigei.awp mz = new baigei.awp();
}
}
}
导入命名空间:需要在主函数的命名空间外调用一下命名空间,using 命名空间名;
然后就可以在代码中直接使用类名进行实例化; 完全限定名:直接指定命名空间,用英文 . 进行连接指定,然后实例化指定对象 # ADO.NET
步骤概述
- 创建 存储数据库连接信息 字符串 - string
- 创建连接对象 - Connection
- Open连接数据库
- State检查连接状态
- 创建 SQL语句存储 字符串 - string
- 创建 语句执行对象 - Command/DataReader
- 返回结果
- Close关闭数据库连接
Connection连接数据库
新建字符串存储连接信息
首先需要定义一个字符串用来存储数据库的连接信息 Windows: string 变量名 = server = 服务器名; database = 数据库名; Integrated Security = true;;
Sqlserver: string 变量名 = server = 服务器名; database = 数据库名; uid = 用户名; pwd = 密码;;
这里我用windows本地连接的方法,我的数据库名为NUTSSSS\LOVEXHJ
string sqlserver = server = NUTSSSS\\LOVEXHJ; database = lovexhj; Integrated Security = true;;
注意,如果实例是默认名字即可用英文符号 .
或者 (local)
又或者 localhost
进行连接 如果是自定义名称,那么就需要用 IP\实例名
或 本机名\实例名
> 创建连接对象
先导入命名空间 System.Data.SqlClient
using System.Data.SqlClient;
然后创建连接对象 SqlConnection 自定义对象名 = new SqlConnection(连接信息字符串名); 有点类似于实例化,但是需要在后面括号填上刚刚定义的字符串连接信息
SqlConnection wdnmd = new SqlConnection(sqlserver);
Open:连接数据库
对象名.Open();
wdnmd.Open();
State:检测状态是否连接
State用于检测定义的数据库对象是否已经成功连接到了数据库 对象名.State == ConnectionState.Open
这里需要调用到 System.Data
的命名空间
using System.Data;
然后用if语句判断是否连接成功
if (wdnmd.State == ConnectionState.Open)
{
Console.WriteLine(yes);
}
else
{
Console.WriteLine(no);
}
Close关闭数据库连接
别忘了打完电话还要关闭哦~ 程序最后记得关闭数据库连接来保证安全性 连接对象名.Close();
//关闭数据库连接
wdnmd.Close();
Command操作数据库
SqlCommand适用于增删改这三个操作,并且不需要执行Close关闭对象操作> 新建字符串存储需要执行的SQL语句
需要先创建一个字符串类型的变量用来存储要在数据库进行操作的SQL语句 string 自定义变量名 = SQL语句;
string sql = insert Product values(14, 'test', 50, 'c004');
这里我创建了一个名为sql的变量用来存储要执行的sql语句 > 使用SqlCommand语句创建命令对象
这里需要创建一个命令对象,使用SqlCommand语句来创建; SqlCommand 自定义变量名 = new SqlCommand(SQL语句变量, SqlConnection定义的对象名);
括号内的两个值分别是上面刚刚创建的SQL执行语句的变量sql与一开始使用SqlConnection创建的数据库连接变量
SqlCommand cmd = new SqlCommand(sql, wdnmd);
这里我创建了一个名为cmd的变量用来指定数据库并执行sql语句的操作 > ExecuteNonQuery():执行语句
我上方建立了一个cmd的变量用来指定数据库并执行sql语句,所以在这里需要使用cmd这个变量进行操作 执行语句的变量名.ExecuteNonQuery();
cmd.ExecuteNonQuery()
当ExecuteNonQuery执行成功的时候会返回成功执行了多少个语句并作为数值,如果成功数值最小也会等于1,如果不成功即返回0, 那么想要判断它是否成功,可以用一个if语句来判断结果
if (cmd.ExecuteNonQuery() > 0)
{
Console.WriteLine(语句执行成功!);
}
或者,也可以直接输出它返回的值
Console.WriteLine(cmd.ExecuteNonQuery());
注意!无论什么情况下,哪怕是写在console.writeline输出语句里面,他也会运行自己的语句操作比如下方这么写,就会出现执行两次同样的语句情况
//语句在if里面执行后,同样又在cw输出语句执行!
if (cmd.ExecuteNonQuery() == 1)
{
Console.WriteLine(语句执行成功!返回值为{0}, cmd.ExecuteNonQuery());
}
DataReader:查询语句并返回DataReader值
DataReader适用于查询操作,并且执行完毕需要Close关闭操作。> select查询语句使用方法
查询语句,当然要是用select,我们先把前面的sql语句变量修改为一个查询语句
string sql = select * from Product where Price >= 200 and Price <= 1000;
然后创建一个名为read的变量作为数据读取变量,来接收cmd命令对象的返回值 SqlDataReader 数据读取对象名 = 命令对象.ExecuteReader();
SqlDataReader read = cmd.ExecuteReader();
接着使用read来读取返回值,read会返回true或false的一个值,表示查询成功与否 数据读取对象名.Read()
read.Read()
因为Read是逐行查询,每查询到一行符合要求时,就会返回true,那么如果我们想把结果可视化,那么可以用到while循环来查询 因为while的bool判断条件为true就会继续循环,如果为false才会终止循环 while (数据读取对象名.Read()) { ... }
while (read.Read())
{
...
}
现在每查询一次如果查到了结果就会返回true,但是我们需要把查询到的信息可视化,所以现在需要用到读取每一列的数据,使用中括号读取 数据读取对象名[表的列名].ToString()
read取回来的数值是根据列来返回,所以中括号内填上列名即可;
while (read.Read())
{
Console.Write(read[pno]) + \t);
Console.Write(read[pname] + \t);
Console.WriteLine(read[price] + \t);
}
如果我们需要把返回的数据赋值给其他字符串 string 自定义字符串名 = read[列名];
因为返回的数据是Object对象格式,因此我们需要转换成String字符串格式来输出,所以就在中括号的后面加上ToSting() string 自定义字符串名 = read[列名].ToString();
//将这次查询到的列数据存储到test字符串内
string test = read[pno].ToString();
ExcuteScalar:查询聚合函数
因为聚合函数他返回的往往只有一个值,所以在执行命令对象的时候提供了一个参数为ExcuteScalar 命令执行对象名.ExecuteScalar();
ExcuteScalar返回的参数为Object类型,所以往往需要将它转换到字符串即可
//创建 命令存储字符串
string cmd3 = select count(*) from Product;
//创建 命令执行对象
SqlCommand cmdStart3 = new SqlCommand(cmd3, wdnmd);
//执行 聚合函数查询命令 并赋值到字符串
string result = cmdStart3.ExecuteScalar().ToString();
//输出字符串
Console.WriteLine(一共查询到{0}句符合要求!, result);
字符串处理方法
Trim():删除字符串前后空格
Trim()用于删除一串字符串中前面和后面存在的空格,删除原理是从外到内删除全部空格直到找到第一个字符串为止 字符串变量.Trim()
string test = Wdnmd ;
//Trim删除前后全部空格
Console.WriteLine(test.Trim());
//输出结果为:Wdnmd
IndexOf():索引查询
查找指定的字符串首次出现的位置,并返回int类型数值
string test2 = 致命空枪!打腿没死!哎又空抢!哎又没打到人!;
//从左至右查询“哎”首次出现的位置
Console.WriteLine(test2.IndexOf(哎));
//从左至右查询“哎又没”首次出现的位置
Console.WriteLine(test2.IndexOf(哎又没));
//从第10位开始向后查10位“打”出现的位置
Console.WriteLine(test2.IndexOf(打, 10, 10));
查询的位置是从0开始依次向后排列,如果没有查询到数据则会返回-1 从前面开始查询:indexof(需要查找的字符串);
从后面开始查询:lastindexof(需要查找的字符串);
> SubString(n , n);:截取字符串
截取指定长度的字符串 SubString(起始长度 , 结束长度);
//截取test 0 - 10的所有字符串
string test2 = test.SubString(0 , 10);
split();:分隔字符串
把字符串以\里的内容为分隔点,划分成几个区域并且作为数组存储 split(分隔点内容);
//将@作为分隔点,然后复制给数组,并提取数组第一部分
string test = test@qq.com;
string[] test2 = test.Sqlit(@);
Console.WriteLine(用户名为:{0}, test2[0]);
分隔部分会按照位置依次存入数组,这样就可以通过数组来提取对应的字符串 > String.Format();:替换字符串内容
将字符串里面的指定项替换成指定的变量值 例如我们在之前使用新建一个字符串来存储我们需要运行的SQL命令,使用String.Fromat可以将一串字符串的指定位置替换成我们需要的数据
//正常的存储SQL语句变量
string sql = insert Product values(14, 'test', 50, 'c004');
//使用String.Fromat进行更改内容的变量
string sql = string.Format(insert Product values({0}, '{1}', {2}, '{3}'), 对应变量1, 对应变量2, 对应变量3, 对应变量4);
String.Format可以很好的方便我们在C#程序中根据程序要求去修改相对应的SQL语句内容 # Static静态字段
静态类似于我们的饮水机,当每个人口渴了可以自己直接去打水喝就行,而不需要跑去超市买水喝 将常用的方法做静态处理,则可让程序更轻量级的运行,减少代码的重复使用 Static静态内容不需要实例化对象即可调用 # 异常处理
在程序出现错误的时候防止程序因为崩溃而停止运行 try...catchtry...catch...finallytry...finally
try:包含住可能出现异常的代码 catch:try发现异常时执行 finally:无论是否异常都会执行 > try...catch
如果出现异常则来到catch块
try{
//可能出现异常的代码
}
catch (Exception 自定义变量名){
//出现异常后执行的代码
}
try...catch...finally
无论是否发生异常都会执行finally块
try{
//可能出现异常的代码
}
catch (Exception 自定义变量名){
//出现异常后执行的代码
}
finally{
//释放资源代码
}
try...finally
无论是否发生异常都会执行这个块
try{
//可能出现异常的代码
}
finally{
//释放资源代码
}
Exception属性
Message:异常的原因,辅助性说明,不会太详细 Source:包含异常的程序集名称 # DBHelper类
DBHelper类
可以理解为把数据库的操作类,DBHelper只是这样的一个叫法 因为要使用数据库的程序往往会用到大量的数据库操作代码,如果不写入类进行调用,那么就会多出大量的重复代码
class DBHelper
{
//IP与数据库名
private static string IP = "localhost";
private static string dataName = "login";
//连接字符串对象创建
private static string sqlStr = string.Format
("Data Source={0};Initial Catalog={1};Integrated Security=True", IP, dataName);
public static SqlConnection conn = null;
//数据库缓存数据
public static DataSet dataSet = new DataSet();
//数据库连接判断
private static void sqlconn()
{
try
{
conn = new SqlConnection(sqlStr);
if (conn.State == ConnectionState.Closed)
{
conn = new SqlConnection(sqlStr);
conn.Open();
}
if (conn.State == ConnectionState.Broken)
{
conn.Close();
conn.Open();
}
}
catch (Exception Error)
{
System.Windows.Forms.MessageBox.Show("服务器连接失败,请联系管理员!\n报错:" + Error,
"严重错误", System.Windows.Forms.MessageBoxButtons.OK, System.Windows.Forms.MessageBoxIcon.Error);
Environment.Exit(0);
}
}
//检查数据库是否连接
public static void connectServer()
{
sqlconn();
}
//单向操作
public static bool ExcuteNonQuery(string sql)
{
sqlconn();
SqlCommand cmd = new SqlCommand(sql, conn);
int result = cmd.ExecuteNonQuery();
conn.Close();
return result > 0;
}
//dataTable表获取
public static DataTable getDataTable(string sql)
{
sqlconn();
DataTable table = new DataTable();
SqlDataAdapter sda = new SqlDataAdapter(sql, conn);
sda.Fill(table);
conn.Close();
conn.Dispose();
return table;
}
//存入缓存
public static void getDataSet(string sql)
{
sqlconn();
SqlDataAdapter sda = new SqlDataAdapter(sql, conn);
sda.Fill(dataSet);
conn.Close();
conn.Dispose();
}
//datareader查询
public static SqlDataReader GetDataReader(string sql)
{
sqlconn();
SqlCommand cmd = new SqlCommand(sql, conn);
return cmd.ExecuteReader(CommandBehavior.CloseConnection);
}
//执行聚合函数
public static object ExcuteScalar(string sql)
{
sqlconn();
SqlCommand cmd = new SqlCommand(sql, conn);
object result = cmd.ExecuteScalar();
conn.Close();
return result;
}
}
Form窗体属性
布局
- Size:控件大小
- AutoScroll:超出是否显示滚动条
- MaximumSize:窗体最大大小
- MinimumSize:窗体最小大小
- StartPosition:窗体打开位置,CenterScreen以屏幕居中,CenterParent以父级居中
- WindowState:窗体初始化可见状态,Normal 默认,Minimized 最小化 ,Maximized 最大化
外观
- BackColor:背景色
- BackgroundImage:背景图 可覆盖背景色
- BackgroundImageLayout:背景图排列方式
- Cursor :光标显示形状
- Font:字体
- ForeColor:前景色,字体的颜色
- Text:与控件关联的文本
- FormBorderStyle:边框样式 None 无边框、无法移动 ,FixedSingle 固定的、大小不能变
窗口样式
- ControlBox:有无 关闭、最大化、最小化按钮
- MaximizeBox:有无最大化按钮
- MinimizeBox:有无最小化按钮
- Icon:窗体图标
- Opacity:透明度 0%全透
- ShowIcon:显示图标
- ShowInTaskBar:窗体是否出现在任务栏中
- TopMost:层级 是否置顶
- TransparencyKey:让某种颜色透明
其他
- AcceptButton:Enter键触发指定按钮
- CancelButton:Esc键触发指定按钮
MessageBox
MessageBox.Show(字符串内容, 标题, 类型, 图标);
第一个参数为string类型,消息框里的内容; 第二个参数为string类型,消息框的标题内容; 第三个参数为MessageBoxButtons.XXX,消息框的类型; 第四个参数为MessageBoxIcon.XXX,消息框的图标。 > 返回值
他的类型对应的按钮都有对应的返回值,用于判断用户到底点击了什么 - OK:确定,返回值1
- OKCancel:确定/取消,返回值1/2
- AbortRetryIgnore:终止/重试/忽略,返回值3/4/5
- YesNoCancel:是/否/取消,返回值6/7/2
- YesNo:是否,返回值6/7
- RetryCancel:重试/取消,返回值4/2
- 确定
- 取消
- 终止
- 重试
- 忽略
- 是
- 否
信息框点击确定,提示点击了确定,点击取消则提示点击了取消
int a = (int)MessageBox.Show(确定吗?, 确定吗?, MessageBoxButtons.OKCancel);
if (a == 1)
{
MessageBox.Show(你点击了确定 );
}
else if (a == 2)
{
MessageBox.Show(你点击了取消);
}
TextBox属性
- ReadOnly:文本框只读
- UseSystemPasswordChar:使用*字符代替文本可见内容,理解为密码输入
- PasswordChar:设置密码文本框字符,任意字符
- MultiLine:文本多行
下拉框属性
添加内容
Items手动添加; 下拉框.Items.Add(内容);
> 不允许修改内容
DropDownStyle: Simple:只能通过键盘上下切换选项 DropDown:允许修改 DropDownlist:不允许修改 # Panel容器空间
主要用于分隔每个单选或多选区域的不重复性 # 多窗体应用
创建多窗体
新建Form窗口 - 设置父窗体的IsMdiContainer属性为true - 父窗体加载事件写上代码
//实例化窗口
Form2 box2 = new Form2();
//显示窗口
box2.Show();
//定义窗口为当前窗口的子窗口
box2.MdiParent = this;
排列子窗体
this.LayoutMdi(MdiLayout.排列方式);
ArrangeIcons:图标顺序 Cascade:层叠 TileHorizontal:垂直 TileVertical:水平
//水平排列
this.LayoutMdi(MdiLayout.TileVertical);
//垂直排列
this.LayoutMdi(MdiLayout.TileHorizontal);
将窗口添加至菜单显示
父窗口的MdiWindowListItem改为菜单名即可 # Timer属性
start启动计时;stop停止计时 # 获取时间
string timeNow = DateTime.Now.ToString(yyyy年MM月dd日HH:mm:ss);
ImageList
它是数组类型,每一张图片对应数组的一个位置,数组默认0开始 imageList1.Images[0] 对应 照片集的第一张图片,以此类推 # 数据显示
- 新建数据集
- 连接数据库
- 实例化SqlDataAdapter对象
- SqlDataAdapter对象fill覆盖到数据集
- 关闭数据库连接
- DataTable调用数据集数据
- 使用DataTable来显示需要数据
DataSet数据集
新建一个数据集,类似于缓存,用于存储查询到的数据库数据
//实例化数据集对象
DataSet 数据集命名 = new DataSet();
SqlDataAdapter
SqlDataAdapter用于查询数据后保存返回的全部结果 然后把所有结果填充到数据集来存储,最后关闭数据库连接
//查询数据保存到SqlDataAdapter对象
SqlDataAdapter 自定义SqlDataAdapter名 = new SqlDataAdapter(sql语句, 数据库连接对象);
//覆盖数据到缓存
自定义SqlDataAdapter名.Fill(数据集名);
//关闭数据库连接
数据库连接对象.Close();
//释放缓存
数据库连接对象.Dispose();
DataTable
DataTable用来取出指定的数据集内容
//实例化缓存存储对象
DataTable 自定义DataTable名 = 数据集名.Tables[0];
数据集名.Tables[0],0的意思是指数据集的第1张表内容,数据集中的表是按照数组来存储的,所以0指的就是第一张表 如果有多张表则修改数组即可,一张表就写入0 调用数据:textBox1.Text = Convert.ToString(自定义DataTable名.Rows[数组][表单中的列名]);
//取user这个DataTable里第1行的name数据
textBox1.Text = Convert.ToString(user.Rows[0][name]);
DataGridView
常用属性: - Dock:停靠,fill为全部填充
- AutoSizeColumnsMode:fill填充,自适应宽度
- RowHeadersVisible:false,不显示前面行标题
-
SelectionMode:FullRowSelect,点击每一个单元都会变成选中这一行
使用步骤: 1. 编辑列
- 添加
- 名称为英文,需要在代码中调用
- 页眉文本为软件内显示,可以为中文
- 修改DatapropertyName为数据库里的对应表名
//关闭自动生成列功能
dataGridView1.AutoGenerateColumns = false;
//dataGridView获取查询到的结果并显示
dataGridView1.DataSource = dataSet.Tables[0];
DataGridView获取数据
- 获取指定单元格的数据
Rows[0]:第一行 Cells[0]:第一个数据 Value:转换为值
dataGridView1.Rows[0].Cells[0].Value;
- 获取选中的总行数
dataGridView1.SelectedRows.Count;
- 获取选中当前行索引
按照数组的排序规则获取索引
dataGridView1.CurrentRow.Index;
- 获得当前选中单元格的值
dataGridView1.CurrentCell.Value;
- 获取选中行的某个数据
dataGridView1.Rows[a].Cells[索引].Value;
DataView
用于筛选表内容与排序 > 筛选
//存储搜索内容
string text = toolStripTextBox1.Text;
//创建DataView存储数据集内容
DataView dv = dataSet.Tables[0].DefaultView;
//RowFilter执行sql语句并排列存储
dv.RowFilter = string.Format(name like '%{0}%', text);
//显示dv的排序结果
dataGridView1.DataSource = dv;
排序
//创建DataView存储数据集内容
DataView dv = dataSet.Tables[0].DefaultView;
//Sort执行sql排序语句并排列存储
dv.Sort = string.Format(phone DESC);
//显示dv的排序结果
dataGridView1.DataSource = dv;
TreeView
- 新建根节点
TreeNode 根节点变量名 = new TreeNode(根节点名称);
控件名.Nodes.Add(根节点变量名);
TreeNode root = new TreeNode(图书级别);
treeView1.Nodes.Add(root);
- 添加子节点
TreeNode 子节点变量名 = new TreeNode(子节点名称);
根节点变量名.Nodes.Add(子节点变量名);
TreeNode name = new TreeNode(子节点内容);
root.Nodes.Add(name);
- 删除数据 && 默认展开
控件名.Nodes.Remove(节点名);
//展开数据
treeView1.ExpandAll();
//删除数据
treeView1.Nodes.Remove(root);
ListView
控件 - 编辑列 - 设置好对应名字 - 新增数据
ListViewItem 变量名 = new ListViewItem(首列内容);
变量名.SubItems.Add(第二列内容);
变量名.SubItems.Add(第三列内容); ... ...
控件名.Items.Add(变量名);
ListViewItem item = new ListViewItem(苹果);
item.SubItems.Add(5¥);
item.SubItems.Add(水果);
listView1.Items.Add(item);
本文地址: C#Winfrom笔记