【问题标题】:Unhandled Exception: System.InvalidCastException: Specified cast is not valid. when trying to save data to my database xamarin forms未处理的异常:System.InvalidCastException:指定的转换无效。尝试将数据保存到我的数据库 xamarin 表单时
【发布时间】:2020-06-22 22:39:44
【问题描述】:

好的,这就是我的应用程序的基本内容:在 AcceuilPage.xaml 中打开 im 时,我单击 + 图标将新项目添加到集合中。

然后它把我带到我用来填写数据表单的 NewFormPage.xaml,然后当我单击保存时,我从 NewFormPage.xaml.cs 调用 SaveButtonClicked 方法,但我的应用程序崩溃了,我得到:未处理的异常:系统.InvalidCastException:指定的强制转换无效。但我不知道为什么?

感谢您的帮助!

另外,我尝试了这个以查看是否创建了数据并且一切正常:

private void CreateSampleData()
{
    base.OnAppearing();
    ObservableCollection<Agenda> list = new ObservableCollection<Agenda>();
    list.Add(new Agenda { Topic = "Journée au chantier", Duration = "07:30 UTC - 11:30 UTC", Color = "#B96CBD", Date = new DateTime(2020, 3, 23) });
    list.Add(new Agenda { Topic = "Journée au chantier", Duration = "07:30 UTC - 11:30 UTC", Color = "#B96CBD", Date = new DateTime(2020, 3, 23) });
    AgendaCollection.ItemsSource = list;
}

代码如下:

数据库文件夹中的 AgendaDatabase.cs

using System;
using System.Collections.Generic;
using System.Text;
using SQLite;
using Calculette.Models;
using System.Threading.Tasks;

namespace Calculette.Database
{
    public class AgendaDatabase
    {
        readonly SQLiteAsyncConnection database;

        public AgendaDatabase(string dbPath)
        {
           
            database = new SQLiteAsyncConnection(dbPath);
            database.CreateTableAsync<Agenda>().Wait();
        


        }

        // Get all agenda
        public Task<List<Agenda>> GetAgendasAsync()
        {
            return database.Table<Agenda>().ToListAsync();
        }

        // Get specific agenda
        public Task<Agenda> GetAgendaAsync(int id)
        {
            return database.Table<Agenda>()
                            .Where(i => i.ID == id)
                            .FirstOrDefaultAsync();
        }

        // Insert new agenda (save)
        public Task<int> SaveAgendaAsync(Agenda agenda)
        {
            if (agenda.ID != 0)
            {
                return database.UpdateAsync(agenda);
            }
            else
            {
                return database.InsertAsync(agenda);
            }
        }
        
        //Delete specific agenda
        public Task<int> DeleteAgendaAsync(Agenda agenda)
        {
            return database.DeleteAsync(agenda);
        }
    }
}

模型文件夹中的 Agenda.cs

using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Text;
using SQLite;
using Calculette.Database;

namespace Calculette.Models
{
    public class Agenda
    {
        [PrimaryKey, AutoIncrement]
        public int ID { get; set; }
        public string Topic { get; set; }
        public string Duration { get; set; }
        public DateTime Date { get; set; }
    }
}

视图文件夹中的NewFormPage.xaml

 <ContentPage.Content>
        
        
        <StackLayout>
            <StackLayout >
            <Label Text="Date de calcul:" FontAttributes="Bold" FontFamily="ROBOTO" TextColor="#000000"></Label>
            <DatePicker x:Name="Datepicker" Date="{Binding Date}" FontFamily="ROBOTO" Format="yyyy-MM-dd" ></DatePicker>

            </StackLayout>

            <StackLayout >
                <Label Text="Description" FontAttributes="Bold" FontFamily="ROBOTO" TextColor="#000000"></Label>
                <Entry x:Name="Description" Text="{Binding Topic}"/>

            </StackLayout>

            <StackLayout>
                <Label Text="Durée quotidienne" FontAttributes="Bold" FontFamily="ROBOTO" TextColor="#000000"></Label>
                <Entry x:Name="Duree" Placeholder="HH:MM:SS" Text="{Binding Duration}"/>
            </StackLayout>

            <StackLayout>
                <Label Text="Niveau de pression dB(A)" FontAttributes="Bold" FontFamily="ROBOTO" TextColor="#000000"></Label>
                <Entry x:Name="Pression" Text="{Binding Pression}"/>
            </StackLayout>


            <Editor Text="{Binding Commentary}"
                x:Name="Commentary" 
                AutoSize="TextChanges" 
                Placeholder="Commentaires" />

            <StackLayout>
                <Button Text="Save" x:Name="SaveButton"  TextColor="#008A00" BackgroundColor="#FFFFFF" BorderWidth="1" BorderColor="#1A961A" Clicked="SaveButtonClicked"></Button>
                <ActivityIndicator IsRunning="{Binding IsBusy}"/>

            </StackLayout>
        </StackLayout>


    </ContentPage.Content>

