Datagrid Paging ๊ตฌํ˜„ ์งˆ๋ฌธ

์•ˆ๋…•ํ•˜์„ธ์š” Datagrid์— ๋‚ด๊ฐ€ ์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋™์ ์œผ๋กœ ๋ฟŒ๋ฆฌ๋Š”๊ฒƒ ๊นŒ์ง€๋Š” ํ–ˆ๋Š”๋ฐ์š”,
ํ•ด๋‹น ๋ฐ์ดํ„ฐ๊ฐ€ ๋งŽ์•„์ง€๋ฉด ์Šคํฌ๋กค ๋ฌดํ•œ์ •ํ•˜๋Š”๊ฒƒ๋„ ๊ทธ๋ ‡๊ณ ํ•ด์„œ ํŽ˜์ด์ง• ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๋ ค๋Š”๋ฐ
๋ญ”๊ฐ€ ์ฐพ์•„๋ด๋„ ์ด๊ฑฐ๋‹ค ์‹ถ์€ ๋‚ด์šฉ์ด ์—†์–ด์„œ ์งˆ๋ฌธ์˜ฌ๋ ค๋ด…๋‹ˆ๋‹ค.

datagrid์— ๋ฟŒ๋ฆด ๋ฐ์ดํ„ฐ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ ์–ธํ–ˆ์Šต๋‹ˆ๋‹ค.

ObservableCollection<ReportDataSource> datas = new ObservableCollection<ReportDataSource>();

ReportDataSource ํด๋ž˜์Šค๋Š” ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

public class ReportDataSource
{
        public string SubId { get; set; }
        public string CTag { get; set; }
        public string AddTag { get; set; }
        public int ClickCount { get; set; }
        public int BuyCount { get; set; }
        public int TotalAmount { get; set; }
        public int Profit { get; set; }
        public double ClickPerProfit { get; set; }
        public double ConversionRate { get; set; }
}

DataGrid๋Š” ์ด๋ ‡๊ฒŒ ๋งŒ๋“ค์–ด ๋†จ์Šต๋‹ˆ๋‹ค.

<DataGrid Grid.Row="3" Margin="-10,10,10,0" Style="{DynamicResource DataGridStyle1}" CellStyle="{DynamicResource DataGridCellStyle1}" ColumnHeaderStyle="{DynamicResource DataGridColumnHeaderStyle1}" RowStyle="{DynamicResource DataGridRowStyle1}" x:Name="reportDataGrid">
    <DataGrid.Columns>
        <DataGridCheckBoxColumn CanUserResize="False" Width="auto" ElementStyle="{StaticResource CheckBoxStyle1}" >
            <DataGridCheckBoxColumn.HeaderTemplate>
                <DataTemplate>
                    <CheckBox/>
                </DataTemplate>
            </DataGridCheckBoxColumn.HeaderTemplate>
        </DataGridCheckBoxColumn>

        <DataGridTextColumn Header="์ฑ„๋„ID" IsReadOnly="True" Width="*" Binding="{Binding SubId}"/>
        <DataGridTextColumn Header="ํŽ˜์ด์ง€ ํ‚ค" IsReadOnly="False" Width="*" Binding="{Binding CTag}"/>
        <DataGridTextColumn Header="ํŽ˜์ด์ง€ ํƒ€์ž…" IsReadOnly="True" Width="*" Binding="{Binding AddTag}"/>
        <DataGridTextColumn Header="ํด๋ฆญ์ˆ˜" IsReadOnly="True" Width="*" TextBlock.TextAlignment="Center" Binding="{Binding ClickCount}"/>
        <DataGridTextColumn Header="๊ตฌ๋งค๊ฑด์ˆ˜" IsReadOnly="True" Width="*" TextBlock.TextAlignment="Center" Binding="{Binding BuyCount}"/>
        <DataGridTextColumn Header="์ด ๊ตฌ๋งค๊ธˆ์•ก" IsReadOnly="True" Width="*" TextBlock.TextAlignment="Center" Binding="{Binding TotalAmount}"/>
        <DataGridTextColumn Header="์ˆ˜์ต" IsReadOnly="True" Width="*" TextBlock.TextAlignment="Center" Binding="{Binding Profit}"/>
        <DataGridTextColumn Header="ํด๋ฆญ๋‹น ์ˆ˜์ต" IsReadOnly="True" Width="*" TextBlock.TextAlignment="Center" Binding="{Binding ClickPerProfit, StringFormat={}{0:0.##}}"/>
        <DataGridTextColumn Header="์ „ํ™˜์œจ" IsReadOnly="True" Width="*" TextBlock.TextAlignment="Center" Binding="{Binding ConversionRate, StringFormat={}{0:0.##}%}"/>
    </DataGrid.Columns>
</DataGrid>

Paiging ๊ป๋ฐ๊ธฐ๋„ ๋งŒ๋“ค์–ด๋Š” ๋†จ์Šต๋‹ˆ๋‹คโ€ฆ

