C#基础笔记

ONE:
vs20vs2013快捷键小节:
1>:
#region
#endregion(用来折叠冗余代码)
2>:Ctril+K+D快速对其代码;
3>:Ctril+K+C注释选中代码
      Ctril+K+U取消选中注释
 
4>: F1 转到帮助文档
 
 
 
转移字符:
1:退格键
2:\表示这个字符;
3:
4: 用于向Windows桌面写入一个文本什么时,用于回车键,只有 不行(但是                          Mac系统认识);
5:
6:@符号作用:1>取消下字符串中转义的作用,使其单纯的表示一个;2>将字符串
保留小数点后的有效数字时:用占位符,例如:
double a=10;
int b=3;
double c=a/b;
Console.WriteLine("{0:0.00}",d);    //保留两位小数;
Console.ReadKey();
 
一元运算符的优先级高于二元运算符!像++或者--就属于一元运算符,而+、-、*、/、%这些属于二元运算符。
举例:
int a=5;
int b=a++ + ++a*2+ --a + a++;
输出a=7;b=31;
 
 
在运行框中输入mspaint后,会打开画板;
在运行框中输入notepad后,会打开记事本;
在运行框中输入write后,会打开写字板;
Reverse()方法和Sort()方法都是静态方法,在调用的时候要通过类名来调用!!!即Array这个类。像:Array.Reverse(str)、Array.Sort(number)等。其中str是字符串数组名,number是整型数组名。
TWO:
程序的调试:
1:F11,逐步棸,可能要按Fn键
2:F10,逐过程
3:设置断点:  断点之前的程序已经确保正确,可是在断点后的部分可能出现错误,所以设置完断点后,直接点击启动,然后按F11逐步棸的执行,查看,当然,之中可以设置监视的变量、逻辑表达式等!!!
 
 
比较Concert.ToInt()和int.Parse()和int.TryParse():
Convert.ToInt32("123");
int.Parse("123");
bool  b  =   int.TryParse("123",out number);
其实Convert.ToInt32()在工作的时候调用的就是int.Parse()这个方法,所以int.Parse()这个方法的执行效率就高一点。而,int.TryParse()这个方法在运行的时候返回值是一个bool类型,如果返回值为true,就把“123”的值赋给number(就是123),否则就把number的值赋为0;也就是说用int.TryParse()这个方法无论转换是否成功,都不会抛异常!!而用Convert.ToInt32()和int.Parse()这两个方法的话,只要转换不成功就抛异常!!!!!!!
 
 
三元表达式:
表达式1?表达式2:表达水3;
表达式1通常是关系表达式;
如果表达式1的结果为true,那么表达式2的值就是整个三元表达式的值;
如果表达式1的结果为false,那么表达式3的值就是整个三元表达式的值;
注意:表达式2的结果类型必须与表达式3的结果类型一致,并且要与整个三元表达式的结果类型一致;
int max=n1>n2?n1:n2;           //比较两个数中,哪个数最大。
 
 
创建随机数:(先创对象,再调用Next方法)
Random    r=   new   Random();
r.Next(1,10);         //创建出1到10之间的随机数(整型)
 
 
 
枚举类型(enum)
一般枚举类型是用来规范某种命名方式的,因此,枚举一般声明在某命名空间的内部,类的外部;
声明枚举的方式:
public   enum 枚举名
{
        值1,
        值2,
        值3,
        .........
}
(最后一个值的后面可以省略逗号)
 
在方法或者类中调用创建该枚举型的变量时,这么写,枚举名   变量名  =枚举名.值n;
 
例如:
public  enum   Season
{
        春,
        夏,
        球,
        冬,        //这里的逗号可以省略
}
 
Season   s  =  Season.春;
 
将枚举类型强转为int类型时,默认情况下枚举元素下标从0开始,具体用法如下:
  public enum Week
    {
        星期一 = 10,
        星期二,
        星期三,
        星期四,
        星期五,
        星期六,
        星期日
    }
 
    class Program
    {
        static void Main(string[] args)
        {
            #region     //将枚举类型强转为int类型(枚举类型的元素值默认从0开始)
            //int n1 = (int)Week.星期一;
            //Console.WriteLine(n1);
            //Console.WriteLine((int)Week.星期二);           
            //Console.WriteLine((int)Week.星期三);
            //Console.WriteLine((int)Week.星期四);
            //Console.WriteLine((int)Week.星期五);
            //Console.WriteLine((int)Week.星期六);
            //Console.WriteLine((int)Week.星期日);                    //将输出10 11 12 13 14 15 16
            //Console.ReadKey();
 
            #endregion
        }
}
 
将int类型强转为枚举类型时,如果转换成功就输出相应的枚举元素,否则输出相应的int值,具体用法如下:
 
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace _15枚举练习
{
    //声明一个枚举类型Week
    public enum Week
    {
        星期一 = 10,
        星期二,
        星期三,
        星期四,
        星期五,
        星期六,
        星期日
    }
 
    class Program
    {
        static void Main(string[] args)
        {
            #region   //int类型强转为枚举类型(如果按元素下标能成功将int类型转换成枚举类型时,就转换成相应的枚举元素的值,如果转                                换失败,就输出相应的int值) 
            //Week week = (Week)3;
            //Console.WriteLine(week);
            //Console.WriteLine((Week)10);
            //Console.WriteLine((Week)100);
            //Console.ReadKey();                //最后输出3   星期一   100
            #endregion
        }
    }
}
 
 
所有的类型都能转换成string类型,包括枚举类型
例如:
            int   n1=10;
            n1.ToString();
            double    n2=3.14;
            n2.ToString();
            decimal        n3=5000m;
            n3.ToString();
            
            Week week=Week.星期一;
            week.ToString();
 
 
 
我们可以将枚举类型与int类型和string类型相互转换。
枚举类型默认和int类型时相互兼容的,所以可以通过强制类型转换的语法互相转换。
当转换一个枚举中没有的值时,不会抛异常,而是将数字直接显示出来。
 
枚举同样可以跟string类型 相互转换,如果将枚举类型转换成string类型,则直接调用ToString();
如果将字符串转换成枚举类型则需要下面一行代码:
(要转换的枚举类型)Enum.Parse(typeof(要转换的枚举类型),"要转换的字符串");
如果转换的字符串是数字,就算枚举中没有,也不会抛异常;
如果转换的字符串是文本,如果枚举中没有,则会抛异常。
 
 
 
 
 
 
 
 
结构:(帮助我们一次性声明多个不同类型的变量) 
[访问修饰符]        struct       结构名
{
    成员;        //字段————起名的时候一般以下划线开头;
}
 
 
静态和非静态的区别 :
1)、在非静态类中,既可以有实例成员,也可以有静态成员。
2)、在调用实例成员的时候,需要使用对象名.实例成员;
    在调用静态成员的时候,需要使用类名.静态成员名;
