动态绑定DataGrid栏位时,注意栏位数量是否匹配

在前台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;
  }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值