Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Can';t在另一个DataGrid(WPF)的RowDetailsTemplate内保存DataGrid中的添加或删除行_C#_Wpf_Entity Framework_Datagrid_Rowdetailstemplate - Fatal编程技术网

C# Can';t在另一个DataGrid(WPF)的RowDetailsTemplate内保存DataGrid中的添加或删除行

C# Can';t在另一个DataGrid(WPF)的RowDetailsTemplate内保存DataGrid中的添加或删除行,c#,wpf,entity-framework,datagrid,rowdetailstemplate,C#,Wpf,Entity Framework,Datagrid,Rowdetailstemplate,我正在使用WPF和实体框架编写一个人力资源安全跟踪应用程序,我想在其中显示和编辑一个安全事件网格,在每个选定的事件下都有一个因事件而损失小时数的月网格。这意味着事件的数据网格的RowDetailsTemplate中的小时数的数据网格 我当前可以保存对现有小时数行所做的更改,但无法将添加或删除保存到此内部数据网格。我的相关型号代码: [Table("hr.safety_incident")] public partial class SafetyIncident { [Key] [

我正在使用WPF和实体框架编写一个人力资源安全跟踪应用程序,我想在其中显示和编辑一个安全事件网格,在每个选定的事件下都有一个因事件而损失小时数的月网格。这意味着事件的数据网格的RowDetailsTemplate中的小时数的数据网格

我当前可以保存对现有小时数行所做的更改,但无法将添加或删除保存到此内部数据网格。我的相关型号代码:

[Table("hr.safety_incident")]
public partial class SafetyIncident
{
    [Key]
    [Column(TypeName = "numeric")]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public decimal incident_id { get; set; }

    [Column(TypeName = "datetime2")]
    public DateTime incident_date { get; set; }

    [Required]
    [StringLength(30)]
    public string incident_type { get; set; }
}

// EDIT: forgot this part of the class
public partial class SafetyIncident    // In another file
{
    protected ObservableCollection<SafetyHours> _lostHoursDetails;

    [NotMapped]
    public ObservableCollection<SafetyHours> LostHoursDetails
    {
        get { return _lostHoursDetails; }
        set
        {
            if (_lostHoursDetails != value)
            {
                _lostHoursDetails = value;
            }
        }
    }
}

[Table("hr.safety_hours")]
public partial class SafetyHours
{
    [Key]
    [Column(TypeName = "numeric")]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public decimal safety_hours_id { get; set; }

    [Column(TypeName = "numeric")]
    public decimal incident_id { get; set; }

    [Column(TypeName = "datetime2")]
    public DateTime safety_hours_date { get; set; }

    [Column(TypeName = "numeric")]
    public decimal restricted_hours { get; set; }

    [Column(TypeName = "numeric")]
    public decimal lost_hours { get; set; }
}
[表(“人力资源安全事件”)]
公共部分类安全事件
{
[关键]
[列(TypeName=“numeric”)]
[数据库生成(DatabaseGeneratedOption.Identity)]
公共十进制事件\u id{get;set;}
[列(TypeName=“datetime2”)]
公共日期时间事件\u日期{get;set;}
[必需]
[行政长官(30)]
公共字符串事件类型{get;set;}
}
//编辑:忘记了课程的这一部分
另一个文件中的公共部分类SafetyIncident//
{
受保护的可观测采集_losshour详细信息;
[未映射]
公众可观察到的收集损失详细信息
{
获取{return\u lostHoursDetails;}
设置
{
如果(_lostHoursDetails!=值)
{
_lostHoursDetails=值;
}
}
}
}
[表(“人力资源安全工时”)]
公共部分课程安全时间
{
[关键]
[列(TypeName=“numeric”)]
[数据库生成(DatabaseGeneratedOption.Identity)]
公共十进制安全\u小时\u id{get;set;}
[列(TypeName=“numeric”)]
公共十进制事件\u id{get;set;}
[列(TypeName=“datetime2”)]
公共日期时间安全\u小时\u日期{get;set;}
[列(TypeName=“numeric”)]
公共十进制限制时数{get;set;}
[列(TypeName=“numeric”)]
公共十进制损失时间{get;set;}
}
相关XAML:



