c# 项目常用技巧

萌新一枚,后期会定期持续更新,大家有什么好的项目技巧可以一起分享,一起进步,欢迎一切有建设性的建议!!

项目场景1:

背景:
在日常项目中,很多时候某些参数可能会时常需要改变,一般情况下,在没有用数据库或者设计出可修改的显示界面,一般推荐使用配置文档供给现场人员修改的方式:


代码演示:构建ini配置文件的方式

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Runtime.InteropServices;
using System.IO;
namespace FileConfig
{
    public class ConfigHelp
    {
       
        //设置配置文件路径
        public string Path { get ; set; }
        /// <summary>
        /// 修改INI文件中内容
        /// </summary>
        /// <param name="section">在其中写入的节点(文件名)名称</param>
        /// <param name="key">设置的项名</param>
        /// <param name="val">要写入的新字符串</param>
        /// <param name="filePath">INI文件完整路径</param>
        /// <returns>非零表示成功,零表示失败</returns>
       [DllImport("kernel32")]
        private static extern long WritePrivateProfileString(string section, string key, string val, string filePath);
        
        /// <summary>
        /// 为INI文件中指定的节点取得字符串
        /// </summary>
        /// <param name="section">在其中查找关键字的节点名称</param>
        /// <param name="key">获取的项名</param>
        /// <param name="def">指定的项没有找到时返回的默认值</param>
        /// <param name="retVal">指定一个字串缓冲区,长度至少为nSize</param>
        /// <param name="size">指定装载到lpReturnedString缓冲区的最大字符数量</param>
        /// <param name="filePath">INI文件完整路径</param>
        /// <returns>复制到lpReturnedString缓冲区的字节数量,其中不包括那些NULL中止字符</returns>
        /// <returns></returns>
        [DllImport("kernel32")]
        private static extern int GetPrivateProfileString(string section, string key, string def, StringBuilder retVal, int size, string filePath);
        /// <summary>
        /// 导入文件路径
        /// </summary>
        /// <param name="path"></param>
        public ConfigHelp(string path)
        {
            Path = path;
        }
        public ConfigHelp() { }

        /// <summary>
        /// 在指定的路径设置INI配置文件
        /// </summary>保存格式:键=值 : A=20
        /// <param name="Section">文件名</param>
        /// <param name="key">键,如A</param>
        /// <param name="Value">值,如20</param>
        public void ISetValue(string Section, string key, string Value)
        {
            WritePrivateProfileString(Section, key, Value, this.Path);
        }
        /// <summary>
        /// 在指定路径上的INI读取内容
        /// </summary>
        /// <param name="Section">文件名</param>
        /// <param name="key">键名</param>
        /// <returns></returns>
        public string IGetValue(string Section,string key)
        {
            //预存值开辟的字符串空间大小
            StringBuilder temp = new StringBuilder(1024);
            int i = GetPrivateProfileString(Section, key, "", temp, 1024, this.Path);
            return temp.ToString();
        }
        /// <summary>
        /// 验证文件是否存在
        /// </summary>
        /// <returns></returns>
        public bool ExistINIFile()
        {
            return File.Exists(Path);
        }
    }
}

代码演示:构建json配置文件的方式

PS:需要引用这两个命名空间
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;

//构建存储Json配置文件的路径
string path
//构建存储
private List<JsonOne> record = new List<Json>();

//写入操作
public void Write(string Name,string Port) {
  //添加对象数据进入对象数组
  record.add(new JsonOne(Name,Port));
  JsonOne[] j =  record.ToArray();
  File.WriteAllText(path, JsonConvert.SerializeObject(j));
}

//读取操作
public void Read() {
  string json = File.ReadAllText(path);
  JArray ja = JArray.Parse(json);
  foreach(JObject jo in ja)
  {
     //返回存储的对象信息
     JsonOne js = new JsonOne(jo["Address"].ToString(), jo["Port"].ToString());
     //record.Add(js);
  }
}

class JsonOne
    {
        private string address;
        private string port;

        public string Address { get => address; set => address = value; }
        public string Port { get => port; set => port = value; }

        public JsonOne(){}
        public JsonOne(string address, string port)
        {
            this.Address = address;
            this.port = port;
        }
    }

缺点分析:

以上ini配置文件方式可以能满足日常项目使用,但该方法只能用于短字符串的存储,对于很长的字符串存储就会报错,并且该方法不支持Linux平台
根据自己的选择也用使用Json文件的存储形式


解决方案:

后期有好的方法配置方法会更新,欢迎各位提供建议。



项目场景2:

有时候,当我们使用Winform中的DataTable组件时,会把数据表或者列表的内容显示在界面上,但获取的数据是动态的,有时候要将显示的数据保存到本地文件中,以报表的形式(Excel)存储起来


代码演示:

using Microsoft.Office.Interop.Excel;

public string check;
public DataBaseManager database

//导出方法
private void Export()
        {
            //保存文件对话框
            SaveFileDialog sfd = new SaveFileDialog();
            sfd.Filter = "Excel文件|*.xlsx|Word文件|*.docx";
            sfd.FilterIndex = 0;
            if (sfd.ShowDialog() == DialogResult.OK)
            {
                //将数据库中的数据导入到DataTable中
                System.Data.DataTable dt = database.datatableReader(check);
                //调用导出的方法
                ExportExcel(dt, sfd.FileName);
            }
        }

//导出为Excel表格模式
private void ExportExcel(System.Data.DataTable dt, string filepath)
        {
            //创建Excel应用程序类的一个实例,相当于从电脑开始菜单打开Excel
            ApplicationClass xlsxapp = new ApplicationClass();
            //新建一张Excel工作簿
            Workbook wbook = xlsxapp.Workbooks.Add(true);
            //第一个sheet页
            Worksheet wsheet = (Worksheet)wbook.Worksheets.get_Item(1);
            //将DataTable的列名显示在Excel表第一行
            for (int i = 0; i < dt.Columns.Count; i++)
            {
                //注意Excel表的行和列的索引都是从1开始的
                wsheet.Cells[1, i + 1] = dt.Columns[i].ColumnName;
            }
            //遍历DataTable,给Excel赋值
            for (int i = 0; i < dt.Rows.Count; i++)
            {
                for (int j = 0; j < dt.Columns.Count; j++)
                {
                    //从第二行第一列开始写入数据
                    wsheet.Cells[i + 2, j + 1] = dt.Rows[i][j];
                }
            }
            //保存文件
            wbook.SaveAs(filepath);
            MessageBox.Show("导出成功");
            //释放资源
            xlsxapp.Quit();
        }  
      }


public class DataBaseManager{
  //数据库读取数据转数据表
public DataTable datatableReader(string sql)
        {
            SqlDataReader Reader;
            DataTable list = new DataTable();
            if (Connected)
            {
                using (SqlConnection objConnection = new SqlConnection(Connection))
                {
                    using (SqlCommand sqlcmd = new SqlCommand(sql, objConnection))
                    {
                        try
                        {
                            objConnection.Open();
                        }
                        catch (Exception ex)
                        {
                            Console.WriteLine(ex.Message + " @" + this.GetType().FullName + "- SqlServerReader");
                        }

                        try
                        {
                            Reader = sqlcmd.ExecuteReader();
                            list.Load(Reader);
                        }
                        catch (Exception ex)
                        {
                            Console.WriteLine(ex.Message + " @" + this.GetType().FullName + "- SqlServerReader");
                        }
                    }
                }
            }
            return list;
        }
}


缺点分析:

暂且未知


解决方案:

后期有好的导出方法会更新,欢迎各位提供建议。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值