快速分页wpf

html 复制代码
/*没有在xaml设置上下文window.context是因为 命名空间一直对应不上  所以在xaml.cs
里面绑定*/
<Window x:Class="DataGrid.views.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:DataGrid"
        xmlns:AutoGrid="clr-namespace:WpfAutoGrid"
        xmlns:viewmodels="clr-namespace:DataGrid.viewmodels"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">

    
    <Grid>
        <AutoGrid:AutoGrid ColumnCount="2" RowCount="2"  Rows="5*,*" Columns="*,*" HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
            <DataGrid Grid.ColumnSpan="2" ItemsSource="{Binding Itemsview}">
            </DataGrid>


            <TextBox HorizontalContentAlignment="Center" VerticalContentAlignment="Center" Text="{Binding Pagenum}" ></TextBox>
            <Button HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Command="{Binding NextPageCommand}">Next</Button>
            
        </AutoGrid:AutoGrid>
    </Grid>
</Window>

cs 复制代码
using Bogus;
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Controls;
using System.Windows.Data;
using Bogus;
using System.Collections.ObjectModel;

namespace DataGrid.viewmodels
{

    public class student   //类变量要是属性getset
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public double Score { get; set; }
    }

    public class StudentDataGenerator
    {
        public static ObservableCollection<student> GenerateStudents(int count)
        {
            var fakeStudents = new Faker<student>()
                .RuleFor(s => s.Id, f => f.IndexGlobal + 1)  // ID从1开始
                .RuleFor(s => s.Name, f => f.Name.FullName())    // 随机姓名
                .RuleFor(s => s.Score, f => f.Random.Double(0, 100)) // 0-100的随机分数
                .Generate(count);  // 生成指定数量的学生

            return new ObservableCollection<student>(fakeStudents);
        }
    }  /*bogus生成数据*/

    public partial class DataControl:ObservableObject /*这里一定要partial*/
    {

        private CollectionView _itemsview;
        private const int _pagesize = 10;
        private int _pagenum = 1;


        public CollectionView Itemsview { get { return _itemsview; } }
        public int Pagenum
        {
            get { return _pagenum; }
            set { SetProperty(ref _pagenum, value); Itemsview?.Refresh(); }
        }
        public int TotalPages => (int)Math.Ceiling(Students.Count / (double)_pagesize);
         [ObservableProperty]
        ObservableCollection<student> _students;


        [RelayCommand]
        public void NextPage()
        {
            if (_pagenum < TotalPages) // 如果还有下一页
            {
                Pagenum++;   //这里一定只能改属性  
                
            }
        }
        [RelayCommand]     //relaycommand生成的命令会在函数后面加上command
        public void PrevPage()
        {
            if (_pagenum > 1) // 如果不是第1页
            {
                Pagenum--;
                
            }
        }






//原理就是_itemsview匹配数据 过滤之后留下页码是1的内容 返回true的内容会被存入_itemsview


        public DataControl(ObservableCollection<student> stus) //有参构造函数传数据
        {
            this._students = stus;    //这里要用observablecollection 不能用enumerable
            _itemsview = (CollectionView)CollectionViewSource.GetDefaultView(this._students);
            _itemsview.Filter = (item) =>
            {
                var index = Students.IndexOf((student)item); int itemPage = (index / _pagesize) + 1;
                return itemPage == Pagenum; // 只显示当前页的数据;
            };
            
        }

    

       
    }

    
}

cs 复制代码
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using DataGrid.viewmodels;


namespace DataGrid.views
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {

            InitializeComponent();
            this.DataContext = new DataControl(StudentDataGenerator.GenerateStudents(36));

        }
    }
}

//xaml不好绑定viewmodel  就只能到cs里面绑定了  this.datacontext = new ........
//坏处就是xaml不会有提示

sqlsugar操作

cs 复制代码
using SqlSugar;
using System;

