我无法通过 ListView(Xamarin.Forms) 显示员工的姓名、任务和日期

Posted

技术标签:

【中文标题】我无法通过 ListView(Xamarin.Forms) 显示员工的姓名、任务和日期【英文标题】:I could not display the employee's name, tasks, and date via the ListView(Xamarin.Forms) 【发布时间】:2021-12-25 18:10:33 【问题描述】:

我做了两张表,第一张存储员工的姓名,第二张存储职责和日期。 但我无法显示员工的姓名、分配给他的职责以及日期。 这是我的代码,希望你能帮助我。

public class MyTabels

    [Table("Employee")]
    public class Employee
    
        [PrimaryKey, AutoIncrement]
        public int Id  get; set; 

        public string Name  get; set; 
        public string LastName  get; set; 

        [OneToMany]
        public List<Duty> Duties  get; set; 
    


    [Table("Duties")]
    public class Duty
    

        [PrimaryKey, AutoIncrement]
        public int Id  get; set; 

        public string Description  get; set; 

        public DateTime Deadline  get; set; 

        [ForeignKey(typeof(Employee))]
        public int EmployeeId  get; set; 
    

这个 XAML 有一个 CollectionView,我在其中添加了项目:

<CollectionView x:Name="CV" IsGrouped="True">
            <CollectionView.HeaderTemplate>
                <DataTemplate>
                    <ViewCell>
                        <StackLayout>
                        <Label Text="Binding Name" FontSize="Large"/>
                        <Label Text="Binding LastName" FontSize="Large"/>
                        </StackLayout>
                    </ViewCell>
                </DataTemplate>
            </CollectionView.HeaderTemplate>
            <CollectionView.ItemTemplate>
                <DataTemplate>
                    <ViewCell>
                        <StackLayout>
                            <Label Text="Binding Description" FontSize="Medium"/>
                            <Label Text="Binding Deadline" FontSize="Medium"/>
                        </StackLayout>
                    </ViewCell>
                </DataTemplate>
            </CollectionView.ItemTemplate>
        </CollectionView>

这是我的代码:

var dbpath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "Mydb.db");
        var db = new SQLiteConnection(dbpath);
        db.CreateTable<Employee>();
        db.CreateTable<Duty>();
var employee = new Employee
        
            Name = "Andrew",
            LastName = "Programmer"
        ;
        db.Insert(employee);


        var duty1 = new Duty()
        
            Description = "Project A Management",
            Deadline = new DateTime(2017, 10, 31)
        ;

        var duty2 = new Duty()
        
            Description = "Reporting work time",
            Deadline = new DateTime(2022, 12, 31)
        ;

        db.Insert(duty1);
        db.Insert(duty2);

        employee.Duties = new List<Duty>  duty1, duty2 ;
        db.UpdateWithChildren(employee);

        var employeeStored = db.GetWithChildren<Employee>(employee.Id);

        CV.ItemsSource = employeeStored.Duties;

【问题讨论】:

1. CollectionView 不在模板中使用 Cell 类型。只有 ListView 使用它们。 2.您是否确认您正在从您的数据库查询中获取数据? 3.您使用的是Grouped CollectionView,但您的数据未格式化为分组。 4. var employeeStored - 如果您将鼠标悬停在“var”上(或更改为“显式类型”),显示的确切类型是什么? (它需要是某种集合类型 - 如果它只是“员工”,则不会工作。)。并验证employeeStored 是否包含您期望的值。 5. “这个我的代码:” - 它是如何被调用的?在构造函数期间,或出现时,或某些用户操作(例如在按钮单击中)? 【参考方案1】:

创建一个新类,将您从数据库中获取的数据转换为与 CollectionView ItemSource 匹配。

型号:

public class EmployeeList : List<Duty>

    public string Name  get; set; 
    public string LastName  get; set; 
    public EmployeeList(string name, string lastName, List<Duty> duties) : base(duties)
    
        Name = name;
        LastName = lastName;
    

用法:使用GetAllWithChildren将所有员工从数据库中获取到列表中。

       public partial class Page3 : ContentPage

    public List<EmployeeList> employeeStored  get; set;  = new List<EmployeeList>();

    public Page3()
    
        InitializeComponent();

        var dbpath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "Mydb.db");
        var db = new SQLiteConnection(dbpath);
        db.CreateTable<Employee>();
        db.CreateTable<Duty>();
        var employee = new Employee
        
            Name = "Andrew",
            LastName = "Programmer"
        ;
        db.Insert(employee);


        var duty1 = new Duty()
        
            Description = "Project A Management",
            Deadline = new DateTime(2017, 10, 31)
        ;

        var duty2 = new Duty()
        
            Description = "Reporting work time",
            Deadline = new DateTime(2022, 12, 31)
        ;

        db.Insert(duty1);
        db.Insert(duty2);

        employee.Duties = new List<Duty>  duty1, duty2 ;
        db.UpdateWithChildren(employee);

        //var employeeStored2 = db.GetWithChildren<Employee>(employee.Id);

        var employeeStored = db.GetAllWithChildren<Employee>();

        
        var list = Convert(employeeStored);
        CV.ItemsSource = list;
        this.BindingContext = this;

    
    public List<EmployeeList> Convert(List<Employee> employees)
    
        foreach (var item in employees)
        
            employeeStored.Add(new EmployeeList(item.Name, item.LastName, item.Duties));
        
        return employeeStored;

    



请注意,CollectionView 没有单元格的概念。所以在你的 Xaml 中删除它。

更新:

Xaml:

      <CollectionView  x:Name="CV" IsGrouped="True">
        <CollectionView.GroupHeaderTemplate>
            <DataTemplate>
               
                    <StackLayout>
                        <Label Text="Binding  Name" FontSize="Large"/>
                        <Label Text="Binding LastName" FontSize="Large"/>
                    </StackLayout>
                 
            </DataTemplate>
        </CollectionView.GroupHeaderTemplate>
        <CollectionView.ItemTemplate>
            <DataTemplate>
                <StackLayout>
                    <Label Text="Binding Description" FontSize="Medium"/>
                    <Label Text="Binding Deadline" FontSize="Medium"/>
                </StackLayout>
            </DataTemplate>
        </CollectionView.ItemTemplate>
    </CollectionView>

【讨论】:

首先感谢您的帮助,我完全按照您的步骤操作,并显示错误(“System.InvalidOperationException: 'LoadTemplate should not be null'”)你能解释一下与XAML 我已经用 Xaml 更新了回复。请检查一下。 太棒了,我很感谢你。但我是 Xamarin.forms 的初学者,我很难学习表之间的关系。我在互联网上找不到教育资源,你能帮帮我吗? 对于数据库,您可以参考文档正常使用。 docs.microsoft.com/en-us/xamarin/xamarin-forms/data-cloud/data/…表之间的关系可以用sqlite数据库一对多、一对一、多对多搜索。

以上是关于我无法通过 ListView(Xamarin.Forms) 显示员工的姓名、任务和日期的主要内容,如果未能解决你的问题,请参考以下文章

无法从 ListView 通过 Intent 正确传递数据

Xamarin表示Android导航栏向下移动

Xamarin表单:onSizeAllocated返回的宽度/高度含义是多少?

无法在ListView高亮显示中引用内容

Android - 通过 getView 函数在自定义 listView 适配器内设置 ImageView 的源无法正常工作

ListView即使具有DescendantFocusability也无法单击