如何显示我的 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 tableDefaultView 绑定到 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...
        }
    }

}