在前台DataGrid里写了一个栏位, 其余的栏位是根据获取的DataTable动态绑上去的
如果每次根据DataGrid的栏位数是否是1来决定添加栏位,那么可能存在这样一种情况:
比如上一次回发绑定的时候,DataGird.Columns =5
现在改变了某个条件,获取的DataTable.Columns 数小于5
这样在绑定的时候 (DataGridTeam.DataSource = chargeUnitTable)
由于栏位数量不匹配,页面抛错
后来请教同事,做了如下修改:
即每次绑的时候,移出之前动态添加的栏位(只留下前台写的那个栏位)
然后重新绑定即可
该bug比较隐蔽 ,只有当获取的DataTable的栏位数小于DataGrid栏位数时,页面才会抛错
反之,则不会
看来QA还是蛮厉害的,抓苍蝇这么仔细。。。
附代码:
private void BindDataGrid(DataSet data)
{
DataTable chargeUnitTable = GetChargeUnitTeamData((int)EISBindType.Summary,data);
// if (DataGridTeam.Columns.Count == 1)
{
//todo
}
while (DataGridTeam.Columns.Count > 1)
{
DataGridTeam.Columns.RemoveAt(DataGridTeam.Columns.Count - 1);
}
for (int i = 2; i < chargeUnitTable.Columns.Count; i++)
{
string columnName = (string)chargeUnitTable.Columns[i].ColumnName;
BoundColumn dataGridColumnNew = new BoundColumn();
dataGridColumnNew.HeaderText = Server.HtmlEncode(columnName);
dataGridColumnNew.HeaderStyle.HorizontalAlign = HorizontalAlign.Right;
dataGridColumnNew.DataField = columnName;
dataGridColumnNew.ItemStyle.HorizontalAlign = HorizontalAlign.Right;
dataGridColumnNew.DataFormatString = "{0:F}";
if (i == chargeUnitTable.Columns.Count - 1)
{
dataGridColumnNew.ItemStyle.CssClass = "ItemLastColumn";
dataGridColumnNew.HeaderStyle.CssClass = "ItemLastColumn";
}
DataGridTeam.Columns.Add(dataGridColumnNew);
}
DataGridTeam.DataSource = chargeUnitTable;
DataGridTeam.DataBind();
}
private DataTable GetChargeUnitTeamData(int type,DataSet chargeUnitData)
{
DataTable chargeUnitTable = new DataTable();
DataColumn teamIDColumn = new DataColumn("TeamID");
chargeUnitTable.Columns.Add(teamIDColumn);
chargeUnitTable.PrimaryKey = new DataColumn[] {teamIDColumn}; //设为主键
chargeUnitTable.Columns.Add("TeamCode");
if (chargeUnitData.Tables[0].Rows.Count > 0)
{
for (int i = 0; i < chargeUnitData.Tables[0].Rows.Count; i++)
{
string chargeUnit = (string)chargeUnitData.Tables[0].Rows[i]["ChargeUnit"];
if (!chargeUnitTable.Columns.Contains(chargeUnit))
{
DataColumn columnNew = new DataColumn(chargeUnit, System.Type.GetType("System.Decimal"));
columnNew.DefaultValue = 0;
chargeUnitTable.Columns.Add(columnNew);
}
}
for (int i = 0; i < chargeUnitData.Tables[0].Rows.Count; i++)
{
int teamID = (int)chargeUnitData.Tables[0].Rows[i]["TeamID"];
string teamCode = (string)chargeUnitData.Tables[0].Rows[i]["TeamCode"];
string chargeUnit = (string)chargeUnitData.Tables[0].Rows[i]["ChargeUnit"];
decimal manpower = Math.Round((decimal)chargeUnitData.Tables[0].Rows[i]["Manpower"], 2);
if (chargeUnitTable.Rows.Contains(teamID))
{
//如果该栏位名已经存在,做Update工作
DataRow chargeUnitRow = chargeUnitTable.Select("TeamID = " + teamID.ToString())[0];
chargeUnitRow.BeginEdit();
chargeUnitRow[chargeUnit] = manpower;
chargeUnitRow.EndEdit();
}
else
{
//如果该栏位名不存在,做insert工作
DataRow chargeUnitRowNew = chargeUnitTable.NewRow();
chargeUnitRowNew["TeamID"] = teamID;
chargeUnitRowNew["TeamCode"] = teamCode;
chargeUnitRowNew[chargeUnit] = manpower;
chargeUnitTable.Rows.Add(chargeUnitRowNew);
}
}
chargeUnitTable = ReturnChargeUnitData(chargeUnitTable);
if (type == (int)EISBindType.Summary)
{
DataRow totalRow = chargeUnitTable.NewRow();
totalRow["TeamID"] = -1;
totalRow["TeamCode"] = "Total";
for (int i = 2; i < chargeUnitTable.Columns.Count; i++)
{
string columnName = chargeUnitTable.Columns[i].ColumnName;
totalRow[columnName] = (decimal)chargeUnitTable.Compute("SUM([" + columnName + "])", "true");
}
chargeUnitTable.Rows.Add(totalRow);
}
}
return chargeUnitTable;
}