我已经看到了很多关于这方面的文章,但却无法让它发挥作用。我在C#WPF应用程序中有一个窗口,在加载时,根据预定义的查询成功填充数据表(由用户选择的上一个窗口改变)
填充逻辑在这里:
private void FillDataGrid()
{
string ConString = ConfigurationManager.ConnectionStrings["CONN"].ConnectionString;
string CmdString = string.Empty;
using (SqlConnection con = new SqlConnection(ConString))
{
CmdString = $@"select PGCL.Client_Name, PGG.Guarantee_Title, PGG.Guarantee_Desc_Org, PGGM.Target, PGG.Timing_Measurement, PGP.Month, PGP.Year, PGP.Quarter, PGP.Numerator, PGP.Denominator, PGP.Performance_Percent, PGP.Achieved_Flag, PGP.Performance_ID
from PGG
inner join PGC on PGC.Contract_ID = PGG.Contract_ID
inner join PGCL on PGCL.Client_ID = PGC.Contract_ID
inner join PGGM on PGGM.Guarantee_ID = PGG.Guarantee_ID
inner join PGP on PGP.Guarantee_ID = PGG.Guarantee_ID
Where PGP.Month = {this.monthNum.ToString()} and PGP.year = {this.yearNum.ToString()}
and PGC.Active_Flag = 'y'
and PGG.Department_Responsible_ID = {this.deptID.ToString()}
Order by Client_Name, Guarantee_Order asc";
SqlCommand cmd = new SqlCommand(CmdString, con);
SqlDataAdapter sda = new SqlDataAdapter(cmd);
DataTable dt = new DataTable("PG");
sda.Fill(dt);
DGPG.ItemsSource = dt.DefaultView;
}
}
这部分完美无缺。
我在PGP(上面的别名)表中有5列,我希望根据窗口关闭时的用户输入动态写入值(按几步)(并提示保存)。这样做会推荐什么方法?
即:如果用户为第5行的Numerator输入值'5',为第10行输入分母'7',我希望发生以下情况:
1)使用PGP.ID,插入PGP_History表(对于更改的历史日志) 2)相应地更新PGP表值。
如果有人能让我朝这个方向前进,我会非常感激吗?
谢谢你, 韦斯
我想我已经取得了一些进展,但现在仍然坚持下面,现在:
private void FillDataGrid()
{
string ConString = ConfigurationManager.ConnectionStrings["CONN"].ConnectionString;
string CmdString = string.Empty;
using (SqlConnection con = new SqlConnection(ConString))
{
CmdString = $@"select PGCL.Client_Name, PGG.Guarantee_Title, PGG.Guarantee_Desc_Org, PGGM.Target, PGG.Timing_Measurement, PGP.Month, PGP.Year, PGP.Quarter, PGP.Numerator, PGP.Denominator, PGP.Performance_Percent, PGP.Achieved_Flag, PGP.Performance_ID
from PGG
inner join PGC on PGC.Contract_ID = PGG.Contract_ID
inner join PGCL on PGCL.Client_ID = PGC.Contract_ID
inner join PGGM on PGGM.Guarantee_ID = PGG.Guarantee_ID
inner join PGP on PGP.Guarantee_ID = PGG.Guarantee_ID
Where PGP.Month = {this.monthNum.ToString()} and PGP.year = {this.yearNum.ToString()}
and PGC.Active_Flag = 'y'
and PGG.Department_Responsible_ID = {this.deptID.ToString()}
Order by Client_Name, Guarantee_Order asc";
SqlCommand cmd = new SqlCommand(CmdString, con);
SqlDataAdapter sda = new SqlDataAdapter(cmd);
DataTable dt = new DataTable("PG");
sda.Fill(dt);
DGPerformanceGuarantees.ItemsSource = dt.DefaultView;
}
}
private void Commit_Updates_Click(object sender, RoutedEventArgs e)
{
string ConString = ConfigurationManager.ConnectionStrings["CONN"].ConnectionString;
//string CmdString = string.Empty;
using (SqlConnection con = new SqlConnection(ConString))
{
//Update Logic
SqlCommand update = new SqlCommand("UPDATE PGP SET PGP.NUMERATOR = @Numerator, DENOMINATOR = @Denominator, PERFORMANCE_PERCENT = @Percent, ACHIEVED_FLAG = '@Achieved' WHERE PERFORMANCE_ID = @Performance_ID", con);
update.Parameters.Add(new SqlParameter("@Numerator", SqlDbType.Int, 5, "NUMERATOR"));
update.Parameters.Add(new SqlParameter("@Denominator", SqlDbType.Int, 5, "DENOMINATOR"));
update.Parameters.Add(new SqlParameter("@Percent", SqlDbType.Decimal, 18, "PERFORMANCE_PERCENT"));
update.Parameters["@Percent"].Precision = 18;
update.Parameters["@Percent"].Scale = 2;
update.Parameters.Add(new SqlParameter("@Achieved", SqlDbType.NVarChar, 1, "ACHIEVED_FLAG"));
update.Parameters.Add(new SqlParameter("@Performance_ID", SqlDbType.Int, 5, "Performance_ID"));
sda.UpdateCommand = update;
sda.Update(dt);
}
FillDataGrid();
}
我添加了一个按钮来触发更新。显然这不会编译,因为SQL数据适配器(sda)在按钮处理程序的上下文中不存在。
我该怎么做才能解决这个问题?
答案 0 :(得分:1)
有很多方法可以给这只猫上皮。
如果您想在每次更改单元格时进行更新,我会订阅DataGrid
的{{1}}事件,该事件基本上会在您更改单元格时通知您由用户提交。 (检查CellEditEnding
参数以找出实际编辑的列和单元格。这样,您可以撰写目标DataGridCellEditEndingEventArgs
语句,并仅更新已更改的单元格。
但是,听起来您希望在窗口关闭时进行批量更新。在这种情况下,UPDATE
会根据您将DataTable
分配给DataGrid
来跟踪对数据所做的更改。当您准备好提交更改时,请使用ItemsSource
来获取自上次调用DataTable.GetChanges
以来仅更改过的行的新DataTable
。执行更新(这次再次使用DataDatable.AcceptChanges
。请参阅Update method。)这样做的好处是可以在一次操作中处理所有更新和删除。一个缺点是 - 我相信 - 该行的每一列都将被更新,因此这会增加每次更新时传输到数据库服务器的信息量。无论如何,当您的更新完成后,请致电SqlDataAdapter
。
这应该让你走上正轨。希望这会有所帮助。