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);
}
}
}
}
6732

被折叠的 条评论
为什么被折叠?



