WPF显示SQLITE数据(四)--分页显示

  目前使用的WPF CORE做的BOSS网站数据显示,是在DataGrid中一次性显示数据,这样如果数据量大了,会对系统有一定压力,所以一般需要分页进行显示,显示中我参考了网上的一些已由控件,加入我的程序中,达到了分页效果。

  因为目前.net 5已经整合了.net core 3和.net Framework的功能,所以估计以后的趋势WPF也会都使用net core类库了,但是在开发使用中,发现目前的WPF CORE中无法添加WPF窗体和控件,经过多次试验,可以修改项目的.csproj文件,将<Project Sdk="Microsoft.NET.Sdk">改为<Project Sdk="Microsoft.NET.Sdk.WindowsDesktop">,然后直接添加一个已经写好的xaml分页控件(网上下载的,如果自己开发,又需要许多时间),控件代码如下:

       

 1 <UserControl x:Class="WpfApp1.DataGridPage"
 2              xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
 3              xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
 4              xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
 5              xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
 6              mc:Ignorable="d"  Background="Transparent">
 7     <UserControl.Resources>
 8         <!--每页{0}/共{0}条-->
 9         <Style x:Key="PageTextBlock1" TargetType="{x:Type TextBlock}">
10             <Setter Property="VerticalAlignment" Value="Center" />
11             <Setter Property="HorizontalAlignment" Value="Left" />
12             <Setter Property="FontSize" Value="13" />
13             <Setter Property="FontWeight" Value="Bold" />
14         </Style>
15         <!--首页上一页等-->
16         <Style x:Key="PageTextBlock2" TargetType="{x:Type TextBlock}">
17             <Setter Property="VerticalAlignment" Value="Center" />
18             <Setter Property="HorizontalAlignment" Value="Left" />
19             <Setter Property="Margin" Value="0,10,0,0" />
20             <Setter Property="Width" Value="40" />
21             <Setter Property="Height" Value="23" />
22             <Setter Property="FontSize" Value="13" />
23             <Setter Property="Cursor" Value="Hand" />
24             <Style.Triggers>
25                 <Trigger Property="IsMouseOver" Value="True">
26                     <Setter Property="Foreground" Value="#FF000000" />
27                     <Setter Property="FontWeight" Value="Bold" />
28                 </Trigger>
29             </Style.Triggers>
30         </Style>
31 
32     </UserControl.Resources>
33     <Grid>
34         <Border CornerRadius="3" Background="Transparent" BorderBrush="#01544A" BorderThickness="1">
35             <Grid HorizontalAlignment="Stretch" Margin="5 0 1 0" VerticalAlignment="Top" Width="Auto" Height="25">
36                 <Grid.ColumnDefinitions>
37                     <ColumnDefinition Width="100"/>
38                     <ColumnDefinition Width="300*" MinWidth="300"/>
39                 </Grid.ColumnDefinitions>
40                 <TextBlock Name="tbkRecords" Grid.Column="0" Style="{StaticResource PageTextBlock1}" Foreground="#01544A" Visibility="Visible" />
41                 <StackPanel Orientation="Horizontal" HorizontalAlignment="Right" Grid.Column="1">
42                     <Grid>
43                         <Grid.RowDefinitions >
44                             <RowDefinition Height="30"></RowDefinition>
45                         </Grid.RowDefinitions>
46                         <Grid.ColumnDefinitions>
47                             <ColumnDefinition Width="50"/>
48                             <ColumnDefinition Width="50"/>
49                             <ColumnDefinition Width="120*"/>
50                             <ColumnDefinition Width="50"/>
51                             <ColumnDefinition Width="30"/>
52                         </Grid.ColumnDefinitions>
53                         <TextBlock Grid.Column="0" Name="btnFirst" Text="  首页" IsEnabled="False" Style="{StaticResource PageTextBlock2}" MouseDown="btnFirst_MouseDown"/>
54                         <TextBlock Grid.Column="1" Name="btnPrev" Text="上一页" IsEnabled="False" Style="{StaticResource PageTextBlock2}" MouseDown="btnPrev_MouseDown" />
55                         <Grid Grid.Column="2" Name="grid" Visibility="Visible" >
56                             <TextBlock Text="第"    Style="{StaticResource PageTextBlock2}" Width="15" HorizontalAlignment="Left" VerticalAlignment="Bottom" Margin="0"></TextBlock>
57                             <TextBox Width="30" Name="page" HorizontalAlignment="Left" VerticalAlignment="Center" Margin="20,0,0,0"></TextBox>
58                             <TextBlock HorizontalAlignment="Left" Width="60" VerticalAlignment="Bottom" Name="countPage" Text="页/共页"  Style="{StaticResource PageTextBlock2}" Margin="55,0,0,0"></TextBlock>
59                             <Button Name="btnGO" Content="GO"  Width="25" Height="20"  VerticalAlignment="Center" Margin="115,0,10,0" Click="btnGO_Click"></Button>
60                         </Grid>
61                         <TextBlock  Grid.Column="3" Name="btnNext" Text="下一页" IsEnabled="False" Style="{StaticResource PageTextBlock2}"  MouseDown="btnNext_MouseDown" Height="22" Margin="0,8,0,0"  />
62                         <TextBlock  Grid.Column="4" Name="btnLast" Text="末页" IsEnabled="False" Style="{StaticResource PageTextBlock2}" MouseDown="btnLast_MouseDown"/>
63                         
64                     </Grid>
65                 </StackPanel>
66             </Grid>
67         </Border>
68     </Grid>
69 </UserControl>

