WPF之 DataGrid分頁


接着上一篇WPF之 DataGrid數據綁定,繼續講述WPF中DataGrid分頁。

由於分頁經常用到,就做了一個自定義控件,由於當時的局限性,只支持DataTable數據源,不過木關系,網上很多其他數據類型轉換成DataTable的方法,下面我提供一種List轉換成DataTable的方法:

/// <summary>
       /// 將List轉換成DataTable
       /// </summary>
       /// <typeparam name="T"></typeparam>
       /// <param name="data"></param>
       /// <returns></returns>
       public static DataTable ToDataTable<T>(this IList<T> data)
           {
           PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(typeof(T));
           DataTable dt = new DataTable();
           for (int i = 0; i < properties.Count; i++)
               {
               PropertyDescriptor property = properties[i];
               dt.Columns.Add(property.Name, property.PropertyType);
               }
           object[] values = new object[properties.Count];
           foreach (T item in data)
               {
               for (int i = 0; i < values.Length; i++)
                   {
                   values[i] = properties[i].GetValue(item);
                   }
               dt.Rows.Add(values);
               }
           return dt;
           }

 廢話不多說,先上一個分頁的效果圖:

分頁布局代碼如下:

<Grid>
        <Border CornerRadius="3" Background="Transparent" BorderBrush="#01544A" BorderThickness="1">
            <Grid HorizontalAlignment="Stretch" Margin="5 0 1 0" VerticalAlignment="Top" Width="Auto" Height="25">
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="100"/>
                    <ColumnDefinition Width="300*" MinWidth="300"/>
                </Grid.ColumnDefinitions>
                <TextBlock Name="tbkRecords" Grid.Column="0" Style="{StaticResource PageTextBlock1}" Foreground="#01544A" Visibility="Visible" />
                <StackPanel Orientation="Horizontal" HorizontalAlignment="Right" Grid.Column="1">
                    <Grid>
                        <Grid.RowDefinitions >
                            <RowDefinition Height="30"></RowDefinition>
                        </Grid.RowDefinitions>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="50"/>
                            <ColumnDefinition Width="50"/>
                            <ColumnDefinition Width="120*"/>
                            <ColumnDefinition Width="50"/>
                            <ColumnDefinition Width="30"/>
                        </Grid.ColumnDefinitions>
                        <TextBlock Grid.Column="0" Name="btnFirst" Text="  首頁" IsEnabled="False" Style="{StaticResource PageTextBlock2}" MouseDown="btnFirst_MouseDown"/>
                        <TextBlock Grid.Column="1" Name="btnPrev" Text="上一頁" IsEnabled="False" Style="{StaticResource PageTextBlock2}" MouseDown="btnPrev_MouseDown" />
                        <Grid Grid.Column="2" Name="grid" Visibility="Visible" >
                            <TextBlock Text=""    Style="{StaticResource PageTextBlock2}" Width="15" HorizontalAlignment="Left" VerticalAlignment="Bottom" Margin="0"></TextBlock>
                            <TextBox Width="30" Name="page" HorizontalAlignment="Left" VerticalAlignment="Center" Margin="20,0,0,0"></TextBox>
                            <TextBlock HorizontalAlignment="Left" Width="60" VerticalAlignment="Bottom" Name="countPage" Text="頁/共頁"  Style="{StaticResource PageTextBlock2}" Margin="55,0,0,0"></TextBlock>
                            <Button Name="btnGO" Content="GO"  Width="25" Height="20"  VerticalAlignment="Center" Margin="115,0,10,0" Click="btnGO_Click"></Button>
                        </Grid>
                        <TextBlock  Grid.Column="3" Name="btnNext" Text="下一頁" IsEnabled="False" Style="{StaticResource PageTextBlock2}"  MouseDown="btnNext_MouseDown"  />
                        <TextBlock  Grid.Column="4" Name="btnLast" Text="未頁" IsEnabled="False" Style="{StaticResource PageTextBlock2}" MouseDown="btnLast_MouseDown"/>
                        
                    </Grid>
                </StackPanel>
            </Grid>
        </Border>
    </Grid>
View Code

后台分頁只是根據顯示的頁數和每頁多少條數據篩選出數據源中的數據綁定到DataGrid中:

  #region 畫數據
        /// <summary>
        /// 畫數據
        /// </summary>
        private void ReadDataTable()
        {
            try
            {
                page.Text = this.pIndex.ToString();
                countPage.Text = "頁/共" + MaxIndex + "";
                DataTable tmpTable = new DataTable();
                tmpTable = this._dt.Clone();
                int first = this.pageNum * (this.pIndex - 1);
                first = (first > 0) ? first : 0;
                //如何總數量大於每頁顯示數量
                if (this._dt.Rows.Count >= this.pageNum * this.pIndex)
                {
                    for (int i = first; i < pageNum * this.pIndex; i++)
                        tmpTable.ImportRow(this._dt.Rows[i]);
                }
                else
                {
                    for (int i = first; i < this._dt.Rows.Count; i++)
                        tmpTable.ImportRow(this._dt.Rows[i]);
                }
                this.grdList.ItemsSource = tmpTable.DefaultView;
                tmpTable.Dispose();
            }
            catch
            {
                MessageBox.Show("錯誤");
            }
            finally
            {
                DisplayPagingInfo();
            }

        }
        #endregion
View Code
 #region 初始化數據
        /// <summary>
        /// 初始化數據
        /// </summary>
        /// <param name="grd"></param>
        /// <param name="dtt"></param>
        /// <param name="Num"></param>
        public void ShowPages(DataGrid grd, DataTable dt, int Num)
        {
            if (dt == null || dt.Rows.Count == 0)
            {
                this.Visibility = Visibility.Hidden;
                return;
            }
            this._dt = dt.Clone();

            this.grdList = grd;
            this.pageNum = Num;
            this.pIndex = 1;
            foreach (DataRow r in dt.Rows)
                this._dt.ImportRow(r);
            SetMaxIndex();
            ReadDataTable();
        }
        #endregion
View Code

在使用時,直接寫在DataGrid下面:<my:DataGridPage x:Name="gridpage" VerticalAlignment="Bottom" Width="500"></my:DataGridPage>
后台在綁定DataGrid數據時直接使用: gridpage.ShowPages(grid1, Helper.ToDataTable(Prolist), 5);

OK,源碼分享一下,希望大家多多指教!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM