C#Winfrom笔记

/ 0评 / 0

类与对象

定义类

定义一个类型,比如车辆,他的框架都是一个类型的,但是换一个颜色就是不同的车,在这里就好比定义一个类型框架方便其他程序调用

创建类方法:右键项目 -  添加 - 类

创建完类后需要自定义一些需要的类型

访问修饰符 类型 自定义名称;

演示: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...catch
try...catch...finally
try...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
    {
        //连接字符串对象创建
        private static string sqlStr = @"Data Source=localhost;Initial Catalog=sclDataBase;Integrated Security=True";
        public static SqlConnection conn = null;

        //数据库缓存数据
        public static DataSet dataSet = new DataSet();

        //数据库连接判断
        private static void sqlconn()
        {
            conn = new SqlConnection(sqlStr);
            if (conn.State == ConnectionState.Closed)
            {
                conn = new SqlConnection(sqlStr);
                conn.Open();
            }
            if (conn.State == ConnectionState.Broken)
            {
                conn.Close();
                conn.Open();
            }
        }

        //单向操作
        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();
            DataTable table = new DataTable();
            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窗体属性

布局

 

外观

 

窗口样式

 

其他

 

MessageBox

MessageBox.Show(字符串内容, 标题, 类型, 图标);

第一个参数为string类型,消息框里的内容;

第二个参数为string类型,消息框的标题内容;

第三个参数为MessageBoxButtons.XXX,消息框的类型;

第四个参数为MessageBoxIcon.XXX,消息框的图标。

 

返回值

他的类型对应的按钮都有对应的返回值,用于判断用户到底点击了什么

  1. 确定
  2. 取消
  3. 终止
  4. 重试
  5. 忽略

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

int a = (int)MessageBox.Show("确定吗?", "确定吗?", MessageBoxButtons.OKCancel);
if (a == 1)
{
    MessageBox.Show("你点击了确定 ");
}
else if (a == 2)
{
    MessageBox.Show("你点击了取消");
}

 

TextBox属性

 

下拉框属性

添加内容

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

常用属性:

 

使用步骤:

  1. 编辑列
  2. 添加
  3. 名称为英文,需要在代码中调用
  4. 页眉文本为软件内显示,可以为中文
  5. 修改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);

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注