Похоже, вы запускаете этот код после того, как пользователь уже внес правку под именем "RowEditEnding
".
Так что я думаю, что проблема в том, что вы создаете MySqlCommandBuilder
только после того, как редактирование было сделано.
Сначала необходимо создать MySqlCommandBuilder
, затем внести изменения, а затем получить команду обновления / вставки / удаления.
например. что-то вроде следующего (извините в VB, но вы понимаете суть):
Using NotesDS As New DataSet
Using NotesDA As New SqlDataAdapter With {.SelectCommand = New SqlCommand With {.Connection = SQLDBConnection, .CommandText = "SELECT * FROM Notes WHERE ID = " & ID}}
NotesDA.Fill(NotesDS, "Notes")
Using NotesDV As New DataView(NotesDS.Tables("Notes"))
Using NoteBuilder As New SqlCommandBuilder(NotesDA) With {.QuotePrefix = "[", .QuoteSuffix = "]"}
If NotesDV.Count = 1 Then
Dim NoteDRV As DataRowView = NotesDV(0)
NoteDRV.BeginEdit()
NoteDRV.Item("UserName") = UserName
NoteDRV.Item("Note") = Note
NoteDRV.Item("NoteDate") = NoteDate
NoteDRV.Item("CompanyCode") = CompanyCode
NoteDRV.EndEdit()
NotesDA.UpdateCommand = NoteBuilder.GetUpdateCommand
NotesDA.Update(NotesDS, "Notes")
End If
End Using
End Using
End Using
End Using
Редактировать
@ Евгений, с чем связан ваш DataGrid
? Предположительно, вы устанавливаете DataView
как DataContext
?
Если это так, тогда вы будете использовать DataAdapter
для заполнения DataView
при загрузке страницы? Это DataAdapter
, с которым нужно инициализировать MySqlCommandBuilder
.
Попробуйте следующее:
- объявляет вас
DataAdapter
, DataSet
и DataView
в верхней части вашей страницы.
- Используйте обработчик
BeginningEdit
вашего dtGrid для инициализации вашего MySqlCommandBuilder
на объявленном DataAdapter
- Используйте
RowEditEnding
для запуска команды DataAdapter.Update
например. (Я использую SQL, но MySQL работает так же, насколько мне известно)
using System.Windows;
using System.Windows.Controls;
using System.Data;
using System.Data.SqlClient;
namespace testApp
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private SqlDataAdapter myDataAdapter;
private DataView myDataView;
private DataSet myDataSet;
private SqlCommandBuilder myBuilder;
private SqlConnection myConn = new SqlConnection("CONNECTIONSTRING");
private void Window_Loaded(object sender, RoutedEventArgs e)
{
myConn.Open();
myDataAdapter = new SqlDataAdapter {SelectCommand=new SqlCommand() {Connection=myConn, CommandText="SELECT MINumber, CompanyName FROM EIncCompanies WHERE CompanyName LIKE 'Test%'" } };
myDataSet = new DataSet();
myDataAdapter.Fill(myDataSet, "EIncCompanies");
myDataView = new DataView(myDataSet.Tables["EIncCompanies"]);
dtGrid.DataContext = myDataView;
}
private void dtGrid_BeginningEdit(object sender, DataGridBeginningEditEventArgs e)
{
myBuilder = new SqlCommandBuilder(myDataAdapter) { QuotePrefix="[", QuoteSuffix="]"};
DataRowView myDRV = (DataRowView)dtGrid.SelectedItem;
myDRV.BeginEdit();
}
private void dtGrid_RowEditEnding(object sender, DataGridRowEditEndingEventArgs e)
{
DataRowView myDRV = (DataRowView)dtGrid.SelectedItem;
myDRV.EndEdit();
myDataAdapter.UpdateCommand = myBuilder.GetUpdateCommand();
myDataAdapter.Update(myDataSet, "EIncCompanies");
}
}
}
Я также установил Mode=TwoWay, UpdateSourceTrigger=PropertyChanged
на привязку в DataGrid
.