你的问题到底是什么?内部DataGrid事件是否填充了数据?LossThoursDetails属性定义在哪里?它的类型是什么?根据我的开场白,我的问题是我无法将添加或删除保存到内部DataGrid,即使我可以填充它并修改填充它的行。我很抱歉没有显示LostHoursDetails的定义位置--它在另一个文件中定义了更多的SafetyIncident属性,我将在明天早上的编辑中修复它--但根据我的代码,它属于ObservableCollection类型。谢谢
<DataGrid x:Name="dtgAllIncidents" AutoGenerateColumns="False" 
        ItemsSource="{Binding Source={StaticResource safetyIncidentViewSource}}" 
        RowDetailsVisibilityMode="VisibleWhenSelected">
    <DataGrid.Columns>
        <DataGridTemplateColumn x:Name="incident_dateColumn" Header="Incident Date" Width="110" SortMemberPath="incident_date">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <DatePicker IsHitTestVisible="False" 
                        SelectedDate="{Binding incident_date, Mode=TwoWay, NotifyOnValidationError=true, UpdateSourceTrigger=PropertyChanged, ValidatesOnExceptions=true}"/>
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
            <DataGridTemplateColumn.CellEditingTemplate>
                <DataTemplate>
                    <DatePicker SelectedDate="{Binding incident_date, Mode=TwoWay, NotifyOnValidationError=true, UpdateSourceTrigger=PropertyChanged, ValidatesOnExceptions=true}"/>
                </DataTemplate>
            </DataGridTemplateColumn.CellEditingTemplate>
        </DataGridTemplateColumn>
        <DataGridTextColumn Header="Incident Type" Binding="{Binding incident_type}"/>
    </DataGrid.Columns>
    <DataGrid.RowDetailsTemplate>
        <DataTemplate>
            <StackPanel Orientation="Horizontal">
                <TextBlock Text="Enter data into the blank row to add lost and restricted hours.”/>
                <DataGrid x:Name="dtgLostHoursDetails" ItemsSource="{Binding LostHoursDetails}" AutoGenerateColumns="False" CanUserAddRows="True" CanUserDeleteRows="True">
                    <DataGrid.Columns>
                        <DataGridTemplateColumn x:Name="incident_dateColumn" Header="Month in Which Hours Lost">
                            <DataGridTemplateColumn.CellTemplate>
                                <DataTemplate>
                                    <DatePicker IsHitTestVisible="False"
                                            SelectedDate="{Binding safety_hours_date, Mode=TwoWay, NotifyOnValidationError=true, UpdateSourceTrigger=PropertyChanged, ValidatesOnExceptions=true}"/>
                                </DataTemplate>
                            </DataGridTemplateColumn.CellTemplate>
                            <DataGridTemplateColumn.CellEditingTemplate>
                                <DataTemplate>
                                    <DatePicker SelectedDate="{Binding safety_hours_date, Mode=TwoWay, NotifyOnValidationError=true, UpdateSourceTrigger=PropertyChanged, ValidatesOnExceptions=true}"/>
                                </DataTemplate>
                            </DataGridTemplateColumn.CellEditingTemplate>
                        </DataGridTemplateColumn>
                        <DataGridTextColumn Width="SizeToHeader" Header="Lost Hours" Binding="{Binding lost_hours}"/>
                        <DataGridTextColumn Width="SizeToHeader" Header="Restricted Hours" Binding="{Binding restricted_hours}"/>
                    </DataGrid.Columns>
                </DataGrid>
            </StackPanel>
        </DataTemplate>
    </DataGrid.RowDetailsTemplate>
</DataGrid>
private ObservableCollection<SafetyIncident> _incidents;
private SafetyIncidentsViewModel _incidentsVM = new SafetyIncidentsViewModel();

private void mniIncidents_Click(object sender, RoutedEventArgs e)
{
    CollectionViewSource safetyIncidentViewSource = ((CollectionViewSource)this.FindResource("safetyIncidentViewSource")));
    _incidents = _incidentsVM.GetIncidents();
    safetyIncidentViewSource.Source = _incidents;
}
private void btnSaveIncidents_Click(object sender, RoutedEventArgs e)
{
    _incidentsVM.SaveChanges();
    dtgAllIncidents.Items.Refresh();
}
public class SafetyIncidentsViewModel
{
    private Corp_DB _context = new Corp_DB();

    public ObservableCollection<SafetyIncident> GetIncidents()
    {
        ObservableCollection<SafetyIncident> results = null;
        LoadSafetyIncidents();
        results = _context.safety_incident.Local;
        return results;
    }

    private void LoadSafetyIncidents()
    {
        _context.safety_incident.OrderBy(si => si.incident_date).Load();
        _context.safety_hours.Load();
        foreach (var i in _context.safety_incident)
        {
            var lostHours = new ObservableCollection<SafetyHours>();
            foreach (var h in _context.safety_hours.Where(sh => sh.incident_id == i.incident_id).OrderBy(sh => sh.safety_hours_date))
            {
                lostHours.Add(h);
            }
            i.LostHoursDetails = lostHours;
        }
    }

    public void SaveChanges()
    {
        // Assign new hours rows their safety incident.  Open to more automatic way...
        foreach (var si in _context.safety_incident)
        {
            foreach (var sh in si.LostHoursDetails.Where(h => h.incident_id == 0))
            {
                sh.incident_id = si.incident_id;
            }
        }
        _context.SaveChanges();
    }