在信息的变更过程中,比如计划的变更,表单基本信息的变更等,希望可以在一个列表中展现出该行数据是新增的,还是被删除的,还是被修改过的。在本文中,信息变更之前存在数据表A中,变更之后数据存放在表B中。如果不仔细思考的话,一般情况下,大家会通过拿出两个表的数据,每个表的每行记录都更另一个表的所有记录做对比,来判断该记录是新增的,还是被删除的,还是被修改过的,本文介绍一种简单的方式。
场景描述:
在信息的变更过程中,比如计划的变更,表单基本信息的变更等,希望可以在一个列表中展现出该行数据是新增的,还是被删除的,还是被修改过的。在本文中,信息变更之前存在数据表A中,变更之后数据存放在表B中。如果不仔细思考的话,一般情况下,大家会通过拿出两个表的数据,每个表的每行记录都跟另一个表的所有记录做对比,来判断该记录是新增的,还是被删除的,还是被修改过的,下面介绍一种简单的方式。
sql描述:
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
select Status=(
case
when n.NodeID is null then 'Added'
when cmd.NodeID is null then 'Deleted'
else 'Modified'
end
),
TdName=(
case
when cmd.TdName is null then n.TdName
else cmd.TdName
end
)
from
(
select cmd.NodeID,
cmd.TDName
from 表B cmd
where 查询条件
) cmd
full join
(
select n.NodeID,n.TDName
from 表A n
where 查询条件
) n
on cmd.nodeid = n.nodeid
关键是注意看伪列Status的含义,以及为什么要使用full join.
后台CS文件中处理:
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
protected void gvChangeProjectList_RowDataBound(object sender,GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
DataRowView drv = e.Row.DataItem as DataRowView;
int columns = drv.DataView.Table.Columns.Count;
if (drv["Status"].ToString() == "Added")
{
e.Row.Attributes.Add("title", "新建");
e.Row.BackColor = Color.FromArgb(0x66, 0xcc, 0xff);
}
else if (drv["Status"].ToString() == "Deleted")
{
e.Row.Attributes.Add("title", "删除");
e.Row.BackColor = Color.FromArgb(0xff, 0x66, 0x33);
}
else
{
for (int i = 要对比的第一个列; i < 要对比的最后一个列; i++)
{
TableCell tableCell = e.Row.Cells[i - 1]; //数据源中的列比列表中的列序号大1
bool equal = false;
int org = i + 要对比的列数;
if (drv[i] == DBNull.Value && drv[org] == DBNull.Value)
{
equal = true;
}
else if (drv[i] == DBNull.Value || drv[org] == DBNull.Value)
{
equal = false;
}
else
{
if (drv[i].GetType() == typeof(string))
{
equal = (string)(drv[i]) == (string)(drv[org]);
}
else if ( drv[i].GetType() == typeof(short) || drv[i].GetType() == typeof(int) )
{
equal = ( drv[i].ToString().Trim() == drv[org].ToString().Trim() );
}
else if (drv[i].GetType() == typeof(DateTime))
{
equal = ((DateTime)(drv[i])).ToString("yyyy-MM-dd") == ((DateTime)(drv[org])).ToString("yyyy-MM-dd");
}
else if (drv[i].GetType() == typeof(bool))
{
equal = (bool)(drv[i]) == (bool)(drv[org]);
}
}
if (!equal)
{
string result = string.Empty;
if (drv[org].GetType() == typeof(DateTime))
{
result = string.Format("修改前数据: {0}", drv[org] == DBNull.Value ? string.Empty : ((DateTime)drv[org]).ToString("yyyy-MM-dd"));
}
else
{
result = string.Format("修改前数据: {0}", drv[org]);
}
tableCell.ToolTip = result;
tableCell.BackColor = Color.Yellow;
}
}
}
}
}