类与对象

定义类

定义一个类型,比如车辆,他的框架都是一个类型的,但是换一个颜色就是不同的车,在这里就好比定义一个类型框架方便其他程序调用 创建类方法:右键项目 - 添加 - 类 创建完类后需要自定义一些需要的类型 访问修饰符 类型 自定义名称;演示: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

步骤概述

  1. 创建 存储数据库连接信息 字符串 - string
  2. 创建连接对象 - Connection
  3. Open连接数据库
  4. State检查连接状态
  5. 创建 SQL语句存储 字符串 - string
  6. 创建 语句执行对象 - Command/DataReader
  7. 返回结果
  8. 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...finallytry:包含住可能出现异常的代码 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
  1. 确定
  2. 取消
  3. 终止
  4. 重试
  5. 忽略

信息框点击确定,提示点击了确定,点击取消则提示点击了取消

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] 对应 照片集的第一张图片,以此类推 # 数据显示

  1. 新建数据集
  2. 连接数据库
  3. 实例化SqlDataAdapter对象
  4. SqlDataAdapter对象fill覆盖到数据集
  5. 关闭数据库连接
  6. DataTable调用数据集数据
  7. 使用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. 编辑列

    1. 添加
    2. 名称为英文,需要在代码中调用
    3. 页眉文本为软件内显示,可以为中文
    4. 修改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);
说点什么
支持Markdown语法
好耶,沙发还空着ヾ(≧▽≦*)o
Loading...