Winforms DataContext.GetChangeSet显示更新,但不显示插入
我使用LINQtoSQL和存储过程来查询一个简单的数据库。在我的表单上,我有一个datagridview,其中包含一些查询字段的控件。用户键入街道名称/编号/方向等,然后在数据网格中返回结果。网格使用bindingSource和bindingNavigator来获得结果。我可以导航,从DAL中以列表的形式返回结果,并调用运行良好的更新存储过程。但是,当我使用内置命令添加新记录时,它成功地将该记录添加到网格中,但是当我尝试在DataContext的DAL中使用GetChangeSet时,我显示了0个插入 因此,DataContext正在跟踪我对现有记录的更改,但没有看到任何添加的记录。我在DAL中使用私有静态datacontext。我想问题是如何添加新记录并将其传递到我的存储过程方法??我看不到任何从bindingsource获取添加记录的方法,或者如何使用网格查看是否需要添加新记录 UI/表单中调用我的DAL的代码Winforms DataContext.GetChangeSet显示更新,但不显示插入,winforms,linq-to-sql,datacontext,Winforms,Linq To Sql,Datacontext,我使用LINQtoSQL和存储过程来查询一个简单的数据库。在我的表单上,我有一个datagridview,其中包含一些查询字段的控件。用户键入街道名称/编号/方向等,然后在数据网格中返回结果。网格使用bindingSource和bindingNavigator来获得结果。我可以导航,从DAL中以列表的形式返回结果,并调用运行良好的更新存储过程。但是,当我使用内置命令添加新记录时,它成功地将该记录添加到网格中,但是当我尝试在DataContext的DAL中使用GetChangeSet时,我显示了0
private void btnSearch_Click(object sender, EventArgs e)
{
// Call search query
spSearchCardsResultBindingSource.DataSource =
SideSewer.QueryCards(permit:txtPermit.Text,
parcel: txtParcel.Text, streetNum: nullNum1,
streetNum2: nullNum2, streetDirection: cbDirection.Text,
streetName: txtName.Text, streetType: cbType.Text,
inspected: inspectedNull, includeAliases: ckbxAlias.Checked);
}
private void saveToolStripButton_Click(object sender, EventArgs e)
{
// This line below actually WORKS, yet it just adds the record
// user currently has selected may NOT be the NEW one!!
SideSewer.InsertData((PermitInfo)spSearchCardsResultBindingSource.Current);
if (!SideSewer.save())
MessageBox.Show("There was a problem saving the record(s)");
}
下面是查询记录和执行保存的代码。保存用于更新,但每当我在网格中添加记录时,它就会将其添加到PermitInfo列表中,但不会显示在GetChangeSet中
private static SideSewerDataContext _dc = new SideSewerDataContext();
public static List<PermitInfo> QueryCards(string permit = null,
string parcel = null, int? streetNum = null, int? streetNum2 = null,
string streetDirection = null,string streetName = null,
string streetType = null,DateTime? inspected = null, bool? includeAliases = null)
{
try
{
return dc.spSearchCards(permit, parcel, streetNum, streetNum2,
streetDirection, streetName, streetType, inspected, includeAliases).ToList();
}
catch (SqlException ex)
{
MessageBox.Show("Error: " + ex.Message,"Error Occured!",MessageBoxButtons.OK,MessageBoxIcon.Error);
return null;
}
}
public static bool save()
{
ChangeSet cs = _dc.GetChangeSet();
try
{
foreach (var obj in cs.Updates)
{
if (obj is PermitInfo)
{
PermitInfo pInfo = (PermitInfo)obj;
_dc.spUpdatePermitInfo(pInfo.ID, pInfo.Permit, pInfo.Parcel, pInfo.StreetNumber, pInfo.StreetNumberSuffix, pInfo.StreetDirection, pInfo.StreetName, pInfo.StreetType, pInfo.Inspected, Environment.UserName.ToUpper());
}
}
foreach (var obj in cs.Inserts)
{
if (obj is PermitInfo)
{
PermitInfo pInfo = (PermitInfo)obj;
_dc.spInsertPermitInfo(Environment.UserName.ToUpper(), pInfo.Permit, pInfo.Parcel, pInfo.StreetNumber, pInfo.StreetNumberSuffix, pInfo.StreetDirection, pInfo.StreetName, pInfo.StreetType, pInfo.Inspected);
}
}
return true;
}
catch (Exception ex)
{
System.Windows.Forms.MessageBox.Show(ex.Message);
return false;
}
}
提前感谢所有看到这一点的人,他们可以让我了解我做错了什么,或者如何去做我需要完成的事情 为什么要手动执行此操作?您可以在DataContext上调用.SubmitChanges。我有一些历史记录/日志记录表,因此当任何人删除/插入/更新记录时,我存储的进程也会将记录添加到这些表中,对于environment.username等字段,我在实体行为中看不到任何方式将存储的进程绑定到insert,而是使用environment.username等变量,因此,我使用所需的参数手动调用存储的过程。我注意到,如果将DataGridView.DataSource设置为BindingSource,然后将BindingSource.DataSource设置为从DAL返回的IList,则它将不起作用。如果我只是设置从DAL返回的DataGridView.DataSource=IList,它将插入我添加的行。。。