我的 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;
我为我非常简单的问题道歉。谁能帮助我我的错误是什么或者我应该做什么?
看来您只是没有将更改保存到数据库中。想象一下,您的软件中有一个
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();
}