总结:静态成员必须使用类名去调用,而实例成员使用对象名调用。
   静态函数中,只能访问静态成员,不允许访问实例成员。
      实例函数中,既可以使用静态成员,也可以使用实例成员。
      静态类中只允许有静态成员,不允许出现实例成员。
 
使用:
1)、如果你想要你的类当做一个"工具类"去使用,这个时候可以考虑将类写成静态的。
2)、静态类在整个项目中资源共享。
只有在程序全部结束之后,静态类才会释放资源。
 
 
 
 
 
在运行框中输入mspaint后,会打开画板;
在运行框中输入notepad后,会打开记事本;
在运行框中输入write后,会打开写字板;
 
return的作用:
1:在方法中返回要返回的值。
2:立即结束本次方法。
 
Array.Sort();        //对数组升序排列。
Array.Reverse();    //对数组进行反转,,,因此通过用这两个方法可以对数组实现降序排列。
 
一个完整的方法是包括两部分的,代码和注释!!!!
 
THREE:
 
1:不管是实参还是形参,都在内存中开辟空间。
2:写一个方法,它的功能一定要单一,方法中最忌讳的就是出现提示用户输入的字眼。
3:out参数
如果在一个方法中,返回多个类型相同的值时,可以考虑返回一个数组。
但是,如果返回多个不同类型的值的时候,返回数组就不行了,我们可以考虑使用out参数。
out参数就侧重于在一个方法中返回多个不同类型的值。
4:ref参数(类似于C语言中的指针或者C++中的引用)
能够将一个变量带入一个方法中进行改变,改变完成后,再将改变后的值带出去。
5:params参数(唯独params在实参列表中不需要写,但是out和ref关键字必须要写上
将实参列表中跟可变参数数组类型一致的元素都当作数组的元素去处理。
params可变参数必须是参数列表中的最后一个元素。
6:方法的重载
方法的重载指方法名相同,但是参数不同,跟方法的返回值没有关系。参数不同可能是个数不同,也可能是类型不同。
保留几位小数(两位小数):
 
7: string s=num.ToString("0.00");
num=Convert.ToDouble(s);
这样就把num保留两位小数了。
当然也可以用占位符的形式,也能达到效果!!!
 
 
8:
属性的本质是两个方法,一个叫get(),一个叫set().
在进行设值限定的时候,参数用的是vlaue,在进行取值限定的时候参数用的是字段
属性有可读可写属性,只读属性,只写属性。
Fields字段
Methods方法
Property属性  //Properties
9:
this关键字
1)、代表当前类的对象
2)、在类当中显示的调用本类的构造函数  :this
 
10:命名空间
可以认为类是属于命名空间的。
如果在当前这个项目中没有这个类的命名空间,需要我们手动的导入这个类所在的命名空间。
1、用鼠标去点;
2、alt+Shift+F10;
3、记住命名空间,手动的去引用;
 
11:在一个项目中引用另一个项目的类
1、 添加引用;
2、引用命名空间;
 
12:值类型和引用类型的区别
1、值类型和引用类型在内存上存储的地方不一样;
2、在传递值类型和引用类型的时候,传递方式不一样;(值传递、引用传递)
 
13:学过的值类型和引用类型
值类型:int    double    char    decimal    enum    struct    bool
引用类型:string    数组    自定义类
值类型存储在内存的栈中;
引用类型存储在内存的堆中;
 
14:字符串
1、不可变性
当你给一个字符串重新 赋值后,老值并没有销毁,而是重新开辟一块空间存储新值;
当程序结束后,GC扫描整个内存,如果发现有的空间没有被指向,则销毁改空间;
2、我们可以将字符串看作是char类型的一个只读数组。
ToCharArray();将字符串转换成char数组;
new string (char [] chs);能够将char数组转换成字符串;
 
15:字符串的常用方法
1、Length,获取当前字符串中的字符个数    或者说是数组长度;
2、ToUpper(),将字符串转换成大写形式;(返回值string)
3、ToLower(),将字符串转换成小谢形式;    (返回值string)
4、Equals(s2,  StringComparison.OrdinalIgnoreCase)    比较两个字符串,可以忽略字符串的大小写;(返回值bool)
5、Split(),分割字符串,返回字符串类型的数组;(返回值string[])
6、SubString(),截取字符串,在截取的时候包含要截取的那个位置;    (有两种不同的参数--int     --int-length)(返回值string)
7、IndexOf(),判断哪个字符在某字符串第一次出现的位置,如果没有,返回-1、值类型和引用类型在内存上存储的地方不一样。(返回值int)
8、LastIndexOf(),判断哪个字符在字符串中最后一次出现的位置,如果没有,同样返回-1;(返回值int)
9、StartsWith(),判断以。。。开始;(返回值bool)
10、EndsWith(),判断以。。。结束;(返回值bool)
11、Replace(),将字符串的中的某个字符串替换成新的字符串;(返回值为string)
12、Contains(),判断字符串中是否包含某个字符串;(返回值为bool)
13、Trim(),去掉字符串前后的空格;(返回值String)
14、TrimEnd(),去掉字符串中尾部的空格;(返回值string)
15、TrimStart(),去掉字符串中首部的空格;(返回值string)
16、string.IsNullOrEmpty(),判断一个字符串是否为Null或空;(返回值bool)
17、string.Join(),将数组按照指定的字符串连接,返回一个字符串。(返回值string)
 
18:继承
1)、子类继承了父类的属性和方法,但是没有继承父类的私有字段和构造函数,虽然没有继承父类的构造函数,但是子类会默认调用父类的无参构造函数,然后创建父类对象,方便子类对象调用父类的方法。(这都是有前提的)
2)、在子类中调用父类的构造函数记得使用base()关键字。
3)、new关键字的作用:
创建对象;
隐藏父类那里继承过来的同名成员,隐藏的后果就是子类调用不到父类的同名成员。
 