<Border Grid.Row="4" HorizontalAlignment="Right" BorderBrush="#dee4ec" BorderThickness="1"
                        CornerRadius="5" Padding="5" Background="White" Margin="0 10 10 10">
    <StackPanel Orientation="Horizontal">
        <Button Style="{StaticResource pagingButton}">
            <Icon:PackIconMaterial Kind="ChevronLeft" Style="{StaticResource pagingButtonIcon}"/>
        </Button>

        <Rectangle Width="1" Fill="#dee4ec" Margin="3 7" />

        <Button Style="{StaticResource pagingButton}" Content="1"/>
        <Button Style="{StaticResource pagingButton}" Content="2" Background="#7950f2" Foreground="#ffffff"/>
        <Button Style="{StaticResource pagingButton}" Content="3"/>

        <TextBlock Text="..." Foreground="#6c7682" VerticalAlignment="Center" FontSize="15" Margin="10 0"/>
        <Button Style="{StaticResource pagingButton}" Content="7"/>
        <Button Style="{StaticResource pagingButton}" Content="8"/>
        <Button Style="{StaticResource pagingButton}" Content="9"/>

        <Rectangle Width="1" Fill="#dee4ec" Margin="3 7" />

        <Button Style="{StaticResource pagingButton}">
            <Icon:PackIconMaterial Kind="ChevronRight" Style="{StaticResource pagingButtonIcon}"/>
        </Button>

    </StackPanel>
</Border>

์ € ํŽ˜์ด์ง•๋ฒ„ํŠผ ๋งŒ๋“ค์–ด๋†“์€ ๊ณณ์— ํŽ˜์ด์ง•๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๊ณ ์‹ถ๊ณ , ํ•ด๋‹น ๋ฐ์ดํ„ฐ๊ทธ๋ฆฌ๋“œ๊ฐ€ ๊ธฐ๋ณธ์ ์œผ๋กœ ํ—ค๋”ํด๋ฆญ์œผ๋กœ ์ •๋ ฌ์ด ๋˜๋Š”๋ฐ ๊ทธ ๊ธฐ๋Šฅ๋„ ์œ ์ง€ํ•˜๊ณ ์‹ถ์Šต๋‹ˆ๋‹ค. ์–ด๋–ป๊ฒŒ ๋งŒ๋“œ๋Š”๊ฒŒ ์ข‹์„ ์ง€ ์กฐ์–ธ์ข€ ๊ตฌํ•ด๋ด…๋‹ˆ๋‹คโ€ฆ

์ฐธ๊ณ ๋กœ ์•„๋ž˜ ์˜์ƒ์„ ๋ณด๊ณ  ๊ป๋ฐ๊ธฐ๋ฅผ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค.

1๊ฐœ์˜ ์ข‹์•„์š”

๋‘๊ฐœ์˜ ์˜ต์ €๋ฒ„์ปฌ๋ ‰์…˜์„ ๋งŒ๋“œ์‹œ๊ณ 
ํ•˜๋‚˜๋Š” ๊ณ ์œ  ๋ฐ์ดํ„ฐ
ํ•˜๋‚˜๋Š” ์กฐ๊ฑด์— ์˜ํ•œ ๋ฐ์ดํ„ฐ ๊ตฌ์„ฑํ•˜์‹œ๊ณ 

linq์˜ ์Šคํ‚ต๊ณผ take๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ

์กฐ๊ฑด์— ์˜ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ตฌ์„ฑํ•˜์…”๋„ ์ข‹์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค

1๊ฐœ์˜ ์ข‹์•„์š”

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! ํ•ด๋‹นํ‚ค์›Œ๋“œ๋กœ ์ฐพ์•„๋ณด๊ณ  ํ•ด๋ณด๊ฒŸ์Šต๋‹ˆ๋‹ค

๋ฐ์ดํ„ฐ์˜ ํŽ˜์ด์ง• ์ฒ˜๋ฆฌ๋ฅผ ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ์ฒ˜๋ฆฌ ํ•˜์‹ค๊ฑด์ง€๋ฅผ ๋จผ์ € ์ •ํ•˜์…”์•ผ ํ•ฉ๋‹ˆ๋‹ค.
ํฌ๊ฒŒ

  1. ๋กœ์ปฌ ๋ฉ”๋ชจ๋ฆฌ ๋ฐฉ์‹
  2. ์„œ๋ฒ„(DB)์—์„œ ํŽ˜์ด์ง• ์ฒ˜๋ฆฌ

1๋ฒˆ ๋ฐฉ์‹์œผ๋กœ ํ•˜์‹ ๋‹ค๋ฉด ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค ๋ถˆ๋Ÿฌ์™€์„œ ํŽ˜์ด์ง•์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋‚˜๋ˆ„์–ด์„œ ๋ณด์—ฌ์งˆ๋ฟ ๋ฉ”๋ชจ๋ฆฌ ๊ด€์ ์—์„  ํŽ˜์ด์ง•์€ ์•„๋‹™๋‹ˆ๋‹ค. ๋˜ํ•œ ํŽ˜์ด์ง• ๋ ๋•Œ ๋ฐ์ดํ„ฐ๋ฅผ ์–ธ์ œ ์ƒˆ๋กœ ๊ฐฑ์‹ ํ• ์ง€ ์‹œ์ ๋„ ๊ณ ๋ ค๋ฅผ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

