【第25天】25c#今日小结

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;列标题

相关推荐
不如打代码KK1 天前
Springboot如何解决跨域问题?
java·spring boot·后端
豆沙沙包?1 天前
2026年--Lc330-394. 字符串解码(栈)--java版
java·开发语言
蓝程序1 天前
Spring AI学习 程序接入大模型
java·人工智能·spring
nice_lcj5201 天前
数据结构之树与二叉树:重点梳理与拓展
java·数据结构
毕设源码-钟学长1 天前
【开题答辩全过程】以 助学贷款管理系统为例,包含答辩的问题和答案
java
2501_941800881 天前
从微服务限流到系统稳定性的互联网工程语法实践与多语言探索
开发语言·python
亓才孓1 天前
任意大小的整数和任意精度的小数的API方法
java
清水白石0081 天前
《深度剖析 Pandas GroupBy:底层实现机制与性能瓶颈全景解析》
开发语言·python·numpy
2501_941875281 天前
从资源隔离到多租户安全的互联网工程语法构建与多语言实践分享
java·开发语言