视图文件夹中的NewFormPage.xaml.cs

using Calculette.Models;
using Calculette.ViewModel;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using Xamarin.Forms;
using Xamarin.Forms.Xaml;

namespace Calculette.Views
{
    [XamlCompilation(XamlCompilationOptions.Compile)]
    public partial class NewFormPage : ContentPage
    {
        public NewFormPage ()
        {
            InitializeComponent ();
            BindingContext = new FormViewModel();
            
        }

        async void SaveButtonClicked(object sender, EventArgs e)
        {
            
            var agenda = (Agenda)BindingContext;
           //agenda.Date = DateTime.UtcNow;
            await App.Database.SaveAgendaAsync(agenda);
            await Navigation.PopAsync();

        }

    }
}

AcceuilPage.xaml

 <ContentPage.Content>
            <!-- ScrollView nous permet d'avoir une page scrollable-->
     
                <ScrollView Orientation="Vertical">
                
                <CollectionView Grid.Row="2" Margin="25" HorizontalOptions="FillAndExpand" VerticalOptions="FillAndExpand"
                        SelectionMode="None"  x:Name="AgendaCollection"> <!--ItemsSource="{Binding AngedaCollection}" -->
                    <CollectionView.Header>
                        <StackLayout Orientation="Horizontal" Spacing="220">
                            
                            <Label Text="Agenda" TextColor="Black" FontSize="18"/>
                            
                            <ImageButton Source="iconplus.png"  HeightRequest="30" WidthRequest="30" Clicked="GoToNewFormPage"></ImageButton>
                           
                            

                        </StackLayout>
                        
                        

                    </CollectionView.Header>

                    <CollectionView.ItemsLayout>
                        <LinearItemsLayout Orientation="Vertical" ItemSpacing="20"/>
                    </CollectionView.ItemsLayout>
                    <CollectionView.ItemTemplate >
                        <DataTemplate>
                            
                                <pv:PancakeView HasShadow="True" BackgroundColor="White" VerticalOptions="StartAndExpand " 
                                    HorizontalOptions="FillAndExpand">
                                <Grid VerticalOptions="StartAndExpand" HorizontalOptions="FillAndExpand">
                                    <Grid.ColumnDefinitions>
                                        <ColumnDefinition Width="Auto"/>
                                        <ColumnDefinition Width="*"/>
                                    </Grid.ColumnDefinitions>
                                    <BoxView BackgroundColor="{Binding Color}" WidthRequest="3" HorizontalOptions="Start"
                                     VerticalOptions="FillAndExpand"/>
                                    <Expander Grid.Column="1">
                                        <Expander.Header>
                                            <Grid HorizontalOptions="FillAndExpand">
                                                <Grid.ColumnDefinitions>
                                                    <ColumnDefinition Width="*"/>
                                                    <ColumnDefinition Width="Auto"/>
                                                    <ColumnDefinition Width="3.5*"/>
                                                </Grid.ColumnDefinitions>
                                                <StackLayout HorizontalOptions="Center" VerticalOptions="Center">
                                                    <Label Text="{Binding Date, StringFormat='{0:dd}'}" TextColor="#008A00" FontSize="27" 
                                                   HorizontalOptions="Center"/>

                                                    <Label Text="{Binding Date, StringFormat='{0:MMMM}'}" TextColor="Black" FontSize="10" 
                                                   HorizontalOptions="Center" Margin="0,-10,0,0" FontAttributes="Bold"/>
                                                    <ImageButton Source="iconplus.png" HorizontalOptions="Center" HeightRequest="30" WidthRequest="30" Clicked="GoToFormPage"></ImageButton>
                                                </StackLayout>
                                                <BoxView Grid.Column="1" BackgroundColor="#F2F4F8" WidthRequest="1" HorizontalOptions="Start" 
                                                 VerticalOptions="FillAndExpand"/>
                                                <StackLayout Grid.Column="2" HorizontalOptions="Start" VerticalOptions="Center" Margin="20">
                                                    <Label Text="{Binding Topic}" TextColor="#008A00" FontSize="15" FontAttributes="Bold"/>
                                                    <Label Text="{Binding Duration}" TextColor="#2F3246" FontSize="12" Margin="0,-10,0,0"/>
                                                </StackLayout>
                                            </Grid>
                                        </Expander.Header>
                                        <Grid HorizontalOptions="FillAndExpand">
                                            <Grid.ColumnDefinitions>
                                                <ColumnDefinition Width="*"/>
                                                <ColumnDefinition Width="Auto"/>
                                                <ColumnDefinition Width="3.5*"/>
                                            </Grid.ColumnDefinitions>
                                            <BoxView Grid.Column="1" BackgroundColor="#F2F4F8" WidthRequest="1" HorizontalOptions="Start" 
                                             VerticalOptions="FillAndExpand"/>
                                            <StackLayout Grid.Column="2" Spacing="10">
                                                <Label Text="Tâches" TextColor="Black" FontSize="15" Margin="20,0"/>
                                                <StackLayout BindableLayout.ItemsSource="{Binding Speakers}" HorizontalOptions="Start" VerticalOptions="Center" Margin="20,0,0,20">
                                                    <BindableLayout.ItemTemplate>
                                                        <DataTemplate>
                                                            <Label TextColor="#2F3246" FontSize="12">
                                                                <Label.FormattedText>
                                                                    <FormattedString>
                                                                        <FormattedString.Spans>
                                                                            <Span Text="{Binding Time}"/>
                                                                            <Span Text=" - "/>
                                                                            <Span Text="{Binding Name}" FontAttributes="Bold"/>
                                                                        </FormattedString.Spans>
                                                                    </FormattedString>
                                                                </Label.FormattedText>
                                                            </Label>
                                                        </DataTemplate>
                                                        
                                                    </BindableLayout.ItemTemplate>
                                                    
                                                </StackLayout>

                                                
                                            </StackLayout>
                                        </Grid>
                                    </Expander>
                                </Grid>
                            </pv:PancakeView>
                            
                        </DataTemplate>
                    </CollectionView.ItemTemplate>
                </CollectionView>



            </ScrollView>
              
        </ContentPage.Content>