19:ArrayList list=new ArrayList();
添加单个元素用list.Add();
添加集合的话用list.AddRange();
删除元素:
list.Clear();//删除所有元素
list.Remove(object obj);//删除特定的元素,obj写谁,就删谁
list.RemoveAt(int dex);//按下标删除特定元素
list.RemoveRange(int dex,int long);//从dex这个下标开始删除long长度的元素
list.sort(); //升序排列
list.Reverse(); //反转元素
list.Insert(); //在指定位置插入元素
list.InsertRange(); //在指定位置插入一个集合
list.Contains(); //判断是否包含某个元素
 
20:
is:表示类型转换,如果能够转换成功,则返回一个true,否则返回一个false。
as:表示类型转换,如果能够转换则返回对应的对象,否则返回一个null。
 
21:我们将一个对象输出到控制台时,默认情况下输出该类所在的命名空间。 
同理,将一个数组输出到控制台时,默认情况下输出该数组类型所在的命名空间。
For Example:
int[] number={1,2,3,4,5,6,7,8};
Console.WriteLine(number); //此时在控制台只会输出System.Int32[]
 
22:ArrayList集合的长度问题 
每次集合中实际包含的元素个数(count)超过了可以包含的元素个数(capacity)时,
集合就会向内存中申请多开辟一倍的空间,来保证集合的长度一直够用!
 
 
 
23:Hashtable:键值对集合 
根据键来存储值、并且键是唯一的,不能重复。
Hashtable ht = new Hashtable();
添加元素的方式有两种:
1:ht.Add(Keys,Value); //Keys的值不能出现重复;
2:ht[Keys]=Value;     //这个类似于赋值,keys的值相同时,会把之前的旧值覆盖掉。
对Hashtable中的元素进行遍历时,只能用foreach循环,用for循环不能满足要求。
foreach(Var item  in collection)  //Var:能够根据值来推断出值的类型(但是,之所以一直不用Var类型,是因为在用Var来定义变量的时候必须初始化变量)
{ //C#是一种强类型语言(必须给出变量的明确类型定义)
 XXXXX...... //js是一种弱类型语言(不需要给出变量的明确类型定义)
}
在遍历Hashtable集合的时候可以根据键来遍历其中的值,也可以直接根据值来遍历。
foreach(Var item in ht.Keys) //根据键来遍历
foreach(Var item in ht.Value) //直接根据值来遍历
在Hashtable集合中对键和值的类型没有要求,可以是任意类型:
例如:ht.Add("abc","cba")、ht.Add('a',false)、ht.Add(true,3.45).....
Hashtable中的常用方法:
ht.Add(); //添加元素
ht.Remove(Keys); //按键值移除元素
ht.Clear(); //移除所有元素
ht.ContainsKeys(Keys); //判断是否包含某个键值Keys
ht.ContainsVlaue(Value); //判断是否包含某个值Value
 
 
23:Path类是专门用来操作文件路径的(Path类是静态类):当然用字符串的处理办法也能实现。 
string str = @"C:Users成才DesktopHashtable.txt";
            //返回文件名
            Console.WriteLine(Path.GetFileName(str));
            //返回文件名,但不包括扩展名
            Console.WriteLine( Path.GetFileNameWithoutExtension(str));
            //返回文件所在的文件夹名
            Console.WriteLine(Path.GetDirectoryName(str));
            //返回文件的扩展名
            Console.WriteLine(Path.GetExtension(str));
            //连接两个字符串作路径
            Console.WriteLine(Path.Combine(@"C:a","b.txt"));
   
   
    24:File这个静态类是用来处理文件的(创建、删除、复制等) 
File.Create(@"C:ad.txt");
File.Delete(@"C:ad.txt");
File.Cope(@"C:ad.txt");
 
编码:将字符串以怎样的格式保存为二进制。
乱码:产生乱码的原因就是你保存这个文件所采用的编码格式和你打开这个文件所采用的编码格式不一样。
文本文件:拖到txt文件中还能看懂的文件就是文本文件。
 
25:读取文本文件:
//以UTF-8的编码格式读取1.txt这个文件
byte[] buffer= File.ReadAllBytes(@"C:Users成才Desktop1.txt");
string str=Encoding.GetEncoding("UTF-8").GetString(buffer);
Console.WriteLine(str);
Console.ReadKey();
 
26:向指定的路径写入文件:
//以默认的格式(ANSI)写入文件。
string str="我们都有一个家,名字叫中国!!!!";
byte[] buffer=Encoding.Default.GetBytes(buffer);
File.WriteAllBytes(@"C:Users成才Desktop2.txt",buffer);
Console.ReadKey();
 
27:File.ReadAllLines(路径,读取的编码方式); //返回一个字符串数组 
File.ReadAllText(路径,读取的编码方式); //返回一个字符串
前面这两个方法只能读取文本文件,不能读取音乐文件、多媒体文件等;
File.RradAllBytes(); //返回一个字节(byte)数组,可以读取各种文件,包括音乐、视频文件。
 
28:绝对路径和相对路径 
绝对路径:通过给定的这个路径直接能在我的电脑中找到这个文件。
相对路径:文件相对于应用程序的路径。
我们在开发的过程中尽量使用相对路径;
 
29:File.WriteAllLines(路径,字符串数组);
File.WriteAllText(路径,字符串);
File.WriteAllBytes(路径,字节数组); //这三个方法都会覆盖掉之前文本中有的东西。
 
30:在文本的后面追加东西有这几个方法:
File.AppendAllLines(路径,字符串数组);
File.AppendAllText(路径,字符串);
 
File类只能用来读取小文件,读取大文件需要用文件流;
 
 
31:泛型List
List<T> list=new List<T>();
list.Add();
list.AddRange();
list.Remove();
list.removeAt();
list.Clear();
list.Reverse();
泛型要比数组方便的多,类型一旦确定就能像动态数组一样用,并且泛型和数组之间可以相互转化;
如:int[] nums=list.ToArrray();
string[] str={"a","b","c"};
List<string> listtwo= str.ToList();
 
 
 
 
32:装箱、拆箱
装箱:将值类型转换为引用类型。
拆箱:将引用类型转换为值类型。
看两种类型是否发生了装箱或者拆箱,要看两者之间是否有继承关系;如果没有继承关系,一定没有发生装箱或者拆箱,有继承关系才有可能发生装箱或者拆箱。
在我们的代码中,要尽量避免装箱或者拆箱,因为这样时间会浪费内存,耗时较长。
 
 
33:Dictionary 字典
Dictionary<int,string> dic=new Dictionary<int,string>();
dic.Add(1,"a");
dic.Add(2,"b");
dic.Add(3,"c");
dic[1]="新来的";
遍历的时候:
Foreach(Var item in dic.Keys)
{
 Console.WriteLine("{0}----{1}",item,dic[item]);
}
或者是:
Foreach(KeysValuePair<int,string> kv in dic)
{
 Console.WriteLine("{0}----{1}",kv.Keys,kv.Values);
}
 
 
34:
FileStream是操作字节的,因此可以操作包括文本以外的其它各种文件;
StreamReader和StreamWriter是操作字符的,因此只能操作文本文件。
 
 
35:
将创建文件流对象的过程写在using当中,会自动的帮助我们释放流所占用的空间。
StreamReader和StreamWriter是专门用来操作文件的,如果只针对文件的话,用StreamReader
和StreamWriter要比FileStream方便的多。
接触到关于流的类时,一定要记得把创建对象的部分写在using里面,否则会容易造成忘记释放
资源,而造成内存泄漏。
用FileStream的好处是,可以操作任意类型的文件,但是中间要涉及到编码格式的转换。
 
 
 