1๋ฒˆ ๋ฐฉ์‹ ๊ตฌํ˜„์€ @์ด๊ด‘์„ ๋‹˜ ๋‹ต๋ณ€ ๋‚ด์šฉ์ฒ˜๋Ÿผ
LINQ๋กœ ํ˜„์žฌ ํŽ˜์ด์ง€ * ๋ณด์—ฌ์งˆ ๋ฐ์ดํ„ฐ ๊ฐฏ์ˆ˜ ๋งŒํผ Skip() ๋ฉ”์„œ๋“œ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ฌ ์‹œ์ž‘์ ์„ ๊ณ„์‚ฐํ•˜๊ณ  ๋ณด์—ฌ์งˆ ๋ฐ์ดํ„ฐ ๊ฐฏ์ˆ˜ ๋งŒํผ Take() ๋ฉ”์„œ๋“œ๋กœ ํŽ˜์ด์ง• ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๋ฉด ์‰ฝ๊ฒŒ ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ ํ•ฉ๋‹ˆ๋‹ค.


2๋ฒˆ ๋ฐฉ์‹ ๊ตฌํ˜„์€ ํด๋ผ์ด์–ธํŠธ ์ž…์žฅ์—์„  ๋”ฑํžˆ ์ฒ˜๋ฆฌํ•  ๊ฒƒ์€ ์—†์Šต๋‹ˆ๋‹ค.
์ง€๊ธˆ ์ฒ˜๋Ÿผ ๋ฐ์ดํ„ฐ๋ฅผ ๋ถˆ๋Ÿฌ์˜ฌ๋•Œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜์น˜๋ฅผ ์„œ๋ฒ„์— ์š”์ฒญํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ๋กœ๋“œ ์‹œ์ผœ์ฃผ๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.
์„œ๋ฒ„์ธก์—์„œ๋Š” DB์—์„œ ํŽ˜์ด์ง• ์ฟผ๋ฆฌ๋กœ ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๋˜์ง€ WebAPI ์„œ๋ฒ„๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ํ•ด๋‹น ๊ด€๋ จ ๊ธฐ์ˆ (ORM ๋“ฑ๋“ฑ)๋กœ ํŽ˜์ด์ง• ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๋Š” api๋ฅผ ๋…ธ์ถœ ํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

2๊ฐœ์˜ ์ข‹์•„์š”

๊ตฌํ˜„์€ 1๋ฒˆ๋ฐฉ์‹๋Œ€๋กœ ํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์„œ๋ฒ„๋‚˜ DB๊นŒ์ง€ ํ•„์š”ํ•œ ํ”„๋กœ๊ทธ๋žจ๋„ ์•„๋‹ˆ๊ณ  ํด๋ผ์ด์–ธํŠธ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐ์ž‘ํ•ด๋„ ๋ฌด๋ฐฉํ•œ ์ˆ˜์ค€์œผ๋กœ ์ƒ๊ฐ๋˜์„œ์š”

๋ฐ์ดํ„ฐ ๊ฐฑ์‹ ์‹œ์ ์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ตœ์ดˆ์— ๋ถˆ๋Ÿฌ์™”์„ ๋•Œ, ํ•„ํ„ฐ์กฐ๊ฑด์„ ํ†ตํ•ด ๋ฐ์ดํ„ฐ ์ •๋ ฌ์ด ๋ณ€๊ฒฝ๋  ๋•Œ, ๋ฐ์ดํ„ฐ๊ทธ๋ฆฌ๋“œ์˜ ํ—ค๋“œ์ปฌ๋Ÿผ์„ ํด๋ฆญํ•˜๋ฉด์„œ ์ •๋ ฌ์ด ๋ณ€๊ฒฝ๋  ๋•Œ ๋ง๊ณ  ๋˜ ๊ณ ๋ คํ•ด์•ผํ•  ์‹œ์ ์ด ์žˆ์„๊นŒ์š”??

1๊ฐœ์˜ ์ข‹์•„์š”

์—ฌ๋Ÿฌ ์‚ฌ๋žŒ(?)์ด ์ด์šฉ ๋˜๋Š” ์„œ๋ฒ„์—์„œ ๋ฐ›์•„ ์˜ค๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์•„๋‹Œ
๊ทธ๋ƒฅ ๋กœ์ปฌ ๋ฐ์ดํ„ฐ๋ผ๋ฉด ๊ฐฑ์‹  ์‹œ์ ์€ ๋”ฑํžˆ ๊ณ ๋ คํ• ๊ฑด ์—†์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

1๊ฐœ์˜ ์ข‹์•„์š”