动态绑定DataGrid栏位时,注意栏位数量是否匹配
来源:互联网 发布:药品网络推广 编辑:程序博客网 时间:2024/05/18 17:24
在前台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;
}
- 动态绑定DataGrid栏位时,注意栏位数量是否匹配
- 动态设置单身栏位名
- oracle form builder动态加栏位
- 窗体建立时,显示栏位Default值
- Odoo8.0中允许用户动态调整TreeView栏位宽度
- Odoo8.0中允许用户动态调整TreeView栏位宽度
- 各个栏位的意义
- 获取栏位参数列表
- 显示table栏位资料
- 弹性栏位--弹性域
- TIPTOP 栏位跳转问题
- listview增加栏位, 数据
- input栏位自动大写
- oracle添加栏位
- 视图栏位超链接
- bootstrapTable 修改栏位值
- Oracle单栏位批量更新与多栏位批量更新
- dataGridView 增加栏位,但数据库中没有此栏位
- SODB RBSP EBSP区别
- 多媒体传输流控制
- SSO技术简介
- ActiveBPEL Designer整合到Eclipse
- [技巧]如何绕过MaxtoCode的15天限制
- 动态绑定DataGrid栏位时,注意栏位数量是否匹配
- http://tristones.viaspeip.com/archives/001130.html批处理文件备忘
- 浅谈数据库设计技巧
- ajax与atals
- 转换大写人民币
- 嵌入式数据库Perst.Net开发初谈
- (第四版中文版)[五]模式态对话框
- 获取数据库中的所有表
- 感觉意外的IsNumeric()函数