首页 文章

在WPF中选择数据网格行时,显示数据网格中相关表的数据

提问于
浏览
-1

我有两个表,设备和组件 . 每个设备由一个或多个组件组成 . 现在我有一个显示设备的数据网格,以及我数据库中View的相关属性 .

我想要的是在同一窗口中有第二个数据网格,它将显示数据网格中所选设备所包含的组件 .

到目前为止,我知道我可以使用SelectedItem属性获取选定的行:

Equipment eq= (Equipment )myDataGrid.SelectedItem;

但什么时候应该运行此代码?我使用EF将我的数据库实体映射到CLR对象,其中我也包含了组件及其关系表 .

当用户在设备中选择一行时,我当然需要使用新信息刷新组件数据网格,我可以这样做 .

myGrid.ItemsSource = myDataSource;

我怎样才能开始解决这个问题?

我正在使用一个视图,其中包含来自我的设备数据网格中3个不同表的数据,因此设置为数据网格ItemsSource的表与组件表没有直接关系 .

2 回答

  • 1

    我通过使用获取组件并在调用Equipment数据网格上的SelectionChanged事件时将它们插入到数据网格中来修复它:

    private void EquipDataGrid_SelectionChanged(object sender, SelectionChangedEventArgs e)
            {
                try
                {
                    var row_list = GetDataGridRows(EquipDataGrid);
                    foreach (DataGridRow single_row in row_list)
                    {
                        if (single_row.IsSelected == true)
                        {
                            EquipmentView selectedEquipment = (EquipmentView)EquipDataGrid.SelectedItem;
                            using (wiki_nolek_dk_dbEntities db = new wiki_nolek_dk_dbEntities())
                            {
                                db.Configuration.LazyLoadingEnabled = true;
                                var equipmentRelation = db.EquipmentComponents.Where(c => c.EquipmentID == selectedEquipment.EquipmentId);
                                var componentsForEquipment = new List<Component>();
                                foreach (var row in equipmentRelation)
                                {
                                    var component = db.Components.FirstOrDefault(c => c.ComponentId == row.ComponentID);
                                    componentsForEquipment.Add(component);
                                }
                                CompDataGrid.ItemsSource = componentsForEquipment;
                            }
                        }
                    }
    
                }
                catch
                {
                    MessageBox.Show("Det valgte udstyr eksisterer ikke.");
                }
            }
    
  • 0

    我已经修改了自己的答复的代码删除无用 foreach loop.I不知道 wiki_nolek_dk_dbEntities 是怎么工作的,但我也加入 ToList() 任何 db 查询结果,以确保结果是 List 而不是 IQueryable .

    private void EquipDataGrid_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            try
            {
                EquipmentView selectedEquipment = (EquipmentView)EquipDataGrid.SelectedItem;
                using (wiki_nolek_dk_dbEntities db = new wiki_nolek_dk_dbEntities())
                {
                    db.Configuration.LazyLoadingEnabled = true;
    
                    var equipmentRelationComponentIds =
                        db.EquipmentComponents
                            .Where(e => e.EquipmentID == selectedEquipment.EquipmentId)
                            .Select(e => e.ComponentId)
                            .ToList();
    
                    var componentsForEquipment =
                        db.Components
                            .Where(c => equipmentRelationComponentIds.Contains(c.ComponentId))
                            .ToList();
    
                    CompDataGrid.ItemsSource = componentsForEquipment;
                }
            }
            catch
            {
                MessageBox.Show("Det valgte udstyr eksisterer ikke.");
            }
        }
    

相关问题