面向对象多态之虚方法(让一个对象表现出多个状态):在基类中用virtual标识方法,
在派生类中用override来覆盖同名的方法。
 
 
 
 
面向对象多态之抽象类:
当父类中的方法不知道该如何实现的时候,可以考虑将父类写成抽象类,将父类中的方法写成抽象方法。
抽象函数没有方法体。之所以用抽象函数,是因为我们不知道该如何去写这个抽象方法或者说,
这个抽象方法如果真去实现的话根本没有意义;如果能写出抽象方法的方法体的话,我们就不把它写成
抽象方法了,而是写成虚方法。(抽象方法存在的意义就是让子类去重写这个方法)
 
 
36:
抽象类特点:
1)、抽象成员必须标记为abstract,并且不能有任何实现。
2)、抽象成员必须在抽象类中。
3)、抽象类不能被实例化
 
4)、子类继承抽象类后,必须把父类中的所有抽象成员都重写。
 
(除非子类也是一个抽象类,则可以不重写)
5)、抽象成员的访问修饰符不能是private
6.)、在抽象类中可以包含实例成员。
并且抽象类的实例成员可以不被子类实现
 
7)、抽象类是有构造函数的。虽然不能被实例化。
 
 
8)、如果父类的抽象方法中有参数,那么。继承这个抽象父类的子类在重写父类的方法的时候必须传入对应的参数。
 
如果抽象父类的抽象方法中有返回值,那么子类在重写这个抽象方法的时候 也必须要传入返回值。
 
 
======
如果父类中的方法有默认的实现,并且父类需要被实例化,这时可以考虑将父类定义成一个普通类,用虚方法来实现多态。
 
如果父类中的方法没有默认实现,父类也不需要被实例化,则可以将该类定义为抽象类。
 
 
 
37:
接口中的成员(方法、属性、索引器)不允许写访问修饰符,默认就是public。
接口的成员不能有定义,也就是说,接口里的方法是只能声明,不能写方法体。(有点类似抽象函数)
 
接口是一种规范,一旦你继承了某个接口,就要实现其中的成员。
接口、静态类、抽象类都不能被实例化!!
接口与接口之间可以继承,并且可以多继承。(而’类‘不能)
接口可以继承接口,但是不能继承类。
一个类继承一个类和多个接口,语法上必须把类写在前面。
 
显示实现接口就是为了解决方法的重名问题。
 
GUID可以帮我们产生一个全世界不重复的编号。Guid.NewGuid();
 
 
38:
访问修饰符
public:公有的
private:私有的,只能在当前类的内部可以访问
protected:受保护的,只能在当前类的内部以及该类的子类中可以访问
internal:内部的,只能在当前的项目中可以访问,在同一个项目中public和internal的访问权限是一样的。
protected internal: protected+internal
 
 
 
能够修饰类的访问修饰符只有public和internal。(默认类的访问修饰符是internal)
可访问性不一致:子类的访问权限不能高于父类,否则会暴露父类的成员。
 
 
设计模式(23种):开发项目的一种方式。
 
39:序列化:   将对象转换为二进制
反序列化:将二进制转换为对象  
作用:传输数据
要序列化某个对象,必须先将这个对象对应的类标记为可序列化的。[Serializable]
 
部分类:partial
在同一个命名空间下,有的时候为了开发方便,可以有相同的(部分)类。
 
密封类:sealed(不能被继承,但是可以继承别人)
 
40:任何对象都可以调用ToString()方法,而object这个类又是所有类的父类,
所以说,ToString()方法是object中的方法,并且是虚方法,在子类中可以重写它。
 
 
41:MD5加密
MD5这个抽象类在using.System.Security.Cryptography这个命名空间下,通过MD5  md5=MD5.Create();
来创建一个MD5对象,再调用md5.ComputeHash(buffer);就将字节数组buffer转换为加密后的字节数组了,
最后将字节数组转换为字符串输入就OK了。
将字节数组转换为字符串有几种方式:
1)、将字节数组中的每一个元素按照指定的编码格式进行解析;
2)、将字节数组中的每一个元素ToString(),然后连接起来就OK了;
3)、直接将字节数组ToString(),这样肯定是不行的,得到的是字节数组所在的命名空间。
 
 
 
 
42:winform应用程序是一种智能客户端技术,我们可以使用winforn应用程序帮助我们
获得信息或者传输信息等。
43:属性
Name:在后台要获得其那台的空间对象;
Visible:指示一个控件是否可见;
Enable:指示一个控件是否可用;
获取焦点:Focus();
44、事件:发生一件事情。
注册事件:
触发事件:
45、在Mian函数中创建的窗体对象,我们称之为这个窗体应用程序的主窗体。,
也就意味着,当你将主窗体关闭后,整个应用程序都关闭了。
46:
Click:当点击按钮时的点击事件。
Load:当窗体被加载时发生的事件。
MouseEnter:当鼠标进入控件的可见部分时发生。
47、TextBox文本框控件:
WordWrap:指示文本框是否换行;
PassWordChar:让文本框显示单一的字符;
ScollBars:是否显示滚动字条;
默认的事件是TextChanged:在控件上更改Text属性的值时引发的事件。
label标签控件就是用来显示文本的。
48:跑马灯练习
string str="abcde";
//前提是下面的类似代码要在一个Timer计时器下执行;
str=str.Substring(1)+str.Substring(0,1);
49:单选:RadioButton
多选:CheckBox
容器:GroupBox
50:MDI窗体设计:
1)、首先确定一个父窗体,将IsMdiContainer设置为true;
2)、创建子窗体,并设置它们的父窗体。
在父窗体中横向排列子窗体(横向排列的Click事件):LayoutMdi(MdiLayout.TileHorizontal);
在父窗体中纵向排列子窗体(纵向排列的Click事件): LayoutMdi(MdiLayout.TileVertical);
51:
File:操作文件
Path:操作路径
FileStream:文件流
StreamReader:操作文本文件
StreamWriter:同上
Directory:操作文件夹   目录
52:Directory 操作文件夹的
Directory.CreatDirectory();在指定路径下创建文件夹
Directory.Delete();删除指定文件夹下的文件夹
Directory.Move();剪切文件夹,但是只能在同一盘中进行
Directory.Exists();判断指定路径下的文件夹是否存在
Directory.GetFiles();获得指定文件夹下的所有文件的全路径
Directory.GetDirectory();获得指定那个文件夹下的所有文件夹的全路径
53:webBrowser浏览器控件
 url
 
