Search code examples
c#blazorcsvhelper

Pass Type from parent component to a child user control in Blazor


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


Solution

  • 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);
                }
         }