【问题标题】:making datagrid addrow feature to work with entity framework使 datagrid addrow 功能与实体框架一起使用
【发布时间】:2016-11-05 20:55:58
【问题描述】:

我正在编写这个简单的应用程序,它有两个主表,一个用于图片信息,另一个用于图片参数列表,如下图所示

我希望能够在没有任何其他形式的情况下内联添加参数列表,但是当我添加一行时,它会将另一行正确添加到数据库中,但保存输入的文本不起作用。(我正在“RowEditEnding”中保存更改事件) 这是 XAML:

<Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="0.5*"/>
            <ColumnDefinition/>
        </Grid.ColumnDefinitions>
        <Grid Margin="10">
            <Grid.RowDefinitions>
                <RowDefinition/>
                <RowDefinition Height="50"/>
            </Grid.RowDefinitions>
            <ListBox Name="lstPicture" Grid.Column="0" ItemsSource="{Binding pictures, Mode=OneWayToSource}" DisplayMemberPath="Name" SelectedValuePath="ID">
            </ListBox>
            <Button Grid.Row="1" Content="جدید" Height="Auto" Margin="0,0,0,10"/>
        </Grid>
        <GroupBox Header="اطلاعات تصویر" Grid.Column="1" Margin="0,10,10,10">
            <!--Image Data Grid-->
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition/>
                    <ColumnDefinition Width="200px"/>
                </Grid.ColumnDefinitions>
                <!--Image Data Right Grid-->
                <Grid>
                    <Grid.RowDefinitions>
                        <RowDefinition/>
                        <RowDefinition Height="100px"/>
                    </Grid.RowDefinitions>
                    <materialDesign:Card Margin="10" VerticalAlignment="Stretch" HorizontalAlignment="Stretch">
                        <Image Name="imgPreview" Margin="5" Source="{Binding SelectedItem.URL, ElementName=lstPicture}" MouseLeftButtonUp="Image_MouseLeftButtonUp">
                        </Image>
                    </materialDesign:Card>
                    <!--Image Data Fields-->
                    <Grid Grid.Row="1">
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="100px"/>
                            <ColumnDefinition/>
                        </Grid.ColumnDefinitions>
                        <Grid.RowDefinitions>
                            <RowDefinition/>
                            <RowDefinition/>
                            <RowDefinition/>
                        </Grid.RowDefinitions>
                        <Grid.Resources>
                            <Style TargetType="TextBlock">
                                <Setter Property="VerticalAlignment" Value="Center"/>
                                <Setter Property="Margin" Value="5"/>
                            </Style>
                            <Style BasedOn="{StaticResource MaterialDesignTextBox}" TargetType="TextBox">
                                <Setter Property="Margin" Value="5"/>
                            </Style>
                            <Style BasedOn="{StaticResource MaterialDesignRaisedButton}" TargetType="Button">
                                <Setter Property="Margin" Value="5"/>
                            </Style>
                        </Grid.Resources>
                        <TextBlock Text="نام تصویر"/>
                        <TextBox Grid.Column="1" Text="{Binding SelectedItem.Name, ElementName=lstPicture}"/>
                        <TextBlock Text="عکاس" Grid.Row="1"/>
                        <TextBox Grid.Column="1" Grid.Row="1" Text="{Binding SelectedItem.Author, ElementName=lstPicture}"/>
                        <TextBlock Text="انتخاب تصویر" Grid.Row="2"/>
                        <Button Name="btnChooseImage" Content="..." Grid.Column="1" Grid.Row="2" Height="Auto" Click="btnChooseImage_Click"/>
                    </Grid>

                </Grid>
                <DataGrid Name="dgrdQuestions" Grid.Column="1" Margin="10" ItemsSource="{Binding SelectedItem.tests, ElementName=lstPicture,Converter={StaticResource ObservableCollectionConverter},UpdateSourceTrigger=PropertyChanged}" AutoGenerateColumns="False" CanUserAddRows="True" CellEditEnding="DataGrid_CellEditEnding" RowEditEnding="dgrdQuestions_RowEditEnding" AddingNewItem="DataGrid_AddingNewItem">
                    <DataGrid.Columns>
                        <DataGridTextColumn Binding="{Binding Title}" Header="عنوان" Width="1*"/>
                    </DataGrid.Columns>
                    <DataGrid.ContextMenu>
                        <ContextMenu>
                            <MenuItem Name="btnAddQuestion" Header="جدید" Click="btnAddQuestion_Click"/>
                            <MenuItem Name="btnDeleteQuestion" Header="حذف" Click="btnDeleteQuestion_Click"/>
                        </ContextMenu>
                    </DataGrid.ContextMenu>
                </DataGrid>
            </Grid>
        </GroupBox>
    </Grid>

这里是代码:

public AdminPanel()
{
    InitializeComponent();
    lstPicture.ItemsSource = App.Entities.pictures.ToList();
}

private void DataGrid_CellEditEnding(object sender, DataGridCellEditEndingEventArgs e)
{
    App.Entities.SaveChanges();
}

private void DataGrid_AddingNewItem(object sender, AddingNewItemEventArgs e)
{
    App.Entities.tests.Add(new test { pictureID = (int)lstPicture.SelectedValue });
    App.Entities.SaveChanges();
}

p.s:我总是遇到 WPF 绑定和实体框架这样的问题,这让我使用 hacky 方法来解决它。如果有人向我解释不会导致此类问题的绑定的正常方法,我将不胜感激

【问题讨论】:

    标签: c# wpf entity-framework datagrid wpfdatagrid


    【解决方案1】:

    由于 EF 不知道您更改的实体(它是由 ModelBinder 而不是 EF 本身更改的,我们需要告诉 EF 该对象存在并且它是修改后的 App.Entities.Entry(test).State = EnitityState.Modified;

    var datag = (DataGrid) sender;
    var t = (Test) datag.SelectedValue;
    App.Entities.Entry(test).State = EnitityState.Modified;
    App.Entities.SaveChanges();
    

    如果对象由于某种原因不在这个给定的 DbContext 中,那么您必须通过 Id 找到它,然后更改它,然后您可以调用 App.Entities.SaveChanges();

    【讨论】:

    • 我已经在 CellEditEnding 部分添加了上述代码,但它抛出了这个异常:在 EntityFramework.dll 中发生了“System.Data.Entity.Infrastructure.DbUpdateConcurrencyException”类型的异常,但未在用户代码中处理附加信息:存储更新、插入或删除语句影响了意外的行数 (0)。自加载实体后,实体可能已被修改或删除。有关理解和处理乐观并发异常的信息,请参阅 go.microsoft.com/fwlink/?LinkId=472540
    • @MojtabaIranpanah 这是 EF 中的一个已知错误,但不幸的是,错误消息并不清楚该错误的确切含义!当实体 Id = 0 或实体不在同一个 db 上下文中时发生此错误,您必须在更改之前在 dbContext 中搜索实体!
    猜你喜欢
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多