54:ComboBox下拉框控件
DropDownStyle:控制下拉框的外观和样式
ListBox列表框(类似于KuGou的音乐列表):
要获取列表中某个元素的下标可以这么来:int n=listbox.SelectedIndex;(当创建列表中文件的双击
事件时,非常有用)。
55:打开对话框
OpenFileDialog ofd=new  openFileDialog(); //创建对话框对象
ofd.Title="****"; //设置对话框的标题
ofd.Multiselecte=true; //设置对话框是(否)可以多选
ofd.InitialDirectory=@"路径"; //设置对话框的初始目录
//设置对话框打开文件的类型
ofd.Filter="文本文件|*.txt|视频文件|*.wav|图片文件|*.jpg|所有文件|*.*";  
ofd.ShoewDialog();  //显示对话框
string fileName=ofd.FileName;    //获得对话框中文件的路径;
56:保存对话框(类似于打开对话框)
SaveFileDialog  sfd=new SaveFileDialog(); //创建保存对话框对象
sfd.Title="标题名"; //设置对话框的标题
sfd.InitialDirectory="路径"; //设置对话框的初始目录
//设置对话框保存文件的格式
sfd.Filter="文本文件|*.txt|所有文件|*.*";
sfd.ShowDialog(); //打开保存对话框
57:字体和颜色的设置(设置文本文件中文本的字体和颜色)
FontDialog fd=new FontDialog();
fd.ShowDialog();
txtWord.Font=fd.Font; //设置文本中的字体
ColorDialog cd=new ColorDialog();
cd.ShowDialog();
cd.ForeColor=txtWord.Color; //设置文本的颜色
58:进程和线程
单线程在处理问题时容易出现卡死,而多线程可以让计算机同时做多件事情,提高效率。
表示进程的类:Process
表示线程的类:Thread
线程分为:前台线程和后台线程
后台线程:前台线程关了,我这个后台线程也就关闭了。
59:在.Net中是不允许跨线程操作的。
60:取消跨线程的访问(窗体加载时写上-->):Control.CheckForIllegalCrossThreadCalls = false;
61:Net的公共语言进行时(CLR)能区分两种不同类型的线程:前台线程和后台线程。这两者的区别就是:
应用程序必须运行完所有的前台线程才可以退出;而对于后台线程则可以不考虑其是否已经运行完毕而
直接退出,所有的后台线程在应用程序退出时都会自动结束。
一个线程是前台线程还是后台线程可以由它的IsBackGround属性来决定,这个属性是可读可写的。它的
默认值是False,即意味着一个线程默认为前台线程。我们可以将它的IsBackGround属性设置为true,从
而使之为一个后台线程。
62:如果线程在执行过程中需要参数,那么要求这个参数必须是object类型。并且这个参数只能传递
到th.Start(参数)方法中。
63:GDI+  画图的东东
画直线需要:画笔  画笔的颜色   画图的对象  两个点  
Graphics g=this.createGraphics(); //Graphics 没有构造函数,不能直接new出来对象
Pen pen=new Pen(Brushes.颜色);
Point  p1=new Point(10,10);
Point p2=new Point(100,100);
g.DrawLine(pen ,p1,p2);
由于我们在拖动窗体的时候,系统在不停的给我们重新绘制当前窗体。而窗体内的图像可能会被擦去,
因此,我们会创建一个窗体移动时的Paint事件,让窗体只要一移动就重新绘制我们需要画的图型。
 
 
FOUR:
1、GDI+  画图的东东
画直线需要:画笔  画笔的颜色   画图的对象  两个点  
Graphics g=this.createGraphics(); //Graphics 没有构造函数,不能直接new出来对象
Pen pen=new Pen(Brushes.颜色);
Point  p1=new Point(10,10);
Point p2=new Point(100,100);
g.DrawLine(pen ,p1,p2);
由于我们在拖动窗体的时候,系统在不停的给我们重新绘制当前窗体。而窗体内的图像可能会被擦去,
因此,我们会创建一个窗体移动时的Paint事件,让窗体只要一移动就重新绘制我们需要画的图型。
 
 
2、整型变量可以直接加到string类型上吗?
 
3、HTML 超文本标记语言
在HTML中存在着大量的标签,我们用HTML提供的标签,将要显示在网页中的内容包含起来,就
构成了我们的网页。
 
CSS:控制网页内容现实的效果。
 
HTML+CSS=静态网页。
动态网页:JS或者是Jquery
 
4、开始动手写HTML页面
1)、首先在桌面上随便建一个文件。
2)、将创建的文件的拓展名改为.html或者.htm。
3)、开始写基本的框架标签。
 
5、HTML中的标签
<p></p>段落标签(两段之间有空隙,不同于换行标签)
&nbsp;空格标签
<h#></h#> #:1--6 标题标签
<!--要注释的内容-->:注释符
<img/>:图片标签(用来显示图片)
在图片标签 之前加上<marquee direction="right" behavior="slid" ></marquee>可以设置图片
向右(direction)滑动  还可以设置成滑动到右边停止(behavior)。
src:图片的一个属性,用来存储图片的路径。
border:用来控制边框的大小。
图片的宽度
height:图片的高度
alt:当图片由于某种原因,在网页上不能正常显示图片时,显示alt此文本。
title:当鼠标移到图片上时会显示一个小标题。
<b></b>:加粗的标签
<i></i>:意大利斜体
<tt></tt>:打印机字体(等宽)
<u></u>:下划线
<s></s>:删除线(在文本上画上一横线)
<sup></sup>:上标  如:3<sup>2</sup>+4<sup>2</sup>=5<sup>2</sup>  输出3的平方+4的平方=5的平方
<sub></sub>:小标  意义同上。
<hr/>:水平线
<br/>:纯粹的换行
>(大于号):&gt
<(小于号):&lt
&(符号):&amp
属性都是以“属性名="值"”的形式出现(属性的值建议用引号引起来), 一个属性可以有多个标签,
但是要以空格隔开。
<font></font>:字体标签  size:1~~7  7最大   color:颜色   face:字体系列
 
