.NET人事管理系统基础知识

1.可空类型:引用类型18672907174

不可空类型:值类型  但int? i=null;
int? i5=null;  int i6=(int)i5;编译没有问题
有可空类型的原因是:有些控件有第三中状态

2.Grid布局(表格布局)
<Grid>
<Grid.RowDefinitions>
<RowDefinitions>第一行</RowDefinitions>
</Grid.RowDefinitions>

<Grid.ColumnDefinitions>
<ColumnDefinitions>第一行</ColumnDefinitions>
</Grid.ColumnDefinitions>
写控件,附加属性写法:<Button Grid.Row=”1″ Grid.Column=”1″></Button>
</Grid>
stackPanel布局
DockPanel布局

3.连连看布局
循环创建10行10列的布局
RowDefinition rowDef=new RowDefinition();
gridGame.RowDefinitions.Add(rowDef);

动态生成控件
Button btn=new Button();
btn.Content=i+”,”+j;

//通过代码修改控件的Grid.Row属性
Grid.SetRow(btn,i);
Grid.SetColumn(btn,j);

gridGame.Children.Add(btn);

改成图片地址
Image img=new Image();
img.Source=new BitmapImage(new URL(“1,jpg”,Urlkind.Relative))
Grid.SetRow(img,i);
Grid.SetColumn(img,j);
gridGame.Children.Add(img);

再加一个随机函数

4.布局嵌套

5.控件
菜单:
<Menu Height=”23″ HorizontalAlignmen=”Left”>
<MenuItem Header=”打开”>
<MenuItem Header=”1.txt”></MenuItem>
</MenuItem>
</Menu>

<DockPanel>
<Menu DockPanel.Dock=”Top”>
<MenuItem Header=”文件”></MenuItem>
<MenuItem Header=”编辑”></MenuItem>
</Menu>
</DockPanel>

<Button Content=“新建”></Button>
<Button>新建</Button>是一样的效果,但是button中可以放图片控件等

6.多窗口基础
AboutWindow aw=new AboutWindow()
aw.ShowDalog();
设置启动窗口:App.Xmal文件,有一个StratUpUrl设置
窗口的标题是有Window下的title设置的
WindowStartupLocation=”CenterScreen” 窗体启动位置
WindowState:窗口的状态
窗体传值跟类之间的传值是一样的:都是通过属性来赋值取值
new一个窗体,然后将传值进去,显示

7.多窗口显示:
MessageBox.Show(”显示窗口内容”,”标题内容”,Messagebox.ok);最后一个显示按钮
练习:自己实现一个确定,否,取消效果

8.打开文件保存文件对话框
OpenFileDialog ofd=new OpenFileDialog();
ofd.Filter=””文本文件|*.txt|PNG图片|*png;
if(ofd.ShowDialog()==true)  //可空类型可以和true比较
{
string file=ofd.FileName;打开文件名

}

9.数据绑定
TextBox Text={Binding Value,ElementName=slider}
后台有一个对应前台的类,就是后台类的属性

数据上下文(数据源)
声明一个对象 Private Person p1=new Person();
p1.Name=”张三”; p1.Age=18;

txtName.DataConText=p1; txtAge.DataContext=p1; 数据上下文:
在前台指定:Text属性={Binding Age}

同时也可以这么写txtName

为什么要定义一个类型:为了方便尽量不操作控件,MVC
数据绑定的步骤:
1.定义类,定义属性
2.new一个类是实例,给要绑定的控件设定DataContext
txtName.DataContext=p1;
3.XAML中要进行数据绑定的属性
Texty=“{Binding Name}”几乎所有的控件都能进行这样的绑定

数据绑定控件的值自增,但是前台界面没有改变,违反了数据绑定的思想
界面改值,后台改了,后台改了,界面不改:
前台改变,因为有监听事件,数据绑定内部就是监听事件,
由于普通对象没有“通知我的属性变了”这么一种机制,所以改变对象的属性界面不会变
但是界面改变是有TextChanged之类的事件,所以改变界面可以同步修改到对象

解决:缺少通知改变的一种事件:类继承一个INotifyPropertyChanged接口
接口里面只定义了一个字段,来通知改变
数据绑定会检测DataContext是否实现了INotifyPropertyChanged
如果实现了,就会监听PropertyChanged得知变化的属性
所以在set里面不能用简写 if(PropertyChanged!=null){触发事件
PropertyChanged(this,new PropertyChangeEventArgs(“Age”));
}
双向绑定实现。如果后台对象的值不变,一般不需实现这个接口

