我有两张表格。 First表单用于创建/更新一个人,并有一个第二个表单的按钮,该表单使用DevExpress GridControl将信息保存给一个人的孩子。
即使他刚刚创建了一个新人,我也让用户选择CRUD孩子的形式(可能是我的设计失败,但那是另一回事)。当他们完成填充孩子的细节后,他们可以点击" save"或者"取消并退出"纽扣。如果他们点击了#34;取消.."我需要基础子DataTable恢复到以前的状态。我尝试了BindingSource的CancelEdit()方法但没有成功。然后我试着做下一件事:
void CancelBtn_Click(Object sender,EventArgs e)
{
DataTable dt = (DataTable)BindingSource.DataSouce as DataTable;
dt.RejectChanges();
}
如果您第一次打开并CRUD儿童网格并点击保存,并且在您第二次打开时执行其他操作并点击取消它还会恢复您的第一次保存操作,因为只有当用户完成创建完成后才会更新数据库并点击" save"在个人表格上,而不是在儿童之间形成更新。
我手动处理关系,所以我必须首先创建人员行和ID,然后才将孩子保存到数据库。
我做错了吗?
答案 0 :(得分:0)
您需要使用其他DataTable
变量来保存第二个表单的值,并将此变量用作GridControl.DataSource
而不是BindingSource
。当用户点击保存按钮时,您需要更新详细信息表。
以下是示例:
<强> 0。为您的第二张表单创建DataTable
:
var secondFormTable = new DataTable();
foreach (DataColumn column in detailsTable.Columns)
secondFormTable.Columns.Add(column.ColumnName, column.DataType);
secondFormTable.Columns.Add("DetailsRow", typeof(DataRow));
foreach (var detailsRow in detailsTable.Select("Some filter to get child rows"))
{
var secondFormRow = secondFormTable.Rows.Add(detailsRow.ItemArray);
secondFormRow["DetailsRow"] = detailsRow;
}
secondFormTable.AcceptChanges();
secondFormGridControl.DataSource = secondFormTable;
当用户点击保存按钮时,您需要更新详细信息表。
<强> 1。从secondFormTable
更新详细信息表:
void SaveBtn_Click(Object sender, EventArgs e)
{
var secondFormTable = (DataTable)secondFormGridControl.DataSouce;
foreach (DataRow secondFormRow in secondFormTable.Rows)
switch (secondFormRow.RowState)
{
case DataRowState.Added:
case DataRowState.Modified:
DataRow detailsRow;
if (secondFormRow.RowState == DataRowState.Added)
{
detailsRow = detailsTable.NewRow();
detailsTable.Rows.Add(detailsRow);
}
else
detailsRow = (DataRow)secondFormRow["DetailsRow"];
foreach (DataColumn column in detailsTable.Columns)
detailsRow[column] = secondFormRow[column.ColumnName];
break;
case DataRowState.Deleted:
((DataRow)secondFormRow["DetailsRow", DataRowVersion.Original]).Delete();
break;
}
}