public static class IntDbHelper
{
    private static SqlSugarScope Connection => new SqlSugarScope(new ConnectionConfig()
    {
        ConnectionString = "Data Source=./data.db",
        DbType = DbType.Sqlite,
        IsAutoCloseConnection = true
    });

    // -------------------- 针对int值的操作 --------------------
    
    // 插入数据(返回新增的ID)
    public static int Insert(string tableName, Dictionary<string, object> values)
    {
        return Connection.Insertable(values).AS(tableName).ExecuteReturnIdentity();
    }

    // 查询数据(返回单个int值)
    public static int GetInt(string tableName, string field, int id)
    {
        return Connection.Queryable<dynamic>()
               .AS(tableName)
               .Where($"Id = {id}")
               .Select(field)
               .First();
    }

    // 更新数据(更新指定int字段)
    public static bool UpdateInt(string tableName, int id, string field, int newValue)
    {
        return Connection.Updateable<dynamic>()
               .AS(tableName)
               .SetColumns($"{field} = {newValue}")
               .Where($"Id = {id}")
               .ExecuteCommand() > 0;
    }

    // 删除数据(根据int ID)
    public static bool Delete(string tableName, int id)
    {
        return Connection.Deleteable<dynamic>()
               .AS(tableName)
               .Where($"Id = {id}")
               .ExecuteCommand() > 0;
    }
}

反射和linq也能分页

object myObject = new MyClass();

PropertyInfo propertyInfo = myObject.GetType().GetProperty("Name");

if (propertyInfo != null)

{

object value = propertyInfo.GetValue(myObject);

Console.WriteLine($"属性值: {value}");

}

1建议一次只拿一个对象的属性 对象列表用循环多次读取

2GetValue是属性拿对应的值 所以要传对象

分析数据可以当参数传给后台

带参数的命令只支持object类型

linq里面只能OfType<student>() 不能强转

datagrid 返回的 selecteditems 是IList类型的

CollectionView 方式

  • 优点:自动处理分页,删除后自动回填
  • 缺点:需要调用 Refresh() 刷新视图

会自动回填

linq加反射则不会自动回填

相关推荐
zlinear数据采集卡4 小时前
数据采集卡从入门到精通(9):分辨率与精度——16位卡不等于1/65536的精度
开发语言·数据库·fpga开发·开源·c#
深澈Vincel7 小时前
我用 C# + WebView2 做了一个针对“流氓软件”的“一键清理工具“:架构实践与踩坑记录
c#
zlinear数据采集卡8 小时前
数据采集卡从入门到精通(7):流水线型ADC——级级接力,高速与高精的平衡术
开发语言·arm开发·嵌入式硬件·fpga开发·c#
阿部多瑞 ABU9 小时前
告别手工核图:基于 .NET + MuPDFCore 的 CAD 等轴测 PDF 材料表提取与新旧版本对比实战
后端·算法·ui·pdf·c#
条形码D10 小时前
DRG综合管理分析系统-目前已经支持CHS-DRG3.0
c#·drg·3.0分组器·drg分组器·chs-drg3.0分组器
Alex Gram1 天前
数据库同步工具PanguSync图文教程
java·mysql·postgresql·sqlserver·c#·数据库同步软件·数据库同步工具
头茬韭菜1 天前
第 10 篇:「Fluss 实战案例集」—— 完整解决方案与最佳实践
c#·linq·fluss
淡海水1 天前
01-05-运行时-JIT优化全景-内联去虚拟化边界检查消除
windows·c#·虚拟化·jit·内联·边界检查消除
波波0072 天前
C# 15 重磅新特性: 带标签 break 与 continue:重新定义嵌套循环控制流
服务器·前端·c#
wujian83112 天前
怎么用千问生成word文档:从「格式崩」到「一键过」,AI导出鸭打通最后半厘米
人工智能·ai·c#·word·豆包·deepseek·ai导出鸭