c# - DataGridView 不保存对单元格的编程更改
问题描述
我在数据绑定 DataGridView 中有一个复选框,选中后会打开一个弹出表单。我填写表格并关闭它,表格中的数据填充到行中。但是没有保存更改。
我能够手动编辑单元格,并且这些单元格已成功保存。但是由于某种原因没有以编程方式保存 - 我没有成功确定原因。有人可以帮忙吗?
private void dgvItemsTable_CellValueChanged ( object sender, DataGridViewCellEventArgs e )
{
if ( dgvItemsTable.Columns[e.ColumnIndex].Name == soldColumn &&
(bool)dgvItemsTable.Rows[e.RowIndex].Cells[e.ColumnIndex].Value == true )
{
formSoldItemPopup.FillComboBoxAutoComplete ( dataSetItems, expenseTypeColumn, true );
DialogResult dialogResult = formSoldItemPopup.ShowDialog ();
if ( dialogResult == DialogResult.OK )
{
dgvItemsTable.BeginEdit ( true );
dgvItemsTable.Rows[e.RowIndex].Cells[salesChannelIDColumn].Value = Int32.Parse ( salesChannelID );
dgvItemsTable.Rows[e.RowIndex].Cells[salePriceColumn].Value = formSoldItemPopup.SalePrice;
dgvItemsTable.Rows[e.RowIndex].Cells[saleDateColumn].Value = formSoldItemPopup.SaleDate;
dgvItemsTable.Rows[e.RowIndex].Cells[expensesColumn].Value = formSoldItemPopup.Expenses;
dgvItemsTable.Rows[e.RowIndex].Cells[expenseTypeColumn].Value = formSoldItemPopup.ExpenseType;
dgvItemsTable.Rows[e.RowIndex].SetValues ();
dgvItemsTable.EndEdit ();
UpdateItemsDatabase ();
}
}
}
private void dgvItemsTable_CurrentCellDirtyStateChanged ( object sender, EventArgs e )
{
if ( dgvItemsTable.IsCurrentCellDirty )
{
dgvItemsTable.CommitEdit ( DataGridViewDataErrorContexts.CurrentCellChange );
}
}
private void dgvItemsTable_CellEndEdit ( object sender, DataGridViewCellEventArgs e )
{
UpdateItemsDatabase ();
}
我也尝试过获取数据绑定的 DataRow 并对其进行更新,但这些更改仍然不是持久的。
DataRow dataRow = ( (DataRowView)dgvItemsTable.SelectedRows[0].DataBoundItem ).Row;
dataRow.BeginEdit ();
dataRow[salesChannelIDColumn] = Int32.Parse ( salesChannelID );
dataRow[salePriceColumn] = formSoldItemPopup.SalePrice;
dataRow[saleDateColumn] = formSoldItemPopup.SaleDate;
dataRow[expensesColumn] = formSoldItemPopup.Expenses;
dataRow[expenseTypeColumn] = formSoldItemPopup.ExpenseType;
dataRow.EndEdit ();
dataRow.AcceptChanges ();
更新
所以,我在下面的代码中取得了一些成功——但前提是我不包括弹出表单的两行。哪种方式违背了目的-我需要表单中的详细信息来填充行。:-(
有谁知道为什么表单会阻止该行成功更新?
private void button1_Click ( object sender, EventArgs e )
{
currentColumnBeingEdited = dgvItemsTable.CurrentCell.ColumnIndex;
currentRowBeingEdited = dgvItemsTable.CurrentCell.RowIndex;
string salesChannelID =
dgvSelectedSalesChannel.Rows[dgvSelectedSalesChannel.Rows.Count - 1].Cells[salesChannelIDColumn].Value.ToString ();
formSoldItemPopup.FillComboBoxAutoComplete ( dataSetItems, expenseTypeColumn, true );
formSoldItemPopup.ShowDialog ();
dgvItemsTable.CurrentCell = dgvItemsTable.Rows[currentRowBeingEdited].Cells[soldColumn];
dgvItemsTable.Rows[currentRowBeingEdited].Cells[soldColumn].Value = true;
dgvItemsTable.BeginEdit ( false );
dgvItemsTable.EndEdit ();
dgvItemsTable.NotifyCurrentCellDirty ( true );
dgvItemsTable.CurrentCell = dgvItemsTable.Rows[currentRowBeingEdited].Cells[salesChannelIDColumn];
dgvItemsTable.Rows[currentRowBeingEdited].Cells[salesChannelIDColumn].Value = salesChannelID;
dgvItemsTable.BeginEdit ( false );
dgvItemsTable.EndEdit ();
dgvItemsTable.NotifyCurrentCellDirty ( true );
dgvItemsTable.CurrentCell = dgvItemsTable.Rows[currentRowBeingEdited].Cells[saleDateColumn];
dgvItemsTable.Rows[currentRowBeingEdited].Cells[saleDateColumn].Value = formSoldItemPopup.SaleDate;
dgvItemsTable.BeginEdit ( false );
dgvItemsTable.EndEdit ();
dgvItemsTable.NotifyCurrentCellDirty ( true );
dgvItemsTable.CurrentCell = dgvItemsTable.Rows[currentRowBeingEdited].Cells[salePriceColumn];
dgvItemsTable.Rows[currentRowBeingEdited].Cells[salePriceColumn].Value = formSoldItemPopup.SalePrice;
dgvItemsTable.BeginEdit ( false );
dgvItemsTable.EndEdit ();
dgvItemsTable.NotifyCurrentCellDirty ( true );
dgvItemsTable.CurrentCell = dgvItemsTable.Rows[currentRowBeingEdited].Cells[expensesColumn];
dgvItemsTable.Rows[currentRowBeingEdited].Cells[expensesColumn].Value = formSoldItemPopup.Expenses;
dgvItemsTable.BeginEdit ( false );
dgvItemsTable.EndEdit ();
dgvItemsTable.NotifyCurrentCellDirty ( true );
dgvItemsTable.CurrentCell = dgvItemsTable.Rows[currentRowBeingEdited].Cells[expenseTypeColumn];
dgvItemsTable.Rows[currentRowBeingEdited].Cells[expenseTypeColumn].Value = formSoldItemPopup.ExpenseType;
dgvItemsTable.BeginEdit ( false );
dgvItemsTable.EndEdit ();
dgvItemsTable.NotifyCurrentCellDirty ( true );
dgvItemsTable.CurrentCell = dgvItemsTable.Rows[currentRowBeingEdited + 1].Cells[itemIDColumn];
dgvItemsTable.CommitEdit ( DataGridViewDataErrorContexts.CurrentCellChange );
dgvItemsTable.EndEdit ();
UpdateItemsDatabase ();
}
解决方案
好吧,我终于知道发生了什么。通过跟踪对 DataTable 的更改,我发现在 DataRow 级别接受更改会清除 DataTable 级别的更改。下面是完美运行的最终代码。
DataTable dataTableSold = dataSetItems.Tables["Table"];
DataRow[] dataRowSold = dataTableSold.Select ( "[" + itemIDColumn + "] = '" + itemID + "'" );
dgvItemsTable.BeginEdit ( false );
dataRowSold[0].BeginEdit ();
dataRowSold[0][salesChannelIDColumn] = salesChannelID;
dataRowSold[0][salePriceColumn] = formSoldItemPopup.SalePrice;
dataRowSold[0][saleDateColumn] = formSoldItemPopup.SaleDate;
dataRowSold[0][expensesColumn] = formSoldItemPopup.Expenses;
dataRowSold[0][expenseTypeColumn] = formSoldItemPopup.ExpenseType;
dataRowSold[0].EndEdit ();
dgvItemsTable.Update ();
UpdateItemsDatabase ();
推荐阅读
- node.js - 是否可以将一种方法放入 nodejs 中的另一个文件并表达?
- java-8 - 为什么在Consumer功能接口中使用andThen?
- python-3.x - 如何为python字典使用if else条件?
- android - 如果指纹不起作用,如何设置回退方法
- javascript - Javascript拖放交换:一种填补空白的方法
- reactjs - ReactJS:React CountUp 在可见性传感器中仅可见一次
- javascript - 如何使标签同时适用于输入和输出
- python - if 语句对某些输入行为不端
- authentication - 如何使用 asp.net core api 在其标头中授权带有 x-auth-token 的请求?
- android-studio - 在android studio的exoplayer中添加特定时间显示弹出框