datagirdview列名乱码

datagirdview导入csv文件,列名不可以有中文吗


```c#
// 指定CSV文件的路径  
            string csvFile = @"C:\VS-WorkSpace\Makkee\Properties\用户.csv";

            // 创建一个DataTable对象  
            DataTable dt = new DataTable();

            // 使用StreamReader读取CSV文件的内容  
            using (StreamReader reader = new StreamReader(csvFile))
            {
                // 第一行做标题
                string headline = reader.ReadLine();
                string[] headvalues = headline.Split(',');
                for (int i = 0; i < headvalues.Length; i++)
                {
                    dt.Columns.Add(headvalues[i]);
                }

                // 逐行读取CSV文件,将每行数据添加到DataTable对象中  
                while (!reader.EndOfStream)
                {
                    string line = reader.ReadLine();
                    string[] values = line.Split(',');
                    DataRow row = dt.NewRow();
                    //按逗号拆分后的每一行数据,顺序写入表格
                    for (int i = 0; i < values.Length; i++)
                    {
                        row[i] = values[i];
                    }
                    //把每一行数据添加到表格
                    dt.Rows.Add(row);
                }

            }
            //把数据绑定到表格
            dataGridView1.DataSource = dt;

img


运行就这样,求解

using (StreamReader reader = new StreamReader(csvFile, Encoding.UTF8))
假设是 utf8,如果不是,你再试试别的编码

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 这篇文章讲的很详细,请看:<VB.net>下CSV文件的导入(读取到DataGridView)和导出(DataGirdView保存到csv)
  • 以下回答由chatgpt基于相关博客总结生成:

    问题:如何解决DataGridView列名乱码问题?

    解决方案: 在读取CSV文件之前,可以使用StreamReader的Encoding属性指定正确的编码格式来解决列名乱码问题。以下是详细的解决步骤:

    1. 判断CSV文件的编码格式:可以使用EncodingDetector类来判断CSV文件的编码格式,具体代码如下:
    using System.Text;
    using Ude;
    
    // 判断CSV文件的编码格式
    private static Encoding GetCSVFileEncoding(string csvFile)
    {
        // 第一个参数是数据流的buffer大小,默认为1024,可按需修改
        // 第二个参数是字符识别的可信度,默认值为0.99,可按需修改
        CharsetDetector cdet = new CharsetDetector();
        byte[] buffer = new byte[1024];
        using (FileStream fs = new FileStream(csvFile, FileMode.Open))
        {
            int bytesRead;
            while ((bytesRead = fs.Read(buffer, 0, buffer.Length)) > 0 &&
                   !cdet.Done())
            {
                cdet.Feed(buffer, 0, bytesRead);
            }
            cdet.DataEnd();
        }
    
        if (cdet.Charset != null)
        {
            return Encoding.GetEncoding(cdet.Charset);
        }
        else
        {
            // 默认返回UTF8编码
            return Encoding.UTF8;
        }
    }
    
    1. 使用正确的编码格式读取CSV文件:在代码中调用GetCSVFileEncoding方法获取CSV文件的编码格式,并在StreamReader的构造函数中指定正确的编码格式,代码如下:
    // 指定CSV文件的路径
    string csvFile = @"C:\VS-WorkSpace\Makkee\Properties\用户.csv";
    
    // 创建一个DataTable对象
    DataTable dt = new DataTable();
    
    // 使用StreamReader读取CSV文件的内容
    Encoding encoding = GetCSVFileEncoding(csvFile);
    using (StreamReader reader = new StreamReader(csvFile, encoding))
    {
        // 以下代码保持不变
    }
    
    1. 将列名编码为正确的字符串格式:由于CSV文件的编码格式可能与系统默认的编码格式不同,因此在解析列名之前,需要将列名转换为正确的字符串格式。可以通过将列名从字节数组编码为字符串来实现。修改dt.Columns.Add(headvalues[i]);的代码如下:
    // 将列名编码为正确的字符串格式
    string columnName = encoding.GetString(Encoding.Default.GetBytes(headvalues[i]));
    dt.Columns.Add(columnName);
    

    完整的代码如下:

    // 指定CSV文件的路径
    string csvFile = @"C:\VS-WorkSpace\Makkee\Properties\用户.csv";
    
    // 创建一个DataTable对象
    DataTable dt = new DataTable();
    
    // 使用StreamReader读取CSV文件的内容
    Encoding encoding = GetCSVFileEncoding(csvFile);
    using (StreamReader reader = new StreamReader(csvFile, encoding))
    {
        // 第一行做标题
        string headline = reader.ReadLine();
        string[] headvalues = headline.Split(',');
        for (int i = 0; i < headvalues.Length; i++)
        {
            // 将列名编码为正确的字符串格式
            string columnName = encoding.GetString(Encoding.Default.GetBytes(headvalues[i]));
            dt.Columns.Add(columnName);
        }
    
        // 逐行读取CSV文件,将每行数据添加到DataTable对象中
        while (!reader.EndOfStream)
        {
            string line = reader.ReadLine();
            string[] values = line.Split(',');
            DataRow row = dt.NewRow();
            // 按逗号拆分后的每一行数据,顺序写入表格
            for (int i = 0; i < values.Length; i++)
            {
                row[i] = values[i];
            }
            // 把每一行数据添加到表格
            dt.Rows.Add(row);
        }
    }
    
    // 把数据绑定到DataGridView
    dataGridView1.DataSource = dt;
    

    通过以上方法,可以解决DataGridView列名乱码问题。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^