I'm creating a user control to import csv file 'using CsvHelper;',
Parent Component
<ImportCsv Id="importCsv" sizeAllowedInKB=@fileSize typeAllowed=@fileTypeAllowed csvRows=@csvRowsType name="Import csv" />
@code{
private Type csvRowsType = typeof(CsvRows);
// CsvRows will always be different as this component can be user across project
}
Child component
<InputFile id="@Id" OnChange="@LoadFiles" accept="@typeAllowed" class="button button-small" />
<span title="add" class="icon-plus"></span>@name
@code{
[Parameter] public string typeAllowed { get; set; }
[Parameter] public int sizeAllowedInKB { get; set; }
[Parameter] public Type csvRows { get; set; }
[Parameter] public string name { get; set; }
[Parameter] public string Id { get; set; }
private async Task LoadFiles(InputFileChangeEventArgs e)
{
try
{
using (Stream ms = new MemoryStream())
{
await e.File.OpenReadStream().CopyToAsync(ms);
ms.Seek(0, SeekOrigin.Begin);
using (StreamReader reader = new StreamReader(ms))
{
Console.WriteLine($"StreamReader {reader.ReadToEnd()}");
CsvReader csv = new CsvReader(reader, CultureInfo.InvariantCulture);
var csvReords = csv.GetRecords(Type.GetType(csvRows.FullName));
Console.WriteLine($"type of csvRows {csvRows} record count {csvReords.Count()} fullName {Type.GetType(csvRows.FullName)} ddd {csvRows.GetType()}");
Console.WriteLine($"Serialize {System.Text.Json.JsonSerializer.Serialize(csvReords)}");
};
}
}
catch (Exception ex)
{
Console.WriteLine("File: {Filename} Error: {Error}", e.File.Name, ex.Message);
}
}
}
}
Issue hear is I can see csv data on console
Console.WriteLine($"StreamReader {reader.ReadToEnd()}");
I can see type I'm passing from Parent
Console.WriteLine($"type of csvRows {csvRows} record count {csvReords.Count()} fullName {Type.GetType(csvRows.FullName)} ddd {csvRows.GetType()}");
but somehow
var csvReords = csv.GetRecords(Type.GetType(csvRows.FullName));
not returning anything, count is zero
Fixed this issue, commenting solution in case someone still looking for the same
Parent
<ImportCsv TValue=CsvRows Id="importCsv" sizeAllowedInKB=5 typeAllowed=".csv" name="Import Csv" csvData="ConsumeData" />
@Code
{
private void ConsumeData(List<CsvRows> csvData)
{
// Consume csv Data
}
}
Child
public partial class ImportCsv<TValue> : ComponentBase
{
[Parameter] public int sizeAllowedInKB { get; set; }
[Parameter] public string typeAllowed { get; set; } = ".csv";
[Parameter] public string name { get; set; } = "Import csv";
[Parameter] public string Id { get; set; } = "ImportCsv";
[Parameter] public EventCallback<List<TValue>> csvData { get; set; }
private async Task LoadFiles(InputFileChangeEventArgs e)
{
try
{
using (Stream ms = new MemoryStream())
{
await e.File.OpenReadStream().CopyToAsync(ms);
ms.Seek(0, SeekOrigin.Begin);
using (StreamReader reader = new StreamReader(ms))
{
CsvReader csv = new CsvReader(reader, CultureInfo.InvariantCulture);
var csvReords = csv.GetRecords<TValue>().ToList();
csvData.InvokeAsync(csvReords);
};
}
}
catch (Exception ex)
{
Console.WriteLine("File: {Filename} Error: {Error}", e.File.Name, ex.Message);
}
}