1.二进制序列化
json序列化和反序列化 : 把对象和字符串之间转换过程
二进制序列化和反序列化: 把对象和二进制字符串之间转换过程
写入 把对象转成二进制字符 再写入本地
(下列代码在winform中写入)
public class Info
{
public string Name { get; set; }
public string Description { get; set; } Description -----描述
}
Info i = new Info()
{
Name = "中东小霸王",
Description = "以色列"
};
FileStream fs = new FileStream("1.txt", FileMode.Create);
BinaryFormatter bf = new BinaryFormatter();-----二进制格式化工具
bf.Serialize(fs,i);-----二进制序列化 参数1:文件流 ,参数2序列化的对象
fs.Close(); -----关闭数据流
读取
FileStream fs = new FileStream("1.txt", FileMode.Open);
BinaryFormatter binaryFormatter = new BinaryFormatter();
Info i1 = binaryFormatter.Deserialize (fs) as Info;-----反序列化
MessageBox.Show(i1.Name + "----" + i1.Description);
fs.Close();
2.跳转传值
首先我们再创建一个

在form1中的代码中写入以下内容
方法1 通过构造函数传参数进行传递

public string info = "催缴物业费"; -----演示构造函数传参数
以下在按钮点击时间中写入
Form2 f2 = new Form2(info); -----创建form的窗体对象
在form2中:
public Form2(string info)
{
InitializeComponent();
MessageBox.Show(info);
}

方法2: 通过在Form2定义一个公共属性接收传递的变量,在form2的Form2_Load事件可以接收传递的变量。
如上图 public string s1 = "code change world";
f2.s2 = s1; -----把s1传递给form2的s2属性
f2.Show();
在form2中


Form2_Load-----窗体的加载事件,当窗体里面控件资源加载完毕之后执行
3.通过方法传值
bool T4(int a)
{
return true;
}
bool T3()
{
return true;
}
void T2()
{
}
public string T1()
{
return "Hello world";
}
Func<string> f1 = T1; -----接收一个有返回值的方法
Action f2 = T2; -----接收一个无返回值的方法
Func<bool> f3 = T3;-----接收一个返回值为true的方法
Predicate<int> f4 = T4; -----接收一个返回值为true的方法
Predicate<T> 是一个委托,它表示一个返回布尔值的方法,用于判断某个对象是否满足特定条件。
private void button1_Click(object sender, EventArgs e)
{
Form2 f2 = new Form2();
f2.f1 = T1;-----把T1方法传递给form2窗体的f1变量
f2.ffff = this;----- 把窗体1this对象传递给form2变量
f2.Show();
}
在form2中