<!--如果之后在代码前面加上code标签,并不能如我们想的那样在网页上按我们编写代码的形式输出,-->
<!--还必须要加上pre标签,这个pre标签类似于我们C#中的&操作符-->
  <pre>
  <code>
   for(int i=0;i<100;i++)
   {
    Console.WriteLine("Hello World");
   }
  </code>
  </pre>
 
 
a标签(4个作用):
1)、超链接   href表示要连接到的地址   target:打开新网页的方式:_blank(表示重新打开一个
窗口,显示超链接的地址), _self表示就在当前窗体里打开超链接。(不仅仅文本可以超链接,图片也行的)
2)、实现页面内部的跳转,naem="" href="@要转到的名称"
3)、实现页面间的跳转,href="要去的文件名#name"
4)、发送邮件,
 
6:BODY中的属性:
text:设置文本的颜色
link:设置超链接的颜色
alink:设置点击超链接时的字体颜色
vlink:设置点击超链接后的字体颜色
bgcolor:设置背景的颜色
background:设置背景图片
 
7:无序列表(属性type="disk、circle、square")
<ul></ul>  中间的内容都用写在<li></li>标签中。
有序列表  (属性type="1、A、a、I")
<ol></ol> 中间的内容都用写在<li></li>标签中。
自定义列表
<dl></dl>  大标题写在<dt></dt>中,具体内容写在<dd></dd>中。
 
8:在网页中画表格(表格中的内容可以是文本、图片、超链接等)
<table></table>在table中可以写很多属性来设置表格的样式:
如:border="?px"  设置表格边框有多小像素点
cellspacing="?px"  设置单元格之间的间距
cellpadding="?px"   设置文本与单元格之间的间距
<tr>表示行</tr>
<td>表示每一行的单元格</td>
当然我们也可以跨行或者跨列:
跨行的时候在单元格属性(td)里面加上属性rowspan="?" ,填几,就跨几行。
跨列的时候在单元格属性(td)里面加上属性colspan="?" ,填几,就跨级列。
单元格还可以设置长度和宽度(height、width)。
单元格一班用<td></td>这个标签,但是,如果想让单元格里的内容加粗并且居中显示的话,要用这个
<th></th>标签,<td></td>标签满足不了需求喽!!
<td></td>中的一些属性
align  对应文本中的字体位置center、left、right
valign  对应文本中的字体位置bottom、top、middle
bgcolor  背景颜色
width
height
colspan 跨占的列数
rowspan 跨占的行数
为啥要用表单?因为要想服务器传输数据!!
 
框架标签:作为框架页面的承载页面是不允许有body标签的。取而代之的是<frameset></frameset>标签。
 
 
Div+Span
DIV:用于布局
Span:用于设置文本的样式
能够熟练掌握css+div布局
 
CSS:
向HTML页面写入CSS代码,有三种方式:
内联样式表:在标签内设置元素的样式
嵌入样式表:需要的head标签内写 <style type="text/css"></style> (推荐使用的)
外部样式表:link
 
样式规则的选择器:(帮助我们获得页面上要设置样式的元素))
HTML  Selecter:当我们要设置页面中所有同一类型的标签样式时,用这个比较合适。
Class Selecter:当我们要设置页面中部分标签的好几个相同样式时,这个合适。
ID Selecter:当我们要设置页面中相同标签的不同样式时,用这个合适。(最好样式都不一样)
关联选择器 :在标签嵌套时,用这个合适。
组合选择器:可以让不同的标签有相同的样式。
伪元素选择器:
A:active 选中超链接时的状态
A:hover 光标移动到超链接上的状态
A:link  超链接的正常状态
A:visited  访问过的超链接的状态
P:first-line  段落中的第一行文本
P:first-letter  段落中的第一个字母
 
文本的属性:
text-align 文本位置
text-indent 首行缩进
line-height  行高
word-spacing 单词的间距
letter-sapcing 字符之间的间距
font-weight  字体的粗细
font-style  字体样式(斜体。。。)
font-size  字体大小
font-family  字体系列(仿宋。。。。)
 
 
 
 
 
new关键字的作用:
1、在堆中开辟空间
2、在开辟的空间中创建对象
3、调用对象的构造函数
 
如何在Debug中随意的将.EXE复制到其他地方使用。。。。。。。。。。。??
 
 
 
WPF内容:
为什么要定义一个类,为了方便尽量不操作控件。
进行数据绑定的步骤:
1、定义类、定义属性。
2、new一个新的实例,给要绑定的控件设定DataContext。
txtName.DataContext=p1;
3、在XAML中绑定属性   text="{Binding Name}",几乎所有的属性都能这样进行绑定,
text="{Binding Name}",把控件的Text属性绑定到DataContext指定的p1对象的Name属性上。
 
 
由于普通对象没有”通知我的属性变了“这么一种机制,所以改变对象的属性的界面不会变。
但是界面改变是有TextChanged之类的事件的,所以改变界面可以同步修改到对象。
 
 
 
如果要求后台对象的值发生改变,界面也要跟着变,则需要类来实现INotiPropertyChanged
接口,并且在属性值发生改变后触发事件。(怎么触发,举例如下:)
  private int _age;
  public int Age
  {
   get
   {
    return _age;
   }
   set
   {
    this._age=value;
    if(PropertyChanged!=null)
    {
     PropertyChanged(this,new PropertyChangedEventArgs("Age"));
    }
   }
  }
