c# - 有没有办法通过读取 csv 文件来填充 Xamarin.Forms 中的 ObservableCollection?
问题描述
我在下面有一个学生类,我在 ViewModel 类中使用 ObservableCollection 在 ListView 中显示学生。我可以从 csv/电子表格中读取数据来填充 ObservableCollection 的学生吗?
public class Student
{
public string Firstname { get; set; }
public string Surname { get; set; }
public string Module { get; set; }
public Project(string Firstname, string Surname, string Module)
{
this.Firstname = Firstname;
this.Surname = Surname;
this.Module = Module;
}
public class ProjectListViewModel
{
public ObservableCollection<Student> Students { get; set; }
public ProjectListViewModel()
{
Students = new ObservableCollection<Project>();
Students.Add(new Student("Ben", "Ledley", "Maths"));
Students.Add(new Student("John", "Alex", "English"));
Students.Add(new Student("Sam", "Craig", "Biology"));
}
}
解决方案
是的,您可以通过从 NuGet 包安装CsvHelper
来读取csv
数据。CsvHelper
您可以创建一个 .csv 文件并将其放入 Xamarin.Forms 项目中。有一个类似的读取.csv
文件数据的例子。你可以参考下面的代码。
例如 的内容test.csv
如下:(设置Build Action
为Embedded resource
.):
ID,Name,Age
1,A,11
2,B,12
3,C,13
4,D,14
5,E,15
项目模型是Item.cs
public class Item
{
public string ID { get; set; }
public string Name { get; set; }
public string Age { get; set; }
}
MainPage.xaml
<StackLayout>
<ListView x:Name="mListView" HasUnevenRows="True">
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<StackLayout Orientation="Horizontal" HorizontalOptions="Fill" BackgroundColor="Olive">
<StackLayout Orientation="Vertical">
<Label Text = "{Binding Name}" FontSize="24" AbsoluteLayout.LayoutBounds="0.25, 0.25, 400, 40"/>
<Label Text = "{Binding Age}" AbsoluteLayout.LayoutBounds="50, 35, 200, 25"/>
</StackLayout>
</StackLayout>
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
<Button Clicked="Button_Clicked" Text="Read data from CSV" />
</StackLayout>
这MainPage.xaml.cs
public partial class MainPage : ContentPage
{
public ObservableCollection<Item> items { get; set; }
public MainPage()
{
InitializeComponent();
items = new ObservableCollection<Item>();
mListView.ItemsSource = items;
}
private void Button_Clicked(object sender, EventArgs e)
{
var assembly = Assembly.GetExecutingAssembly();
var resourceName = "ReadFromExcel.test.csv";
using (Stream stream = assembly.GetManifestResourceStream(resourceName))
using (StreamReader reader = new StreamReader(stream))
{
//string result = reader.ReadToEnd();
if (reader != null)
{
using (var csv = new CsvReader(reader, CultureInfo.CurrentCulture))
{
while (csv.Read())
{
items.Add(new Item
{
ID = csv.GetField<string>(0),
Name = csv.GetField<string>(1),
Age = csv.GetField<string>(2)
});
}
}
}
}
}
}
注意:.CSV
点击按钮后,我们可以从文件中读取数据。
推荐阅读
- java - 使用 Spring RMI(RmiServiceExporter 和 RmiProxyFactoryBean)的巨大返回数据
- regex - 我们如何在 Groovy 中的单个字符串中获取多次出现的正则表达式?
- android - 从 URL 获取多个图像
- c# - db.SaveChanges 不提交更改
- python - PostgreSQL 中基表更改时自动添加列
- haskell - “succ(zero)”的类型与 GHC 中的“one”类型不同
- objective-c - 在 RNFIRMessaging.h 中找不到“FirebaseCore/FirebaseCore.h”文件
- amazon-web-services - 将集群加入主节点时,Kubernetes 工作节点连接被拒绝
- azure-data-factory-2 - Oracle 集成运行时共享问题
- android - 使用 Glide 加载低分辨率图像