WPF 学生成绩管理工具开发笔记(3)—使用TreeView生成班级树形列表

这篇博客详细记录了如何在WPF应用中开发学生成绩管理工具,通过TreeView组件创建班级的树形列表。内容包括TreeView的显示效果,编码逻辑的示意图,以及关键代码实现,如班级类的定义,ViewModel与前端XAML的绑定,数据获取及Selected Item变化处理。

目录

 一、TreeView 树形列表效果

二、编码关系示意图

三、主要编码


一、TreeView 树形列表效果

二、编码关系示意图

 

三、主要编码

  • 定义班级类
using ScoreTools.ViewModels;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Collections.ObjectModel;

namespace ScoreTools.Models
{
    /// <summary>
    /// 班级对象,每个班级对象中包含班级名称和一个班级学生成绩集合
    /// </summary>
    public class Grade : NotifycationBase
    {
        private string _GradeName;
        public string GradeName
        {
            get { return this._GradeName; }
            set
            {
                this._GradeName = value;
                RaisePropertyChanged(() => GradeName);
            }
        }

        private ObservableCollection<StudentSCore> _Scores;
        public ObservableCollection<StudentSCore> GradeChildScores
        {
            get { return this._Scores; }
            set
            {
                this._Scores = value;
                RaisePropertyChanged(() => GradeChildScores);
            }
        }

        public Grade(string gradeName,ObservableCollection<StudentSCore> gradeChildScores)
        {
            this.GradeName = gradeName;
            this.GradeChildScores = gradeChildScores;
        }

    }
}
  • ViewModel(GradesList集合和前端面xaml绑定)

        private ObservableCollection<StudentSCore> _Stulist = new ObservableCollection<StudentSCore>();
        public ObservableCollection<StudentSCore> Stulist
        {
            get { return this._Stulist; }
            set
            {
                this._Stulist = value;
                RaisePropertyChanged(() => Stulist);
            }
        }


        private ObservableCollection<Grade> _GradesList;
        public ObservableCollection<Grade> GradesList//和前端面xaml绑定
        {
            get { return this._GradesList; }
            set
            {
                this._GradesList = value;
                RaisePropertyChanged(() => GradesList);
            }
        }
  • GradesList数据获取
 public ObservableCollection<Grade> GetGradesAndScores()
 {
     SQLiteConnection conn=new SQLiteConnection(SqliteHelper.connStr);
     SQLiteCommand cmd = conn.CreateCommand();
     cmd.CommandText = "Select distinct 班级 from ScoresInfo  order by cast(substr(班级,4,LENGTH(班级)-3)  as int)";   //列具有唯一值

     SQLiteDataAdapter adapter = new SQLiteDataAdapter(cmd);
     DataSet ds = new DataSet();
     adapter.Fill(ds, "gradeTable");

     cmd.CommandText= "Select * from ScoresInfo";
     adapter.Fill(ds, "ScoresTable");

     //为上面创建的两张表之间建立关系  
     DataColumn parentColumn = ds.Tables["gradeTable"].Columns["班级"];   //得到父表中要用于关系的列
     DataColumn childColumn = ds.Tables["ScoresTable"].Columns["班级"];   //得到子表中要用于关系的列
     DataRelation relation = new DataRelation("xxx", parentColumn, childColumn);//新建关系,括号中的参数分别是(约束名,父表字段,子表字段)
     ds.Relations.Add(relation);//将约束关系添加

     ObservableCollection<Grade> grades = new ObservableCollection<Grade>();
     foreach (DataRow gradeRow in ds.Tables["gradeTable"].Rows)
     {
         ObservableCollection<StudentSCore> sCores = new ObservableCollection<StudentSCore>();
         foreach (DataRow scoreRow in gradeRow.GetChildRows(relation))  //gradeRow.GetChildRows(relation)
         {
             StudentSCore stu = CreateStudentUnit(scoreRow);
             sCores.Add(stu);
         }
         grades.Add(new Grade(gradeRow["班级"].ToString(), sCores));
     }
     return grades;
 }
  • xaml前端代码
        <TextBlock Grid.Row="0" Margin="15,0,5,0" HorizontalAlignment="Left" 
                   Text="{Binding Path=GradesList.Count,Mode=OneWay, StringFormat=班级列表  ({0}个)}"/>

        <TreeView  x:Name="gradeTree" Grid.Row="1" Grid.RowSpan="2"  Margin="1,0,5,0" 
                   ItemsSource="{Binding GradesList}" Width="180"
                   VirtualizingPanel.IsVirtualizing="True"  
                   VirtualizingPanel.VirtualizationMode="Recycling" 
                   SelectedItemChanged="TreeView_SelectedItemChanged" >
                 
            <TreeView.ItemTemplate>
                <HierarchicalDataTemplate ItemsSource="{Binding GradeChildScores}">
                    <StackPanel Margin="0 0 0 0" Orientation="Horizontal">
                        <TextBlock Text="{Binding GradeName}"  />
                        <TextBlock Text="{Binding GradeChildScores.Count, StringFormat= ' ({0}名)'}"  />
                    </StackPanel>
                    <HierarchicalDataTemplate.ItemTemplate>
                        <DataTemplate>
                            <TextBlock Text="{Binding 姓名}"/>
                        </DataTemplate>
                    </HierarchicalDataTemplate.ItemTemplate>
                </HierarchicalDataTemplate>
            </TreeView.ItemTemplate>
        </TreeView>
  • SelectedItemChanged

 SchoolWindowViewModel viewModel;

private void TreeView_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
{
    //每次选择前取得视图
    view = (ListCollectionView)CollectionViewSource.GetDefaultView(viewModel.Stulist);
    if (gradeTree.SelectedValue is Grade)
    {
        Grade grade = (Grade)gradeTree.SelectedValue;
        string filterWord = grade.GradeName;
        StuFilter filter;
        if (view != null)
        {
            filter = new StuFilter(filterWord);
            view.Filter = new Predicate<object>(filter.FilterItemByClass);
            view.Refresh();
        }
    }
    else
    {
        StudentSCore student = (StudentSCore)gradeTree.SelectedValue;
        string filterWord = student.姓名;
        StuFilter filter;
        if (view != null)
        {
            filter = new StuFilter(filterWord);
            view.Filter = new Predicate<object>(filter.FilterItemByName);
            view.Refresh();
        }
    }
}

实践是最好的老师!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值