C#/Telerik

[Blazor] Telerik Grid에서 중첩 클래스(Nested Class) 사용하기

HYOKYE0NG 2021. 11. 26. 11:57
반응형

원래 코드는 Grid에 하나의 Class 데이터를 뿌리는 것이었다.

그래서 다음과 같이 간단하게 구현할 수 있었다.

<TelerikGrid Data="@GridData" TotalCount="@Total_Voption" OnRead="@ReadItems_Voption"
             Sortable="true"
             SortMode="@SortMode.Single"
             Pageable="true"
             PageSize="10"
             Width="1600px"
             ScrollMode="@GridScrollMode.Scrollable">
    <GridColumns>
        <GridColumn Field="@nameof(V_OPTION_CAD.REP_TYPE)" Title="Rep. Type" Lockable="true" Width="200px" />
        <GridColumn Field="@nameof(V_OPTION_CAD.ALT)" Title="Alt." Lockable="true" Width="100px" />
        <GridColumn Field="@nameof(V_OPTION_CAD.REV)" Title="Rev." Lockable="true" Width="100px" />
        <GridColumn Field="@nameof(V_OPTION_CAD.Status)" Title="Status" Lockable="true" Width="200px" />
    </GridColumns>
</TelerikGrid>

@code
{
	public List<W_CAD> SourceData { get; set; }
    public List<W_CAD> GridData { get; set; }
    public int Total { get; set; } = 0;
    
    protected async override void OnInitialized()
    {
        SourceData = await ObjectService.GetCadList(DCT_NO, ENV_NO);
    }
    
    protected void ReadItems(GridReadEventArgs args)
    {
        var datasourceResult = SourceData.ToDataSourceResult(args.Request);
        GridData = (datasourceResult.Data as IEnumerable<W_CAD>).ToList();
        Total = datasourceResult.Total;

        StateHasChanged();
    }
}

 

ObjectService의 GetCadList 메소드는 DB에서 조건에 알맞는 데이터를 가져오는 메소드이다.

이 메소드를 통해 데이터 리스트를 가져온다.

 

ReadItems 메소드는 데이터가 많아 페이지수가 많을 경우,

한 페이지에 보여지는 데이터만 로드하여 performance를 최적화하는 메소드이다.

 

현 페이지에서 보여질 데이터만 GridData라는 변수에 저장하고

이 변수를 가지고 Grid를 생성한다.

내 GridData는 List<V_OPTION_CAD> 형으로 지정되어 있다.

따라서 GridData를 바인딩한 후 V_OPTION_CAD의 데이터를 각 컬럼의 값으로 뿌린다.

 

 

이 시점에서 돌발상황!!

첫번째 컬럼으로 INDEX NO를 추가해야 하는 상황이 생겼다.

V_OPTION_CAD는 db 모델로 이 클래스에 데이터를 추가할 수는 없다.

그래서 중첩 클래스를 사용하기로 했다.

 

CAD_INDEX라는 클래스 안에 기존의 V_OPTION_CAD 클래스는 내부 클래스(Nested Class)로 정의하고,

INDEX NO를 저장할 ROW_NUMBER 변수를 추가했다.

 

그리고 ReadItems 메소드에서 CAD_INDEX의 리스트인 Index_Option_List 변수에

V_OPTION_CAD 클래스의 데이터와 ROW_NUMBER 변수를 추가했고

Index_Option_List의 데이터를 GridData에 추가했다.

 

이 과정에서 가장 큰 문제는 Grid에 내부클래스의 값을 출력하는 것이었다.

원래는 "@nameof()"로 field값을 지정했는데

내부클래스의 값을 출력할 때는 nameof 없이 바로 [내부클래스.변수] 형식으로 사용해야 한다.

 

<TelerikGrid Data="@GridData" TotalCount="@Tota" OnRead="@ReadItems"
             Sortable="true"
             SortMode="@SortMode.Single"
             Pageable="true"
             PageSize="10"
             Width="1600px"
             ScrollMode="@GridScrollMode.Scrollable">
     <GridColumns>
        <GridColumn Field="@nameof(CAD_INDEX.ROW_NUMBER)" Title="#" Lockable="true" Width="50px" />
        <GridColumn Field="CAD.REP_TYPE" Title="REP. Type" Lockable="true" Width="200px" />
        <GridColumn Field="CAD.ALT" Title="Alt." Lockable="true" Width="100px" />
        <GridColumn Field="CAD.REV" Title="Rev." Lockable="true" Width="100px" />
        <GridColumn Field="CAD.Status" Title="Status" Lockable="true" Width="200px" />
    </GridColumns>
</TelerikGrid>

@code
{
	public List<W_CAD> SourceData { get; set; }
    public List<W_CAD> GridData { get; set; }
    public int Total { get; set; } = 0;
    public List<CAD_INDEX> Index_Option_List = new List<CAD_INDEX>();
    
	protected async override void OnInitialized()
    {
        SourceData = await ObjectService.GetCadList(DCT_NO, ENV_NO);
    }
    
    protected void ReadItems(GridReadEventArgs args)
    {
        var datasourceResult = SourceData.ToDataSourceResult(args.Request);

        List<V_OPTION_CAD> iteratableData = datasourceResult.Data.Cast<V_EG_CAD>().ToList();
        for(int i = 0; i < iteratableData.Count; i++)
        {
            Index_EG_List.Add(
                new CAD_INDEX
                {
                    CAD = iteratableData[i],
                    ROW_NUMBER = i + 1
                });
        }
        datasourceResult.Data = Index_Option_List;

        GridData = (datasourceResult.Data as IEnumerable<CAD_INDEX>).ToList();
        Total = datasourceResult.Total;

        StateHasChanged();
    }
        
    public class CAD_INDEX
	{
	    public V_OPTION_CAD CAD { get; set; }
     	public int ROW_NUMBER { get; set; }
   	}
}

 

 

 

<Reference>

 

GitHub - telerik/blazor-docs: Public Documentation for Telerik UI for Blazor components.

Public Documentation for Telerik UI for Blazor components. - GitHub - telerik/blazor-docs: Public Documentation for Telerik UI for Blazor components.

github.com

 

반응형