我无法通过 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) 显示员工的姓名、任务和日期的主要内容,如果未能解决你的问题,请参考以下文章
Xamarin表单:onSizeAllocated返回的宽度/高度含义是多少?
Android - 通过 getView 函数在自定义 listView 适配器内设置 ImageView 的源无法正常工作