4.csv和表格的转换
cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace _03csv和表格的转换
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
//dataGridView1.DataSource = 集合
//DataTable 表格数据 分为列和行,需要给列添加数据,也需要给行添加数据
//DataTable dt = new DataTable();
//dt.Columns; // 列的集合
//dt.NewRow();//创建一个新行
//dataGridView1.DataSource = dt;
}
//读取csv
private void button1_Click(object sender, EventArgs e)
{
//CSVAPI c = new CSVAPI();
//c.DuQu(dataGridView1);
DataTable dt = new DataTable();// 创建一个表格数据
OpenFileDialog ofd = new OpenFileDialog();
if (ofd.ShowDialog() == DialogResult.OK)
{
//获取文件路径进行读取 ofd.FileName
FileStream fs = new FileStream(ofd.FileName, FileMode.Open, FileAccess.Read);
StreamReader sr = new StreamReader(fs, Encoding.Default);
string data; // 读取的数据
string[] lines; // 使用逗号分割之后的数组
bool isHead = true;//是否是表头数据
//data=sr.ReadLine() 一行一行去读取
//sr.ReadToEnd(); 读取完
while ((data = sr.ReadLine()) != null) // 证明有数据
{
//MessageBox.Show(data); //姓名,年龄,性别
lines = data.Split(',');//["姓名","年龄","性别"]
if (isHead)//如果是表头的
{
for (int i = 0; i < lines.Length; i++)
{
dt.Columns.Add(lines[i]); //给列添加数据
}
isHead = false; // 处理完表头之后把isHead=false
}
else //不是表头数据 ["张三",10,"男"]
{
DataRow dataRow = dt.NewRow();//创建行 多个单元格 给每一个单元格赋值
for (int i = 0; i < lines.Length; i++)
{
// dataRow[i] 给每一个单元格赋值
dataRow[i] = lines[i];
}
dt.Rows.Add(dataRow); //添加到dt的Rows属性
}
}
//DataTable类型的数据 需要Columns 、Rows 赋值
dataGridView1.DataSource = dt; //绑定数据源
}
}
//写入csv
private void button2_Click(object sender, EventArgs e)
{
//把dataGridView1表格展示的数据保存到csv
//怎么从dataGridView1控件把数据取出来 赋值给DataTable ,再把DataTable 写入csv
DataTable dt = new DataTable(); // 需要Columns 、Rows 赋值
//从dataGridView1.Columns所有的列取出列表题
for (int i = 0; i < dataGridView1.Columns.Count; i++)
{
dt.Columns.Add(dataGridView1.Columns[i].HeaderText);// 把控件的列的标题取出来赋值给datatable的列中
}
// MessageBox.Show(string.Join(",", dt.Columns[1])+""); Columns 已经存储了列表题
//MessageBox.Show(dataGridView1.Rows.Count + "");
//给dt的Rows赋值 add(DataRow)
for (int i = 0; i < dataGridView1.Rows.Count; i++) //遍历控件的行数
{
DataRow dr = dt.NewRow(); //dr 每一个单元格赋值,取出每一个控件单元格值
for (int j = 0; j < dataGridView1.Columns.Count; j++)
{
////dataGridView1[j, i].Value 访问第j列 第i行的单元格
dr[j] = dataGridView1[j, i].Value;
// MessageBox.Show(dataGridView1[j, i].Value.ToString());
}
dt.Rows.Add(dr);
}
//以上完成给DatatTable 类型填充数据了 开始写入csv
SaveFileDialog dialog = new SaveFileDialog(); //保存对话框
dialog.Filter = "CSV文件(*.csv)|*.csv|CSV文件(*.txt) |*.txt"; //过滤属性
if (dialog.ShowDialog()==DialogResult.OK)
{
FileStream fs = new FileStream(dialog.FileName, FileMode.Create, FileAccess.Write);
StreamWriter sr = new StreamWriter(fs, Encoding.Default);
string data = "";//写入字符串
//分表头写入
for (int i = 0; i < dt.Columns.Count; i++)
{
data += dt.Columns[i].ColumnName;
if (i< dt.Columns.Count -1) //需要拼接逗号
{
data += ",";
}
}
sr.WriteLine(data);
data = null;// 防止重复写入
for (int i = 0; i < dt.Rows.Count-1; i++) //从DataTable数据里面去取单元格数据
{
for (int j = 0; j < dt.Columns.Count; j++)
{
data += dt.Rows[i][j];//dt.Rows[i] 第几行 ,dt.Rows[i][j] 第几行d第几个格子
if (j< dt.Columns.Count-1)
{
data += ",";
}
}
sr.WriteLine(data);
data = null;
}
sr.Close();
fs.Close();
}
}
}
}
DataTable dt = new DataTable();
dataGridView1.DataSource = dt;
1 datagridview 控件的常用属性
dataGridView1.Columns 表格控件的所有列
dataGridView1.Columns .Count 表格控件的所有列的个数
dataGridView1.Rows 表格控件的所有行
dataGridView1[0,0] 根据几行几列取出表格数据
dataGridView1.Columns[i].HeaderTex 表格控件的列的文本内容
2 dataTable常用的属性和方法
DataTable dt = new DataTable(); 创建dataTable类型
DataRow row = dt.NewRow(); 创建一行
dt.Rows.Add(row); 向dataTable添加一行
dt.Columns.Add(); 向dataTable添加一列
dt.Columns datatable所有的列
dt.Rows datatable所有的行
dt.Columns[i].ColumnName;列标题