AcceuilPage.xaml.ca

public partial class MainPage : TabbedPage
    {
        public MainPage()
        {
            InitializeComponent();
            this.BindingContext = this;
           
        }
        protected async void GoToFormPage(object sender, EventArgs e)
        {
            await Navigation.PushAsync(new Views.AgendaItemDetailPage());
        }
        protected async void GoToNewFormPage(object sender, EventArgs e)
        {
            await Navigation.PushAsync(new Views.NewFormPage());
        }
    protected override async void OnAppearing()
    {
       base.OnAppearing();
        AgendaCollection.ItemsSource = await App.Database.GetAgendasAsync();
    }
}

【问题讨论】:

    标签: sqlite xamarin xamarin.forms


    【解决方案1】:

    在这里,BindingContext 被声明为 FormViewModel

        public NewFormPage ()
        {
            InitializeComponent ();
            BindingContext = new FormViewModel();
            
        }
    

    但在这里您尝试将BindingContext 转换为Agenda

        async void SaveButtonClicked(object sender, EventArgs e)
        {
            
            var agenda = (Agenda)BindingContext;
           //agenda.Date = DateTime.UtcNow;
            await App.Database.SaveAgendaAsync(agenda);
            await Navigation.PopAsync();
    
        }
    

    【讨论】:

    • 并且,使用调试器或检查堆栈跟踪应该可以准确地告诉您是哪一行导致了异常
    • 嗨,杰森,感谢您的回复。好点,我首先添加了 FormViewModel,因为我想使用 MVVM 样式和命令来实现它,但我还不是专家,所以我想用一个简单的点击功能进行测试,这对我来说非常有用,谢谢你的帮助,有一个美好的一天:)
    • 知道为什么 NewFormPage 中的日期选择器在更改后被初始化为 1900-01-01 吗?哈哈
    • 我假设您没有初始化 VM 的 Date 属性,因此它使用的是默认的 .NET DateTime 值
    猜你喜欢
    • 2019-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-20
    • 2012-01-15
    相关资源
    最近更新 更多