protected override async Task OnAfterRenderAsync(bool firstRender)
        {
            // If this is the first time we've finished rendering, then all the columns
            // have been added to the table so we'll go and get the data for the first time
            if (firstRender)
            {
                try
                {
                    if (AutoLoad)
                    {
                        await GetDataAsync().ConfigureAwait(true);

                        StateHasChanged();
                    }
                }
                catch (Exception ex)
                {
                    await HandleExceptionAsync(ex).ConfigureAwait(true);
                }
            }

            // focus first editor after edit mode begins
            if (BeginEditEvent.WaitOne(0) && Columns.Count > 0 && EditItem != null)
            {
                // find first editable column
                var key = string.Empty;
                foreach (var column in ActualColumnsToDisplay)
                {
                    var editable = column.Editable;
                    // override with dynamic config?
                    var config = ColumnsConfig?.Find(x => x.Id == column.Id);
                    if (config?.Editable ?? editable)
                    {
                        key = column.Id;
                        break;
                    }
                }
                var row = ItemsToDisplay.IndexOf(EditItem);
                if (key != string.Empty)
                {
                    await JSRuntime.InvokeVoidAsync("panoramicData.selectText", $"{IdEditPrefix}-{row}-{key}", _tableBeforeEditArgs !.SelectionStart, _tableBeforeEditArgs !.SelectionEnd).ConfigureAwait(true);

                    BeginEditEvent.Reset();
                }
            }
        }