当然,如果说后台对象的值不会变,则没必要实现INotiProp
 
 
 
 
SQL:
insert into T_表名 (字段1,字段2....)  values(对应的值)
//结尾不需要标点,字符串有单引号引起来,bool类型,在SQL中用bit类型替代。
select Name,Age,Gender...   from T_表名 (可以加过滤条件的)
//查询数据,如果是查询所有数据,就用*代替。
delete from T_表名 where Name='XX'  (where后可以跟一些条件判断)
//从那个表中删除Name=XX的那一列。(delete from T_表名  //表示删除表中所有信息)
update T_表名 set Age=Age+1 ,Gender='人妖',...
update T_表名 set Age=Age+1,Gender='ss',...where Name='啥'(可以更新满足条件的部分)
//更新数据,让年龄都长大一。
给列起别名:(as)
select Name as n1 from T_表名  //查询出来后Name的名字变成来了n1,
select Name as n1 ,GETDATE() from T_表名  //同时获得系统的时间
几个系统的内置函数:
select MAX(Age),MIN(Age),COUNT(*) from T_表名
select MIN(Age) from T_表名 where Age>100(带条件的求值)
 
通配符过滤:Like
select * from T_表名 where Name Like 'y%'  //模糊搜索,查询名字的首字母是y的
select * from T_表名 where Name Like 'y%k'  //查询y开头,k结尾的姓名。
 
 
自己写的EXE程序怎么更换图标样式????
 
使用like语句的时候,查询效率比较低,因为这个算是全盘扫描;如果是在大的项目中,有种技术叫‘全文检索’,
这个技术的查询效率要高的多。
 
select * from T_student order by Age (Asc)  //默认你情况下,是按升序排列
select * from T_student order by Age Desc //按降序排列
如果是在年龄上一样,那么可以再按身高排序:
select * from T_Student order by Age,Height (默认下是升序排列,如果此时身高需要降序排列,就在
Height后面加上Desc,同理Age也是一样)
当然排序的时候也可以按照条件来排序:
select * from T_Student where Name like 'y%' order by Age //注意,where语句要写在order语句之前。
 
 
 
 
进程(每一个应用程序都可以理解为一个进程):Process
利用进程打开或者关闭应用程序。
 
线程:Thread
前台线程:一般我们创建的都是前台线程,只有所有的前台线程都关闭了,整个应用程序才关闭。
后台线程:只要前台线程结束,后台线程就自动结束。
当我们需要在关闭主线程的时候,同时也需要关闭我们能创建的那个线程,此时就把我们创建的线程设置为后台线程。
 
线程之间是不允许跨线程访问的,但我们可以不让程序去检测是否我们进行了跨线程的访问。
Control.CheckForIllegalCrossThreadCalls = false;
当我们已经进行了跨线程的访问,并且在关闭一个线程时,另一个需要访问该线程的线程并未终止时,此时会抛异常,
解决方法就是:在关闭一个线程时注册一个事件,判断另一个线程的值是否为null,如果不是,我们就手动将这个线程
关闭(Abort)。
 
 
 
导入进度条用Progressbar,Winform窗体中的工具箱中有。
 
 
参数化查询的时候,cmd.Parameter.Add和cmd.Parameter.AddWithValue()的区别就是:前者的效率高一些,但是要指明参数的
类型和长度,故稍微有点麻烦;而后者虽然效率低一点,但在不太大的程序中,还是比较方便的。
 
 
二者不一样的:
NULL在数据库中表示“不知道”
“”在数据库中表示空
 
 
在使用数据库系统管理软件的时候我们可以通过创建不同的服务器登录名,来分别授予不同的权限,因而对数据库执行不同的操作。
(如:选择(查看)、备份、插入、更新等)。
 
 
 
 
《数据库中复杂的Null问题》
在数据库中Null的意思表示”不知道“,而""的意思是空,在真正做项目的时候,二者的区别大了去了,因此我们在
向数据库插入数据的时候一定要先理解好意思,当某一列不输入数据的时候,是用""表示呢?还是Null表示?同时在表
示某些属性时,如果该属性的类型是int型的话,当你不输入值的时候,倘若也不加判定,这时会向数据库中添加0,当
然,这在有些问题中的影响是很大的,例如:一个人的年龄允许啥也不输入,但你如果不加限定的话,数据库中的这一
列会用0填充,因此,考虑到实际问题时,我们要加以限定,此时要用到:DBNull.Value,举例如下:
   object objName;
            if (name.Length <= 0)
            {
                objName = DBNull.Value;
            }
            else
            {
                objName = name;
            }
从数据库中取值的时候,如果有些列的值为NULL,在取值的时候要判断一下,否则会出错;还有就是取出来的值是int
类型,而且是NULL,此时在声明int变量时要这么声明:int? age; //值类型后面加问号表示可为空null
举例说明:
    if(row["Name"]==DBNull.Value)
                    {
                        name = null;
                    }
                    else
                    {
                        name = (string)row["Name"];
                    }
                    //值类型后面加问号表示可为空null
                    int? age;  //如果是int age 的话,age的值不能为null.
                    if (row["Age"] == DBNull.Value)
                    {
                        age = null;
                    }
                    else
                    {
                        age = (int)row["Age"];
                    }
     
     
     
    
     
 
HTML中不把“ ”当成空格,因为HTML中排版经常有缩进,如果把缩进的空格在浏览器中以空格的形式展现的话,
排版会很麻烦。显示空格用&nbsp:
为什么<>要用&lt;&gt;替代?就是因为<>有特殊含义:标签的定义

h标签是标题标签--h1、h2、h3、、、h6 //最多只有六个标题,之后再多的h7、h8没有用。
<p>是分段标签,前后有比较大的空隙,<br/>是换行标签,前后没有像<p>标签那样有大的空隙。
<pre>这个标签是啥东东????</pre>
<br/>仅仅是换行、<p>标签是不仅换行,还在两段之间空行。

相对URL是表示相对当前文档的资源,/表示网站根目录,
../表示父目录、    ../../表示父目录的父目录

<a href="http://www.baidu.com" target="_blank"/> //_blank表示在新窗口中打开
<ul>是无顺序的列表、<ol>是有顺序的列表


align就是设置对齐方式,可以设置表的整行的对齐方式,也可以设置某个单元格的对齐方式。
<table>
<tr align="left">
<td>我</td>
</tr>
<tr>
<td>我</td>
</tr>
<tr>
<td>我</td>
</tr>
<table>

在第一个<tr>之前加<thead>有啥用?好像没啥效果呀。。。。



<meta http-equiv="content-Type" content="text/html charset=UTF8">:
http-equiv相当于http的文件头作用,它可以向浏览器传回一些有用的信息,以帮助正确精确的显示网页内容。



