如何显示我的 csv 文件并在 gridview WPF 中编辑它
how to show my csv file and edit it in gridview WPF
我写了一个简单的 csv reader,它接收格式为 List 的数据。我需要在 wpf 中显示这些数据并进行编辑。我使用 mvvm。如果我就这么写,它不会做任何事情。
<DataGrid AutoGenerateColumns="True" ItemsSource="{Binding Table}"> </DataGrid>
我该怎么做?我是否有可能以某种方便的格式以 List 的形式输出和编辑数据。 csv table 可以有任意数量的列,所以我不能在代码中做任何特定的 class 。我试图在网上找到这个问题的答案,看了几个类似的项目,但一直没有弄明白。
假设我通过这种方式获取数据
var _fileName = @"F:\test.csv";
CsvWriter reader = new CsvWriter(_fileName);
foreach(var item in reader.Read())
{
Table.Add(item);
}
有一个库叫做 CSVReader。
它将任何 csv 文件转换为 DataTables
示例:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void OpenCSVButton_Click(object sender, RoutedEventArgs e)
{
DataTable dt = LoadCSVFileFromPath();
dataGrid.ItemsSource = dt.DefaultView;
//Simple method to convert DataTable to a List of strings
AddToList(dt);
}
private List<string> AddToList(DataTable table)
{
List<string> strTable = new List<string>();
foreach(DataRow rows in table.Rows)
{
foreach (DataColumn cols in table.Columns)
strTable.Add(rows[cols].ToString());
}
return strTable;
}
private DataTable LoadCSVFileFromPath()
{
//Use this method to convert your CSV file to DataTable
DataTable table = CSVReader.ReadCSVFile("FILEPATHGOESHERE", true);
return table;
}
}
您可以在 MVVM 中通过将 DataTable table
的 DefaultView
绑定到 DataGrid
来实现这一点
不要使用绑定。
XAML:
<DataGrid x:Name="dataGrid1" AutoGenerateColumns="True" />
读取CSV数据并将其转换为DataTable,并将其放入ItemsSource:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
LoadData();
}
DataTable GetDataTable(CsvReader csv)
{
var dt = new DataTable();
csv.Read();
csv.ReadHeader();
foreach (var header in csv.HeaderRecord)
dt.Columns.Add(header);
var cols = dt.Columns.Count;
while (csv.Read())
{
var row = dt.NewRow();
for (int i = 0; i < cols; i++)
row[i] = csv[i];
dt.Rows.Add(row);
}
return dt;
}
DataTable table;
string _fileName = @"F:\test.csv";
void LoadData()
{
using (var reader = new StreamReader(_fileName ))
using (var csvReader = new CsvReader(reader, new CsvConfiguration(CultureInfo.InvariantCulture) { Delimiter = "," }))
{
table = GetDataTable(csvReader);
table.AcceptChanges();
dataGrid1.ItemsSource = table.AsDataView();
}
}
void SaveData()
{
if (table.GetChanges() != null)
{
//write DataTable to csv...
}
}
}
我写了一个简单的 csv reader,它接收格式为 List
<DataGrid AutoGenerateColumns="True" ItemsSource="{Binding Table}"> </DataGrid>
我该怎么做?我是否有可能以某种方便的格式以 List
假设我通过这种方式获取数据
var _fileName = @"F:\test.csv";
CsvWriter reader = new CsvWriter(_fileName);
foreach(var item in reader.Read())
{
Table.Add(item);
}
有一个库叫做 CSVReader。 它将任何 csv 文件转换为 DataTables
示例:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void OpenCSVButton_Click(object sender, RoutedEventArgs e)
{
DataTable dt = LoadCSVFileFromPath();
dataGrid.ItemsSource = dt.DefaultView;
//Simple method to convert DataTable to a List of strings
AddToList(dt);
}
private List<string> AddToList(DataTable table)
{
List<string> strTable = new List<string>();
foreach(DataRow rows in table.Rows)
{
foreach (DataColumn cols in table.Columns)
strTable.Add(rows[cols].ToString());
}
return strTable;
}
private DataTable LoadCSVFileFromPath()
{
//Use this method to convert your CSV file to DataTable
DataTable table = CSVReader.ReadCSVFile("FILEPATHGOESHERE", true);
return table;
}
}
您可以在 MVVM 中通过将 DataTable table
的 DefaultView
绑定到 DataGrid
不要使用绑定。
XAML:
<DataGrid x:Name="dataGrid1" AutoGenerateColumns="True" />
读取CSV数据并将其转换为DataTable,并将其放入ItemsSource:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
LoadData();
}
DataTable GetDataTable(CsvReader csv)
{
var dt = new DataTable();
csv.Read();
csv.ReadHeader();
foreach (var header in csv.HeaderRecord)
dt.Columns.Add(header);
var cols = dt.Columns.Count;
while (csv.Read())
{
var row = dt.NewRow();
for (int i = 0; i < cols; i++)
row[i] = csv[i];
dt.Rows.Add(row);
}
return dt;
}
DataTable table;
string _fileName = @"F:\test.csv";
void LoadData()
{
using (var reader = new StreamReader(_fileName ))
using (var csvReader = new CsvReader(reader, new CsvConfiguration(CultureInfo.InvariantCulture) { Delimiter = "," }))
{
table = GetDataTable(csvReader);
table.AcceptChanges();
dataGrid1.ItemsSource = table.AsDataView();
}
}
void SaveData()
{
if (table.GetChanges() != null)
{
//write DataTable to csv...
}
}
}