Есть ли способ заполнить ObservableCollection в Xamarin.Формирует путем чтения csv-файла?

#c# #csv #xamarin #xamarin.forms #spreadsheet

Вопрос:

У меня есть класс Student ниже, и я использую ObservableCollection в классе ViewModel для отображения учащихся в 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"));
}
        
}
 

Комментарии:

1. joshclose.github.io/CsvHelper

Ответ №1:

Да, вы могли бы использовать CsvHelper для чтения csv данных путем установки CsvHelper из пакета NuGet.

Вы можете создать CSV-файл и поместить его в Xamarin.Проект Forms. Существует аналогичный пример, который считывает .csv данные файла.Вы можете обратиться к следующему коду.

Например, содержимое test.csv выглядит следующим образом:(Задайте значение Build Action as 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>
 

The 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 файла.

Комментарии:

1. Это отличная помощь, большое вам спасибо