<input type="text" sise="文本框的长度" value="文本框中的值" maxlength="可以输入的最大长度" readonly="readonly"/>
可以设置为只读的,其中的某些属性也可以不设置都取默认值。
<input>都是在form表单这个标签里的;
select标签:就是来写我们Winform里的ConboBox和ListBox的。
<select>
<option>这里写每一项的内容</option>
<option>这里写每一项的内容</option>
</select>
或者将option进行一下分组,这么写:
<select>
<optgroup>
<option>这里写每一项的内容</option>
</optgroup>
<optgroup>
<option>这里写每一项的内容</option>
</optgroup>
</select>

这么写可以当我们点击文本的时候,文本框或者是复选框会获得聚焦,如果仅仅是在input前写上文本,这样没什么
效果,文本和控件之间没有联系。下面的写法才是有意义的写法:
<label for="name">姓名:</label><input  id="name" type="text"/>
<label for="marry">婚否:</label><input id="marry" type="checkbox"/>

在html中FieldSet标签就相当于Winform中的GroupBox标签。legend就是组合框的名字。
<fieldset>
<legend>统称:</legend>
<input type="text"/>
<input type="text"/>
<input type="text"/>
</fieldset>
CSS:
要设定<input>标签的样式时,需要用到CSS,我们可以直接在<input>中设定样式,如:
<input type="text" value="赵成才" style="" />,但是这么写不太符合实际,因为一般
在一个页面中,所有的Input标签或者p标签都是一个样式,所以,我们不会挨个的设定他们的样式,而是把这些统一的
样式写在<head>标签下,如:
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title></title>
    <style type="text/css">
        input {
            background-color:yellow;
        }
        p{
            color:blue;
            font-size:xx-large;
        }
    </style>
</head>
就是在head标签里加上一个style标签,在里面设定统一应该设置的样式,之后如果某个具体的标签需要设定不一样的
样式,再去设定具体的标签就OK了。


疑问:
在vs内部可能有一个容器,来暂时存储你要运行的exe,当你连续多次运行的时候,它不会再一次重新读取你的代码,
而是直接从那个容器里调用上一次编译好的代码,象征性的提高程序的运行速度?????



<div></div>将内容包装到一整块中,要独立的占据一整行。
<span></span>只是将一段内容定义成一个整体进行操作。


<div style="cursor:pointer;color:Blue;"><u>Div</u></div>
cursor:鼠标在元素上时显示的光标,可选值:pointer(超链接的手)、text(输入Bean)、wait
(忙沙漏)、help(帮助)等。


<ul></ul>和<li></li>的前面默认是有圆点的,我们可以设置他们的Style来取消圆点的显示。
<ul style="list-style-type:none">
        <li>aaa</li>
        <li>aaa</li>
        <li>aaa</li>
        <li>aaa</li>
    </ul>
这就取消了aaa前面的圆点。也可以将style设置到li上。


样式选择器:class选择器、标签选择器、id选择器、关联选择器、组合选择器、伪选择器
class选择器:在head中添加Style标签,写上几种可能采取的样式,注意起的名称前有个'.',之后在具体的哪个标签
上调用那个样式就OK了。当然一个样式也可以调用多个标签,中间用空格隔开就行了。当然你调用了class选择器后,还
可以继续在相应的标签上写style,继续设置样式。
<head>
    <title></title>
    <style>
        .A1 {
            background-color:green;
        }
        .A2{
            font-size:10px;
            cursor:help;
        }
    </style>
</head>
<body>
    <div class="A1">你好,亲爱的</div><br /><br /><br />
    <div class="A2">你好,亲爱的</div><br /><br /><br />
    <div class="A1 A2">你好,亲爱的</div><br /><br /><br />
    <div>你好,亲爱的</div><br /><br /><br />
</body>



JavaScript是在浏览器端执行的语言。
     
 
 
margin是外边距,padding是内边距。
 
创建单列模式的步骤:
1、将构造函数私有化
2、写一个静态方法
3、创建一个静态字段,在静态方法中返回
 
 
Sqlserver的模糊查询总是出问题。。???
 
 
内联样式表:直接在标签内部通过CSS代码来设置内容的样式。如:
 <div style=" font-size:xx-large">中国铁路客服中心</div>
 嵌入样式表:需要在我们的Head标签内写入这么一段代码:
 <style type="text/css">
 p{
 
  font-size:xx-large;
 }
 </style>
 外部样式表:link
 
 HTML选择器:在Head标签内写上; //这个选择器,在style里面写啥,直接就操作于HTML中的所有这类标签。
 <style type="text/css">
 p{
  color:red;
 }
 </style>
 
class选择器:针对性的处理某个标签,前提是要为特殊的标签起个class名。如:大致的用法就是这样。
<head>
 <style type="text/css">
  tt.tt1{
   
  }
  tt.tt2{
   font-size:xx-large;
  }
 </style>
</head>
<body>
 <tt class="tt1">今天天气还晴朗,处处好风光</tt>
 <tt class="tt2">今天天气还晴朗,处处好风光</tt>
</body>
 
ID选择器:跟class选择器的用法差不多。只不过是在名字的前面加上“#”
<head>
 <style type="text/css">
  #p1{
   
  }
  #p2{
   font-size:xx-large;
  }
 </style>
</head>
<body>
 <p id="p1">今天天气好晴朗,出处哈风光</p>
 <p id="p2">今天天气好晴朗,出处哈风光</p>
</body>
 
关联选择器:其实就是标签的嵌套。
<head>
 <style type="text/css">
  p em{
   
  }
 </style>
</head>
<body>
 <p><em>今天天气好晴朗,出处哈风光</em></p> //只有这句话才发生斜体的改变
 <p>今天天气 ,处处好风光</p>
 <p>今天天气 ,处处好风光</p>
 <p>今天天气 ,处处好风光</p>
</body>
 
组合选择器:就是傻瓜式的把一堆标签垒到一起,设置一下样式罢了。
<head>
 <style type="text/css">
  p,h1,h2,h3{
   font-size:xx-large;
  }
 </style>
</head>
<body>
 <p>啊哈哈</p>
 <h1>哈哈哈啊</h1>
 <h2>异议不卡不卡</h2>
 <h3>好熬啊熬</h3>
</body>
 
 
在table中设置border的值,就是设置表的边框的粗细。
 
 
 
写网页的一般步骤:
在jsp中写html代码,然后在本地的webRoot中将三个文件打包(war)格式,最后上传就行了。
这只写静态的网页,只是显示信息罢了,不能存储数据
 
 


 
 
 
 

 

原文地址:https://www.cnblogs.com/ZT-SummerRain/p/6735880.html