原因:DataGridView.AutoGenerateColumns = true (預設) 會根據 DataTable 結構自動產生列,若設計時已手動加入同名列,資料會綁定到自動產生的新列,導致出現重複列。
dataGridView1.AutoGenerateColumns = false;
DataPropertyName 對應 DataTable 欄位名:// 設計器操作:右鍵 DataGridView → Edit Columns → Add → 設定 HeaderText、Name、DataPropertyName
// 程式碼範例:
var col = new DataGridViewTextBoxColumn {
HeaderText = "測試1", Name = "colTest1", DataPropertyName = "test1"
};
dataGridView1.Columns.Add(col);
dataGridView1.DataSource = dt;
根因:Microsoft.Jet.OLEDB.4.0 舊驅動程式預設使用系統 ANSI 代碼頁 (繁中環境為 CP950),無法正確解讀 UTF-8 編碼的 CSV。
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);
}
}
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'";
schema.ini 強制指定編碼:[data.csv]
ColNameHeader=True
Format=CSVDelimited
CharacterSet=65001
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;
}


