首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C# DataTable 綁定 DataGridView 列錯位與 CSV 讀取亂碼完整解決方案

     編輯:程式設計綜合問答

問題一:DataGridView 列錯位——資料跑到現有列後方

原因:DataGridView.AutoGenerateColumns = true (預設) 會根據 DataTable 結構自動產生列,若設計時已手動加入同名列,資料會綁定到自動產生的新列,導致出現重複列。

解決方法

  1. 停用自動產生列:
    dataGridView1.AutoGenerateColumns = false;
  2. 在設計介面或程式碼中預先定義列,並設定 DataPropertyName 對應 DataTable 欄位名:
    // 設計器操作:右鍵 DataGridView → Edit Columns → Add → 設定 HeaderText、Name、DataPropertyName
    // 程式碼範例:
    var col = new DataGridViewTextBoxColumn {
        HeaderText = "測試1", Name = "colTest1", DataPropertyName = "test1"
    };
    dataGridView1.Columns.Add(col);
  3. 再指派資料源:
    dataGridView1.DataSource = dt;

問題二:OleDb 讀取 CSV 出現亂碼

根因:Microsoft.Jet.OLEDB.4.0 舊驅動程式預設使用系統 ANSI 代碼頁 (繁中環境為 CP950),無法正確解讀 UTF-8 編碼的 CSV。

解決方案

  1. 優先改用 TextFieldParser / CsvHelper (無驅動相依、支援 UTF-8 BOM、效能更好):
    using (var parser = new Microsoft.VisualBasic.FileIO.TextFieldParser(@"D:\data.csv", System.Text.Encoding.UTF8)) {
        parser.TextFieldType = FieldType.Delimited;
        parser.SetDelimiters(",");
        while (!parser.EndOfData) {
            string[] fields = parser.ReadFields();
            dt.Rows.Add(fields);
        }
    }
  2. 必須用 OleDb 時:安裝 Microsoft Access Database Engine 2016+ (64-bit),連接字串指定 Extended Properties="Text;HDR=Yes;FMT=Delimited;IMEX=1;CharacterSet=65001" (65001 = UTF-8)。
    string connStr = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=D:\;Extended Properties='Text;HDR=Yes;FMT=Delimited;IMEX=1;CharacterSet=65001'";
  3. Schema.ini 輔助:在 CSV 同目錄建立 schema.ini 強制指定編碼:
    [data.csv]
    ColNameHeader=True
    Format=CSVDelimited
    CharacterSet=65001

完整範例:CSV → DataTable → DataGridView

private void LoadCsvToGrid(string filePath) {
    var dt = new DataTable();
    using (var parser = new Microsoft.VisualBasic.FileIO.TextFieldParser(filePath, Encoding.UTF8)) {
        parser.TextFieldType = FieldType.Delimited;
        parser.SetDelimiters(",");
        // 讀標題列建立欄位
        string[] headers = parser.ReadFields();
        foreach (var h in headers) dt.Columns.Add(h);
        while (!parser.EndOfData) dt.Rows.Add(parser.ReadFields());
    }
    dataGridView1.AutoGenerateColumns = false;
    // 若列未預建,這裡動態建立並綁定 DataPropertyName
    if (dataGridView1.Columns.Count == 0) {
        foreach (DataColumn dc in dt.Columns) {
            dataGridView1.Columns.Add(new DataGridViewTextBoxColumn {
                HeaderText = dc.ColumnName, DataPropertyName = dc.ColumnName, Name = "col_" + dc.ColumnName
            });
        }
    }
    dataGridView1.DataSource = dt;
}

圖示說明

DataGridView列錯位截圖
CSV檔案格式截圖
設定DataPropertyName動畫示範

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved