将选定的行从 WPF DataGrid 发送到 SQL 表时遇到困难

问题描述 投票:0回答:1

我的 WPF 应用程序遇到问题,我需要将选定的行从

DataGrid
发送到
SQL
数据库表。尽管实现了必要的逻辑,但负责处理选择和发送数据的方法并未被触发。 无法访问的方法:负责处理选择并将数据发送到 SQL 数据库表的方法(
CanSendSelectedRows
SendSelectedRowsToSQL
)未按预期访问。 以下是这些方法:

//constructor
 public DataGridViewModel()
        {
            
            DataGridItems = new ObservableCollection<States>();
            SelectedItems = new ObservableCollection<States>();
            
            LoadDataFromDatabase();

            
            SendSelectedRowsToSQLCommand = new RelayCommand(SendSelectedRowsToSQL, CanSendSelectedRows);
         }

public ObservableCollection<States> SelectedItems
        {
            get => _selectedItems;
            set
            {
                _selectedItems = value;
                OnPropertyChanged(nameof(SelectedItems));

            }
        }

public ICommand SendSelectedRowsToSQLCommand { get;  set; }
private bool CanSendSelectedRows(object parameter)
        {
           //return true;
            // Ensure that SelectedItems is not null and contains at least one item
           return SelectedItems != null && SelectedItems.Any();
        }

public void SendSelectedRowsToSQL(object parameter)
        {
            using (var context = new DbProjectEntities())

            {
                foreach (var item in SelectedItems)
                {
                    context.orderedStateTbl.Add(new orderedStateTbl
                    {
                        orderStateId = item.StateID,
                        oStateName = item.StateName
                    });
                }
            }
        }

负责触发操作的

button
始终处于启用状态,甚至在
DataGrid
中选择任何行之前也是如此。

<Button Content="Send Selected Rows" 
                HorizontalAlignment="Center" VerticalAlignment="Bottom"
                Margin="0,0,0,20"
                Command="{Binding SendSelectedRowsToSQLCommand }"/>

最后我在后面的代码中设置了我的

dataContext
View
,如下


            InitializeComponent();
            _viewmodel = new DataGridViewModel();
            DataContext = _viewmodel;

我为我非常简单的问题道歉。谁能帮助我我的错误是什么或者我应该做什么?

c# wpf mvvm datacontext
1个回答
0
投票

看来您只是没有将更改保存到数据库中。想象一下,您的软件中有一个

Select All
按钮,用户一次选择 10,000 行。您认为应该如何保存这些行?你什么时候打电话
DbContext.DbSet.Add
? - 不,这不是它的工作原理,您将使数据库因 10,000 个查询而超载。

相反,Microsoft 设计

DbContext
遵循存储库模式,这意味着您将所有更改保留在内存中,直到显式保存/提交调用。

因此,您的方法应该多一行:

public void SendSelectedRowsToSQL(object parameter)
{
    using (var context = new DbProjectEntities())
    {
        foreach (var item in SelectedItems)
        {
            context.orderedStateTbl.Add(new orderedStateTbl
            {
                orderStateId = item.StateID,
                oStateName = item.StateName
            });
        }

        context.SaveChanges(); // Here is the commit transaction call
    }
}

此外,所有数据库查询都是 I/O 操作,因此建议使用异步查询方法。所以我建议你稍微重新设计一下你的方法:

public async void SaveAsync(object parameter)
{
    using var context = new DbProjectEntities();

    context.orderedStateTbl.AddRange(
        SelectedItems.Select(item => new orderedStateTbl
        {
            orderStateId = item.StateID,
            oStateName = item.StateName
        }));

    await context.SaveChangesAsync();
}
© www.soinside.com 2019 - 2024. All rights reserved.