10.数据上下文,所有的控件都在Grid中,给Grid的数据上下文赋值给p1,那所有的控件上下文都是p1
就不用每个属性都写TxtName.DataContext=p1;
Grid控件的属性都是p1,但是子控件可以修改默认的上下文,name改为p2
this设置根节点上下文,所以grid中继承gird

11.ListBox的使用
ListBox中的项都是:ListBoxItems
List<Person> list=new List<Person>();
Person p1=new Person();
p1.Name=”张三”;
list.Add(p1);
第二种写法list.Add(new Person(){Name=”苏三”});等价
显示到ListBox上:
lbPersons.ItemsSource=list;

12.省市选择:
窗口加载时就把省加载上,其实就是一个字符串List<string>
SelectionChanged事件表示当选项改变的时候触发的

默认绑定显示的是对象,要显示名称就 DisplayMemberPath=”Name”

在改变的事件中显示

13.DataGrid布局表示表格布局(默认显示有表格,而且还有排序功能)
自动生成的列不要,多了一行就不要(自动新增了一行)
禁用自动生成列AutoGeneraColumns=“false”
内容显示 Banding={Banding Name}  header=“姓名” 表头改名字
CanUserAddRow=“false” 取消自动生成列

14.数据库介绍:MYSQL Oracle,DB2,SQLServer,SQL推荐逻辑号为主键:因为没有任何意义,

不允许保存表更改
改错:工具-选项-Designers:阻止保存。。。勾掉,

15.SQL语句入门

SQL语句中字符串用单引号,汉字前加N,SQl关键字不敏感,表名最好加前缀
select Name,Id from T1  ;select * from T1

delete from T_student where Name=’yzk’
delete from T_student  //删除了所有数据,可以通过日志恢复

insert into T_student(Name,Age) values(‘gzx’,89)

delete from T_student where Age>100 or Name=’yzk’ 或者
delete from T_student where Age>100 and Height>150 并且

update:更新
update T_student set Age=Age+1;
update T_student set Height=180;所有的身高都是180
update T_student set Age=Age+1,AiHao=‘吃饭’

16.ExecuteReader执行查询
连接字符串 Data Source=.; Initial Catalog=mydb;UserID=sa;Password=123456;使用using进行资源管理
using(SqlConnection conn =new SSqlConnection(“连接字符串”))
{
conn.Open();
using(SqlCommand cmd=conn.CreateCommand())
{
cmd.CommandText=”select * from T_Student where Age>40″;  执行insert updata就使用ExecuteNonQuery
执行select count这样的一行一列的就使用ExecuteScalar
执行多条查询结果就使用ExecuteReader,这个也返回一个SqlDataReader,SqlDataReader也调用了IDisposer接口(这个接口中就是一个释放方法)

using(SqlDataReader reader= cmd.ExecuteReader())
{
查询结果只放在数据库中的,没有到电脑客户端上,读的时候,指针指向第一条查询结果之前(相当于0)
while(reader.Read()) //如果独到最后一个之后就是false,否则为true
获取第一列姓名 {  string name=reader.GetStrin(1);
messageBox.show(name);
}
}
}

}

17.参数化查询漏洞select age from T_Student whlere Name=’yzk’
只有一列,指的是age这一列,查询结果中的第几列(从0开始)
1 ‘or’ 1’=’1 就变成
select age from T_Student where Name=’1′ or ‘1’=’1′
查询参数来解决
cmd.Command=”Select age from T_Student where Name=@Name”;
//cmd.Parameters.AddWithValue(“@Name”,txtName.text)
也可以 cmd。Parameters.Add(new SqlParameters(“@Name”,txtName.text)) 比较值的时候注意不要写控件而是控件的值

18.DataSet离线数据集
把数据拿到客户端可以断开连接(弊端不能查询数据量大的数据)
SqlDataReader是连接相关的,SqlDataReader中的查询结果并不是放到程序中的,而是放到数据库服务器中,SqlDataReader只是相当于放一个指针,只有读取当前游标指向的行,一旦连接断开就不能再读取了,这样做的好处是无论查询多少条,读程序占用的内存都几乎没有影响。
SqlDataReader对于小数据量的数据来说带来的只有麻烦,ADO.net中提供了数据集的机制,将查询结果填充到本地内存中,这样断开服务器都不影响数据的读取,数据集的好处是降低数据库压力。

DataSet Dataset=new DataSet();
SqlDataAdapter adapter=new SqlDataAdapter(cmd);
adapter.Fill(dataset);
DataSet包含若干表DataTable,DataTable包含若干行DataRow。

foreach(DataRow row in datase.Tables[0].Rows)row[“Name”]

标签