主窗体的调用代码为:

  1 using System.Data.SQLite;
  2 using System.IO;
  3 using System;
  4 using System.Windows;
  5 using System.Windows.Input;
  6 using System.Windows.Media;
  7 using System.Windows.Media.Imaging;
  8 using System.Windows.Navigation;
  9 using System.Windows.Shapes;
 10 using System.Windows.Controls;
 11 using System.Diagnostics;
 12 using System.Data;
 13 
 14 namespace WpfApp1
 15 {
 16     /// <summary>
 17     /// Interaction logic for MainWindow.xaml
 18     /// </summary>
 19     public partial class MainWindow : Window
 20     {
 21         public MainWindow()
 22         {
 23             InitializeComponent();
 24         }
 25 
 26         // 数据库文件夹
 27         static string DbPath = @"E:\mycsample\Boss\bin\x64\Debug\net5.0-windows";
 28         System.Data.DataTable Dt = new System.Data.DataTable();
 29 
 30         //与指定的数据库(实际上就是一个文件)建立连接
 31         private static SQLiteConnection CreateDatabaseConnection(string dbName = null)
 32         {
 33             if (!string.IsNullOrEmpty(DbPath) && !Directory.Exists(DbPath))
 34                 Directory.CreateDirectory(DbPath);
 35             dbName = dbName == null ? "mytest.db" : dbName;
 36             var dbFilePath = System.IO.Path.Combine(DbPath, dbName);
 37             return new SQLiteConnection("DataSource = " + dbFilePath+"; Pooling = true; FailIfMissing = false");
 38         }
 39 
 40         // 使用全局静态变量保存连接
 41         private static SQLiteConnection connection = CreateDatabaseConnection();
 42 
 43         // 判断连接是否处于打开状态
 44         private static void Open(SQLiteConnection connection)
 45         {
 46             if (connection.State != System.Data.ConnectionState.Open)
 47             {
 48                 connection.Open();
 49             }
 50         }
 51 
 52         public static void ExecuteNonQuery(string sql)
 53         {
 54             // 确保连接打开
 55             Open(connection);
 56             using (var tr = connection.BeginTransaction())
 57             {
 58                 using (var command = connection.CreateCommand())
 59                 {
 60                     command.CommandText = sql;
 61                     command.ExecuteNonQuery();
 62                 }
 63                 tr.Commit();
 64             }
 65         }
 66 
 67         public static SQLiteDataReader ExecuteQuery(string sql)
 68         {
 69             // 确保连接打开
 70             Open(connection);
 71             using (var tr = connection.BeginTransaction())
 72             {
 73                 using (var command = connection.CreateCommand())
 74                 {
 75                     command.CommandText = sql;
 76                     // 执行查询会返回一个SQLiteDataReader对象
 77                     var reader = command.ExecuteReader();
 78                     tr.Commit();
 79                     return reader;
 80                     //reader.Read()方法会从读出一行匹配的数据到reader中。注意:是一行数据。
 81                     //while (reader.Read())
 82                     //{
 83                     //    // 有一系列的Get方法,方法的参数是列数。意思是获取第n列的数据,转成Type返回。
 84                     //    // 比如这里的语句,意思就是:获取第0列的数据,转成int值返回。
 85                     //    var time = reader.GetInt64(0);
 86                     //}
 87                 }
 88                 //tr.Commit();
 89             }
 90         }
 91 
 92         private static void DeleteDatabase(string dbName)
 93         {
 94             var path = System.IO.Path.Combine(DbPath, dbName);
 95             connection.Close();
 96 
 97             // 置空,手动GC,并等待GC完成后执行文件删除。
 98             connection = null;
 99             GC.Collect();
100             GC.WaitForPendingFinalizers();
101             File.Delete(path);
102         }
103 
104         private void Hyperlink_Click(object sender, RoutedEventArgs e)
105         {
106             System.Windows.Documents.Hyperlink link = (System.Windows.Documents.Hyperlink)e.OriginalSource;
107             //Process.Start("IEXPLORE.EXE",link.NavigateUri.AbsoluteUri);
108             string url = link.NavigateUri.AbsoluteUri;
109             Process p = new Process();
110             p.StartInfo.FileName = "cmd.exe";
111             p.StartInfo.UseShellExecute = false;    //不使用shell启动
112             p.StartInfo.RedirectStandardInput = true;//喊cmd接受标准输入
113             p.StartInfo.RedirectStandardOutput = false;//不想听cmd讲话所以不要他输出
114             p.StartInfo.RedirectStandardError = true;//重定向标准错误输出
115             p.StartInfo.CreateNoWindow = true;//不显示窗口
116             p.Start();
117 
118             //向cmd窗口发送输入信息 后面的&exit告诉cmd运行好之后就退出
119             p.StandardInput.WriteLine("start " + url + "&exit");
120             p.StandardInput.AutoFlush = true;
121             p.WaitForExit();//等待程序执行完退出进程
122             p.Close();
123         }
124 
125         private void button_Click(object sender, RoutedEventArgs e)
126         {
127             SQLiteDataReader sr = ExecuteQuery("select id,title,url from one_level order by id");
128             if (sr != null)
129             {                
130                 Dt.Load(sr);
131                 gridpage.ShowPages(dataGrid, Dt, 10);                
132                 //dataGrid.ItemsSource = Dt.DefaultView;
133             }
134         }
135 
136         private void dataGrid_LoadingRow(object sender, DataGridRowEventArgs e)
137         {
138             e.Row.Header = e.Row.GetIndex() + 1;
139         }
140 
141         private void dataGrid_UnLoadingRow(object sender, DataGridRowEventArgs e)
142         {
143             dataGrid_LoadingRow(sender, e);
144             if (dataGrid.Items != null)
145             {
146                 for (int i = 0; i < dataGrid.Items.Count; i++)
147                 {
148                     try
149                     {
150                         DataGridRow row = dataGrid.ItemContainerGenerator.ContainerFromIndex(i) as DataGridRow;
151                         if (row != null)
152                         {
153                             row.Header = (i + 1).ToString();
154                         }
155                     }
156                     catch { }
157                 }
158             }
159         }
160 
161         private void Window_Loaded(object sender, RoutedEventArgs e)
162         {
163             //dataGrid.LoadingRow += new EventHandler<DataGridRowEventArgs>(dataGrid_LoadingRow);
164             //dataGrid.UnloadingRow += new EventHandler<DataGridRowEventArgs>(dataGrid_UnLoadingRow);
165         }
166     }
167 }

最后可以看到分页后的效果。

上一篇:DataGrid控件实现验证


下一篇:EasyUI之datagrid与查询