动态绑定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;
  }

原创粉丝点击