4-28下午

private CsvFileHandler csvFileHandler; csvFileHandler = new CsvFileHandler(); // 创建 CsvFileHandler 实例 这两句什么意思

在类里面声明一个变量 csvFileHandler,它的类型是 CsvFileHandler
但是这时候,只是声明了还没有真正创建对象,它是 null 的,啥也没有。

创建一个 CsvFileHandler 类的新对象,并把它放到刚刚那个变量里。

new CsvFileHandler() 会在内存里创建一个新的 CsvFileHandler 实例(真正的对象),然后赋值给刚才的 csvFileHandler

所以,这一步是真正让 csvFileHandler 可以用了

 WinForms 程序就拥有了非常清晰的 CSV 文件操作功能:

  • 打开csv

  • 加载显示到 DataGridView

  • 编辑

  • 保存到新文件!

如果你希望将文件路径与特定类的实例绑定(例如,如果有多个类实例需要独立的文件路径),你可以在类中定义一个实例变量来存储文件路径。

public class CsvFileHandler
{
    // 实例变量存储文件路径
    public string CsvFilePath { get; set; }

    public CsvFileHandler(string filePath)
    {
        CsvFilePath = filePath;
    }

    // 示例方法:打开文件选择对话框
    public void OpenCsvFileDialog()
    {
        OpenFileDialog openFileDialog = new OpenFileDialog();
        openFileDialog.Filter = "CSV文件 (*.csv)|*.csv|所有文件 (*.*)|*.*"; // 设置文件过滤器

        if (openFileDialog.ShowDialog() == DialogResult.OK)
        {
            CsvFilePath = openFileDialog.FileName; // 将选择的文件路径存储到实例变量
            MessageBox.Show("选择的文件路径:" + CsvFilePath);
        }
    }
}

使用

private void buttonOpen_Click(object sender, EventArgs e)
{
    CsvFileHandler csvHandler = new CsvFileHandler(string.Empty);
    csvHandler.OpenCsvFileDialog();

    // 使用实例中的文件路径
    MessageBox.Show("文件路径:" + csvHandler.CsvFilePath);
}

:如果希望每个对象都有独立的文件路径(例如,每个 CsvFileHandler 实例管理自己的文件路径),则可以使用实例变量。

更新文件功能:1 打开文件选择对话框并返回用户选择的CSV文件路径2、

using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using static System.Windows.Forms.VisualStyles.VisualStyleElement;

namespace WinFormsApp1
{
    public class CsvFileHandler
    {
        // 实例变量存储文件路径
        public string CsvFilePath { get; set; }

        public CsvFileHandler(string path = "")
        {
            CsvFilePath = path;
        }
        /// <summary>
        /// 打开文件选择对话框并返回用户选择的CSV文件路径
        /// </summary>
        /// <returns>用户选择的文件路径</returns>
        public string OpenCsvFileDialog()
        {
            // 创建 OpenFileDialog 实例
            OpenFileDialog openFileDialog = new OpenFileDialog
            {
                // 设置默认文件类型过滤器
                Filter = "CSV文件 (*.csv)|*.csv|所有文件 (*.*)|*.*"
            };
            // 显示文件选择对话框并检查用户是否选择了文件
            if (openFileDialog.ShowDialog() == DialogResult.OK)
            {
                CsvFilePath = openFileDialog.FileName; // 自动更新对象内部的filePath
                return CsvFilePath; //返回用户选择的文件路径
            }
            return string.Empty;// 如果未选择文件,返回空字符串
        }
        /// <summary>
        /// 打开保存文件对话框,让用户选择保存CSV的位置
        /// </summary>
        /// <param name="defaultFileName">默认文件名</param>
        /// <returns>用户选择保存的路径,否则返回空</returns>
        public string SaveCsvFileDialog(string defaultFileName = "newfile.csv")
        {
            SaveFileDialog saveFileDialog = new SaveFileDialog
            {
                Filter = "CSV文件 (*.csv)|*.csv|所有文件 (*.*)|*.*",
                FileName = defaultFileName
            };

            if (saveFileDialog.ShowDialog() == DialogResult.OK)
            {
                CsvFilePath = saveFileDialog.FileName;
                return CsvFilePath;
            }

            return string.Empty;
        }
        /// <summary>
        /// 将DataTable保存为CSV文件
        /// </summary>
        /// <param name="dt">需要保存的数据</param>
        /// <param name="filePath">保存文件的路径</param>
        public void SaveDataTableToCsv(DataTable dt)
        {
            //判断路径是否为空
            if(string.IsNullOrEmpty(CsvFilePath))
                return;
            StringBuilder sb = new StringBuilder();

            // 添加列标题
            string[] columnNames = new string[dt.Columns.Count];
            for (int i = 0; i < dt.Columns.Count; i++)
            {
                columnNames[i] = dt.Columns[i].ColumnName;
            }
            sb.AppendLine(string.Join(",", columnNames));

            // 添加数据行
            foreach (DataRow row in dt.Rows)
            {
                string[] fieldValues = new string[dt.Columns.Count];
                for (int i = 0; i < dt.Columns.Count; i++)
                {
                    fieldValues[i] = row[i].ToString();
                }
                sb.AppendLine(string.Join(",", fieldValues));
            }

            // 将数据写入文件
            File.WriteAllText(CsvFilePath, sb.ToString(), Encoding.UTF8);
        }

        /// <summary>
        /// 从csv文件加载到datetable
        /// </summary>
        /// <returns>datatable对象</returns>
        public DataTable LoadCsvToDataTable()
        {
            DataTable dataTable = new DataTable();
            if(string.IsNullOrEmpty(CsvFilePath) ||!File.Exists(CsvFilePath))
                return dataTable;

            using (StreamReader sr = new StreamReader(CsvFilePath))
            {
                bool isHeader = true;//是否为标题
                string line;

                // 逐行读取CSV文件
                while ((line = sr.ReadLine()) != null)
                {
                    string[] values = line.Split(',');

                    // 如果是第一行,设置列头
                    if (isHeader)
                    {
                        foreach (var header in values)
                        {
                            dataTable.Columns.Add(header); // 添加列
                        }
                        isHeader = false;
                    }
                    else
                    {
                        dataTable.Rows.Add(values); // 添加数据行
                    }
                }
            }
            return dataTable;
        }
        /// <summary>
        /// 将TextBox内容追加到CSV文件作为新的一行
        /// </summary>
        /// <param name="textBox">包含要写入数据的TextBox控件</param>
        public void AppendTextBoxContentToCsv(RichTextBox textBox)
        {
            try
            {
                if (string.IsNullOrEmpty(CsvFilePath) || !File.Exists(CsvFilePath))
                    return;

                // 从 TextBox 中读取一行数据
                string newRow = textBox.Text.Trim();

                // 如果 TextBox 内容为空,则不追加
                if (string.IsNullOrEmpty(newRow))
                    return;

                // 将新的一行追加到 CSV 文件末尾
                using (StreamWriter sw = new StreamWriter(CsvFilePath, true, Encoding.UTF8))
                {
                    sw.WriteLine(newRow);
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("写入CSV失败: " + ex.Message);
            }
        }
    }
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值