最近做一个报表,用户需要数据根据查询条件来动态显示。在实际实现过程中,涉及以下几个问题点:
1、GridView表头(多行)动态生成
2、数据行动态生成
完成样式如下:
贴出代码:
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 public partial class TotalYield : System.Web.UI.Page 2 { 3 protected string strConnectionString; 4 protected OracleParameter[] objCommandParameters = new OracleParameter[10]; 5 protected string err; 6 protected OracleConnection conn; 7 protected CommonClass.DBClass DB = new DBClass(); 8 9 protected void Page_Load(object sender, EventArgs e) 10 { 11 strConnectionString = DB.Get_Connect_String("AZAIT"); 12 conn = new OracleConnection(strConnectionString); 13 conn.Open(); 14 if (!Page.IsPostBack) 15 { 16 InitProduct(conn); 17 LoadDateAndTime(sender, e); 18 InitLine(); 19 conn.Close(); 20 } 21 } 22 23 protected void imbtn_search_Click(object sender, ImageClickEventArgs e) 24 { 25 DataTable dt =new DataTable (); 26 DataTable dt_group = BindData(); 27 28 switch (ddl_yield_type.SelectedValue) 29 { 30 case "0": 31 32 #region[定義列] 33 string[] strColumn = new string[] { "Station", "Goal", "Line", "Fresh_Input", "Fresh_Pass", "Fresh_Yield", "Control_Input", "Control_Pass", "Control_Yield", "Rework_Input", "Rework_Pass", "Rework_Yield", "Repair_Input", "Repair_Pass", "Repair_Yield", "Total_Input", "Total_Pass", "Total_Yield" }; 34 foreach (string column in strColumn) 35 { 36 DataColumn dc = new DataColumn(column, Type.GetType("System.String")); 37 dt.Columns.Add(dc); 38 } 39 #endregion 40 41 #region[定義行] 42 foreach (DataRow drr in dt_group.Rows) 43 { 44 DataRow dr = dt.NewRow(); 45 46 string line = drr["LINE_NAME"].ToString().Trim(); 47 string station = drr["STATION_NAME"].ToString().Trim(); 48 DataRow[] drs_fresh = dt_group.Select(GetFilter("Fresh_Yield",line,station)); 49 DataRow[] drs_control = dt_group.Select(GetFilter("Control_Yield", line, station)); 50 DataRow[] drs_rework = dt_group.Select(GetFilter("Rework_Yield", line, station)); 51 DataRow[] drs_repair = dt_group.Select(GetFilter("Repair_Yield", line, station)); 52 53 dr[0] = station; 54 dr[1] = drr["GOAL_YIELD"]; 55 dr[2] = line; 56 dr[3] = drs_fresh.Length > 0 ? drs_fresh[0]["INPUT_QTY"] : 0; 57 dr[4] = drs_fresh.Length > 0 ? drs_fresh[0]["PASS_QTY"] : 0; 58 dr[5] = drs_fresh.Length > 0 ? ShowYield(drs_fresh[0]["YIELD"]) : "N/A"; 59 60 dr[6] = drs_control.Length > 0 ? drs_control[0]["INPUT_QTY"] : 0; 61 dr[7] = drs_control.Length > 0 ? drs_control[0]["PASS_QTY"] : 0; 62 dr[8] = drs_control.Length > 0 ? ShowYield(drs_control[0]["YIELD"]) : "N/A"; 63 64 dr[9] = drs_rework.Length > 0 ? drs_rework[0]["INPUT_QTY"] : 0; 65 dr[10] = drs_rework.Length > 0 ? drs_rework[0]["PASS_QTY"] : 0; 66 dr[11] = drs_rework.Length > 0 ? ShowYield(drs_rework[0]["YIELD"]) : "N/A"; 67 68 dr[12] = drs_repair.Length > 0 ? drs_repair[0]["INPUT_QTY"] : 0; 69 dr[13] = drs_repair.Length > 0 ? drs_repair[0]["PASS_QTY"] : 0; 70 dr[14] = drs_repair.Length > 0 ? ShowYield(drs_repair[0]["YIELD"]) : "N/A"; 71 72 dr[15] = ToInt(dr[3]) + ToInt(dr[6]) + ToInt(dr[9]) + ToInt(dr[12]); 73 dr[16] = ToInt(dr[4]) + ToInt(dr[7]) + ToInt(dr[10]) + ToInt(dr[13]); 74 dr[17] = ComputeYield(ToInt(dr[15]),ToInt(dr[16])); 75 76 dt.Rows.Add(dr); 77 } 78 #endregion 79 80 #region [去掉重複行] 81 dt = new DataView(dt).ToTable(true, strColumn); 82 #endregion 83 84 #region[LineCumYield] 85 if (ddlLine.SelectedItem.Text == "ALL") 86 { 87 DataTable dtl = GetLine(); 88 foreach (DataRow dr in dtl.Rows) 89 { 90 DataRow dr_line = dt.NewRow(); 91 dr_line[0] = "Line Cum Yield:"; 92 dr_line[1] = "99%"; 93 dr_line[2] = dr["NAMEE"]; 94 dr_line[5] = GetCumYield(dr["NAMEE"].ToString(), "Fresh_Yield", "Fresh_Input", dt); 95 dr_line[8] = GetCumYield(dr["NAMEE"].ToString(), "Control_Yield", "Control_Input", dt); 96 dr_line[11] = GetCumYield(dr["NAMEE"].ToString(), "Rework_Yield", "Rework_Input", dt); 97 dr_line[14] = GetCumYield(dr["NAMEE"].ToString(), "Repair_Yield", "Repair_Input", dt); 98 double TotalYield = (ComputeTotalYield(dr_line[5]) * ComputeTotalYield(dr_line[8]) * ComputeTotalYield(dr_line[11]) * ComputeTotalYield(dr_line[14])); 99 dr_line[17] = (dr_line[5].ToString() == "N/A" && dr_line[8].ToString() == "N/A" && dr_line[11].ToString() == "N/A" && dr_line[14].ToString() == "N/A") ? "N/A" : TotalYield.ToString("P2"); 100 dt.Rows.Add(dr_line); 101 } 102 } 103 else 104 { 105 string line = ddlLine.SelectedItem.Text; 106 DataRow dr_line = dt.NewRow(); 107 dr_line[0] = "Line Cum Yield:"; 108 dr_line[1] = "99%"; 109 dr_line[2] = line; 110 dr_line[5] = GetCumYield(line, "Fresh_Yield", "Fresh_Input", dt); 111 dr_line[8] = GetCumYield(line, "Control_Yield", "Control_Input", dt); 112 dr_line[11] = GetCumYield(line, "Rework_Yield", "Rework_Input", dt); 113 dr_line[14] = GetCumYield(line, "Repair_Yield", "Repair_Input", dt); 114 double TotalYield = (ComputeTotalYield(dr_line[5]) * ComputeTotalYield(dr_line[8]) * ComputeTotalYield(dr_line[11]) * ComputeTotalYield(dr_line[14])); 115 dr_line[17] = (dr_line[5].ToString() == "N/A" && dr_line[8].ToString() == "N/A" && dr_line[11].ToString() == "N/A" && dr_line[14].ToString() == "N/A") ? "N/A" : TotalYield.ToString("P2"); 116 dt.Rows.Add(dr_line); 117 } 118 #endregion 119 BindGridView(dt, gv_data); 120 break; 121 case "1": 122 DefineTable("Fresh_Input", "Fresh_Pass", "Fresh_Yield", dt_group); 123 break; 124 case "2": 125 DefineTable("Control_Input", "Control_Pass", "Control_Yield", dt_group); 126 break; 127 case "3": 128 DefineTable("Rework_Input", "Rework_Pass", "Rework_Yield", dt_group); 129 break; 130 case "4": 131 DefineTable("Repair_Input", "Repair_Pass", "Repair_Yield", dt_group); 132 break; 133 default: 134 break; 135 } 136 137 } 138 139 private void DefineTable(string InputColumn, string PassColumn, string YieldColumn, DataTable DtGroup) 140 { 141 DataTable dt = new DataTable(); 142 #region[定義列] 143 string[] Columns = new string[] { "Station", "Goal", "Line", InputColumn, PassColumn, YieldColumn }; 144 foreach (string column in Columns) 145 { 146 DataColumn dc = new DataColumn(column, Type.GetType("System.String")); 147 dt.Columns.Add(dc); 148 } 149 #endregion 150 #region[定義行] 151 foreach (DataRow drr in DtGroup.Rows) 152 { 153 DataRow dr = dt.NewRow(); 154 string line = drr["LINE_NAME"].ToString().Trim(); 155 string station = drr["STATION_NAME"].ToString().Trim(); 156 DataRow[] drs = DtGroup.Select(GetFilter(YieldColumn, line, station)); 157 dr[0] = station; 158 dr[1] = drr["GOAL_YIELD"]; 159 dr[2] = line; 160 dr[3] = drs.Length > 0 ? drs[0]["INPUT_QTY"] : 0; 161 dr[4] = drs.Length > 0 ? drs[0]["PASS_QTY"] : 0; 162 dr[5] = drs.Length > 0 ? ShowYield(drs[0]["YIELD"]) : "N/A"; 163 dt.Rows.Add(dr); 164 } 165 #endregion 166 dt = new DataView(dt).ToTable(true, Columns); 167 #region[LineCumYield] 168 if (ddlLine.SelectedItem.Text == "ALL") 169 { 170 DataTable dt_line = GetLine(); 171 foreach (DataRow dr in dt_line.Rows) 172 { 173 DataRow dr_line = dt.NewRow(); 174 dr_line[0] = "Line Cum Yield:"; 175 dr_line[1] = "99%"; 176 dr_line[2] = dr["NAMEE"]; 177 dr_line[5] = GetCumYield(dr["NAMEE"].ToString(), YieldColumn, InputColumn, dt); 178 dt.Rows.Add(dr_line); 179 } 180 } 181 else 182 { 183 string line = ddlLine.SelectedItem.Text; 184 DataRow dr_line = dt.NewRow(); 185 dr_line[0] = "Line Cum Yield:"; 186 dr_line[1] = "99%"; 187 dr_line[2] = line; 188 dr_line[5] = GetCumYield(line, YieldColumn, InputColumn, dt); 189 dt.Rows.Add(dr_line); 190 } 191 #endregion 192 BindGridView(dt, gv_data); 193 } 194 195 private void BindGridView(DataTable dt,GridView gv) 196 { 197 gv_data.Columns.Clear(); 198 for (int i = 0; i < dt.Columns.Count; i++) 199 { 200 BoundField bfColumn = new BoundField(); 201 bfColumn.DataField = dt.Columns[i].ColumnName; 202 //bfColumn.HeaderText = dt.Columns[i].Caption; 203 gv_data.Columns.Add(bfColumn); 204 } 205 gv_data.DataSource = dt; 206 gv_data.DataBind(); 207 } 208 209 private string GetFilter(string YieldType,string line,string station) 210 { 211 string filter=""; 212 switch (YieldType) 213 { 214 case "Fresh_Yield": 215 filter = "is_msr=0 and is_rework=0 and is_repair=0 and line_name='" + line + "' and station_name='" + station + "'"; 216 break; 217 case "Control_Yield": 218 filter = "is_msr=1 and is_rework =0 and is_repair=0 and line_name='" + line + "' and station_name='" + station + "'"; 219 break; 220 case "Rework_Yield": 221 filter = "is_rework =1 and line_name='" + line + "' and station_name='" + station + "' "; 222 break; 223 case "Repair_Yield": 224 filter = "is_msr=0 and is_rework =0 and is_repair=1 and line_name='" + line + "' and station_name='" + station + "' "; 225 break; 226 default: 227 break; 228 } 229 return filter; 230 } 231 232 private string GetCumYield(string line,string YieldTypeColumn,string YieldInput,DataTable dt) 233 { 234 int TotalInput = 0; 235 DataRow[] drs = dt.Select("line='"+line+"'"); 236 double yield = 1.00; 237 if (drs.Length > 0) 238 { 239 foreach (DataRow dr in drs) 240 { 241 if (dr[YieldTypeColumn].ToString() != "N/A" && dr[YieldTypeColumn].ToString() != "0") 242 { 243 yield *= (Convert.ToDouble(dr[YieldTypeColumn].ToString().Replace("%", ""))) / 100; 244 } 245 if (Convert.ToInt16(dr[YieldInput]) != 0) 246 { 247 TotalInput += Convert.ToInt16(dr[YieldInput]); 248 } 249 } 250 if (TotalInput == 0) 251 { 252 return "N/A"; 253 } 254 else 255 { 256 return yield.ToString("P2"); 257 } 258 } 259 else 260 { 261 return "N/A"; 262 } 263 } 264 265 protected void imbtn_excel_Click(object sender, ImageClickEventArgs e) 266 { 267 Response.Clear(); 268 Response.Buffer = true; 269 Response.Charset = "utf-8"; 270 Response.AppendHeader("Content-Disposition", "attachment;filename=TotalYiedReport.xls"); 271 Response.ContentEncoding = System.Text.Encoding.GetEncoding("Big5"); 272 //System.Globalization.CultureInfo myCItrad = new System.Globalization.CultureInfo("ZH-TW", true); 273 Response.ContentType = "application/ms-excel"; 274 this.EnableViewState = false; 275 StringWriter sWrite = new StringWriter(); 276 HtmlTextWriter txtWrite = new HtmlTextWriter(sWrite); 277 gv_data.RenderControl(txtWrite); 278 Response.Write(sWrite.ToString()); 279 Response.End(); 280 } 281 public override void VerifyRenderingInServerForm(Control control) 282 { 283 284 } 285 protected void ddlProduct_SelectedIndexChanged(object sender, EventArgs e) 286 { 287 InitLine(); 288 } 289 290 private DataTable BindData() 291 { 292 DataTable dt = new DataTable(); 293 #region OracleParameter[] 294 OracleParameter[] OraParam = new OracleParameter[9]; 295 OraParam[0] = new OracleParameter("V_PRODUCT_NAME", OracleType.VarChar, 20); 296 OraParam[0].Value = ddlProduct.SelectedValue; 297 OraParam[1] = new OracleParameter("V_LINE_CODE", OracleType.VarChar, 20); 298 OraParam[1].Value = ddlLine.SelectedValue; 299 OraParam[2] = new OracleParameter("V_WO_NO", OracleType.VarChar, 20); 300 OraParam[2].Value = txtWO.Text.Trim(); 301 OraParam[3] = new OracleParameter("V_SKU_NO", OracleType.VarChar, 20); 302 OraParam[3].Value = txtSku.Text.Trim(); 303 OraParam[4] = new OracleParameter("V_START_DATE", OracleType.VarChar, 10); 304 OraParam[4].Value = txtDF.Text.Trim(); 305 OraParam[5] = new OracleParameter("V_END_DATE", OracleType.VarChar, 10); 306 OraParam[5].Value = txtDT.Text.Trim(); 307 OraParam[6] = new OracleParameter("V_START_TIME", OracleType.VarChar, 10); 308 OraParam[6].Value = ddlTF.SelectedValue; 309 OraParam[7] = new OracleParameter("V_END_TIME", OracleType.VarChar, 10); 310 OraParam[7].Value = ddlTT.SelectedValue; 311 OraParam[8] = new OracleParameter("P_CURSOR", OracleType.Cursor); 312 OraParam[8].Direction = ParameterDirection.Output; 313 #endregion 314 315 dt = DB.Execute_Return_DataTable("AZAIT", CommandType.StoredProcedure, "RT_AIT_DAILY_YIELD_ALL_PK.ALL_DAILY_YIELD_SP", OraParam, "BU"); 316 317 return dt; 318 } 319 320 #region Inition Query Condition Include Product 321 322 private void InitProduct(OracleConnection DBConn) 323 { 324 OracleParameter[] objCommandParameters = new OracleParameter[2]; 325 326 objCommandParameters[0] = new OracleParameter("RES", OracleType.VarChar, 20); 327 objCommandParameters[0].Direction = ParameterDirection.Output; 328 objCommandParameters[1] = new OracleParameter("P_CURSOR", OracleType.Cursor); 329 objCommandParameters[1].Direction = ParameterDirection.Output; 330 this.ddlProduct.Items.Clear(); 331 332 foreach (DataRow dr in DB.Execute_Return_DataTable(CommandType.StoredProcedure, 333 "RT_AIT_BASE_SEL_PK.GET_PRODUCT_SP", objCommandParameters, DBConn).Rows) 334 this.ddlProduct.Items.Add(new ListItem(dr[1].ToString(), dr[1].ToString())); 335 } 336 private void LoadDateAndTime(object sender, System.EventArgs e) 337 { 338 this.txtDF.Text = DateTime.Today.ToString("yyyy-MM-dd"); 339 this.txtDT.Text = DateTime.Today.ToString("yyyy-MM-dd"); 340 GetTurnTime("AZAIT", DateTime.Today.ToString("yyyy-MM-dd")); 341 ddlTurnTimes_SelectedIndexChanged(sender, e); 342 //txtDF.Attributes.Add("onpropertychange", "txtDFChange()"); 343 } 344 private void InitTime(string strConn, string turnDate) 345 { 346 objCommandParameters[0] = new OracleParameter("V_TURN_DATE", OracleType.VarChar, 20); 347 objCommandParameters[0].Value = turnDate; 348 objCommandParameters[1] = new OracleParameter("RES", OracleType.VarChar, 20); 349 objCommandParameters[1].Direction = ParameterDirection.Output; 350 objCommandParameters[2] = new OracleParameter("P_CURSOR", OracleType.Cursor); 351 objCommandParameters[2].Direction = ParameterDirection.Output; 352 this.ddlTF.Items.Clear(); 353 this.ddlTT.Items.Clear(); 354 foreach (DataRow dr in DB.Execute_Return_DataTable(strConn, CommandType.StoredProcedure, 355 "RT_AIT_BASE_SEL_PK.GET_WORK_TIME_BY_TURNDATE_SP", objCommandParameters, "BU").Rows) 356 { 357 this.ddlTF.Items.Add(new ListItem(dr[1].ToString(), dr[1].ToString())); 358 this.ddlTT.Items.Add(new ListItem(dr[2].ToString(), dr[2].ToString())); 359 } 360 ddlTF.SelectedIndex = 0; 361 ddlTT.SelectedIndex = 10; 362 } 363 364 private void GetTurnTime(string strConn, string startDate) 365 { 366 objCommandParameters[0] = new OracleParameter("V_START_DATE", OracleType.VarChar, 20); 367 objCommandParameters[0].Value = startDate; 368 objCommandParameters[1] = new OracleParameter("RES", OracleType.VarChar, 20); 369 objCommandParameters[1].Direction = ParameterDirection.Output; 370 objCommandParameters[2] = new OracleParameter("P_CURSOR", OracleType.Cursor); 371 objCommandParameters[2].Direction = ParameterDirection.Output; 372 ddlTurnTimes.Items.Clear(); 373 374 foreach (DataRow dr in DB.Execute_Return_DataTable(strConn, CommandType.StoredProcedure, 375 "RT_AIT_BASE_SEL_PK.GET_TURN_TIMES_SP", objCommandParameters, "BU").Rows) 376 { 377 this.ddlTurnTimes.Items.Add(new ListItem(dr[1].ToString(), dr[0].ToString())); 378 } 379 ddlTurnTimes.SelectedIndex = 0; 380 InitTime("AZAIT", ddlTurnTimes.SelectedValue); 381 } 382 383 protected void txtDF_TextChanged(object sender, EventArgs e) 384 { 385 try 386 { 387 GetTurnTime("AZAIT", txtDF.Text); 388 InitLine(); 389 } 390 catch 391 { } 392 } 393 394 protected void txtDT_TextChanged(object sender, EventArgs e) 395 { 396 try 397 { 398 //GetTurnTime("AZAIT", txtDF.Text); 399 InitLine(); 400 } 401 catch 402 { } 403 } 404 405 406 protected void ddlTurnTimes_SelectedIndexChanged(object sender, EventArgs e) 407 { 408 InitTime("AZAIT", ddlTurnTimes.SelectedValue); 409 } 410 411 private void InitLine() 412 { 413 DataTable dt = GetLine(); 414 ddlLine.Items.Clear(); 415 ddlLine.Items.Add(new ListItem("ALL", "")); 416 foreach (DataRow dr in dt.Rows) 417 { 418 this.ddlLine.Items.Add(new ListItem(dr[1].ToString(), dr[2].ToString())); 419 } 420 421 } 422 423 424 private DataTable GetLine() 425 { 426 strConnectionString = DB.Get_Connect_String("AZAIT"); 427 conn = new OracleConnection(strConnectionString); 428 if (conn.State == ConnectionState.Closed) 429 { conn.Open(); } 430 431 DataTable dt = new DataTable(); 432 objCommandParameters[0] = new OracleParameter("V_MODEL", OracleType.VarChar, 20); 433 objCommandParameters[0].Value = ddlProduct.SelectedValue; 434 objCommandParameters[1] = new OracleParameter("V_DATE_FROM", OracleType.VarChar, 20); 435 objCommandParameters[1].Value = txtDF.Text + " " + ddlTF.SelectedValue; 436 objCommandParameters[2] = new OracleParameter("V_DATE_TO", OracleType.VarChar, 20); 437 objCommandParameters[2].Value = txtDT.Text + " " + ddlTT.SelectedValue; 438 objCommandParameters[3] = new OracleParameter("RES", OracleType.VarChar, 20); 439 objCommandParameters[3].Direction = ParameterDirection.Output; 440 objCommandParameters[4] = new OracleParameter("p_cursor", OracleType.Cursor); 441 objCommandParameters[4].Direction = ParameterDirection.Output; 442 443 dt = DB.Execute_Return_DataTable(CommandType.StoredProcedure, 444 "RT_AIT_BASE_SEL_PK.GET_LINE_NEW_SP", objCommandParameters, conn); 445 if (conn.State == ConnectionState.Open) 446 { conn.Close(); } 447 return dt; 448 } 449 #endregion 450 451 private int ToInt(object obj) 452 { 453 int res; 454 if (int.TryParse(obj.ToString().Trim(), out res)) 455 { 456 return res; 457 } 458 else 459 { 460 return 0; 461 } 462 } 463 464 private string ComputeYield(int i,int j) 465 { 466 if (i == 0) 467 { 468 return "N/A"; 469 } 470 else 471 { 472 double yield=(double)j / i; 473 if (yield < 0.99) 474 { 475 return yield.ToString("P2"); 476 //return "<span style='color:red'>"+yield.ToString("P2")+"</span>"; 477 } 478 else 479 { 480 return yield.ToString("P2"); 481 } 482 } 483 } 484 485 private double ComputeTotalYield(object obj) 486 { 487 double res; 488 double yield = 1.00; 489 string ores=obj.ToString().Replace("%","").Trim(); 490 if (ores == "N/A" || ores == "100" || ores == "0" || ores == "") 491 { 492 return 1.00; 493 } 494 if (double.TryParse(ores, out res)) 495 { 496 yield *= res/100; 497 } 498 return yield; 499 500 501 } 502 503 private string ShowYield(object obj) 504 { 505 double res; 506 507 if (double.TryParse(obj.ToString(), out res)) 508 { 509 if (res < 99) 510 { 511 return (res/100).ToString("P2") ; 512 } 513 else 514 { 515 return (res/100).ToString("P2"); 516 } 517 } 518 else 519 { 520 return "N/A"; 521 } 522 523 } 524 525 protected void gv_data_RowDataBound(object sender, GridViewRowEventArgs e) 526 { 527 if (e.Row.RowType == DataControlRowType.DataRow) 528 { 529 FormatCell(e.Row.Cells); 530 //e.Row.Attributes.Add("onmouseover", "currentcolor=this.style.backgroundColor;this.style.backgroundColor='#ccc';"); 531 //e.Row.Attributes.Add("onmouseout", "this.style.backgroundColor=currentcolor;"); 532 } 533 } 534 535 private void CreateTableHeader(TableCellCollection cells, string YieldType,int RowIndex) 536 { 537 538 string[] strColumns = new string[] { "Station","Goal","Line","Fresh", "Control", "Rework", "Repair", "Total" }; 539 switch (YieldType) 540 { 541 case "0": 542 if (RowIndex == 1) 543 { 544 for (int i = 0; i < strColumns.Length; i++) 545 { 546 cells.Add(new TableHeaderCell()); 547 if (i == strColumns.Length - 1) 548 { 549 cells[i].Text = strColumns[i] + "</th></tr><tr style=\"background-color:#DFE7F9;\">"; 550 } 551 else 552 { 553 cells[i].Text = strColumns[i]; 554 } 555 if (i == 0 || i == 1 || i == 2) 556 { 557 558 cells[i].Attributes.Add("rowspan", "2"); 559 } 560 else 561 { 562 cells[i].Attributes.Add("colspan", "3"); 563 } 564 } 565 } 566 else if (RowIndex == 2) 567 { 568 569 for (int i = 8; i < 21; i=i+3) 570 { 571 cells.Add(new TableHeaderCell()); 572 cells[i].Text = "Input"; 573 cells.Add(new TableHeaderCell()); 574 cells[i + 1].Text = "Pass"; 575 cells.Add(new TableHeaderCell()); 576 cells[i + 2].Text = "Yield"; 577 578 } 579 } 580 break; 581 case "1": 582 case "2": 583 case "3": 584 case "4": 585 if (RowIndex == 1) 586 { 587 for (int i = 0; i < 4; i++) 588 { 589 cells.Add(new TableHeaderCell()); 590 if (i == 3) 591 { 592 cells[i].Text = strColumns[int.Parse(YieldType) + 2] + "</th></tr><tr style=\"background-color:#DFE7F9;\">"; 593 cells[i].Attributes.Add("colspan", "3"); 594 } 595 else 596 { 597 cells[i].Text = strColumns[i]; 598 cells[i].Attributes.Add("rowspan", "2"); 599 } 600 } 601 } 602 else if (RowIndex == 2) 603 { 604 cells.Add(new TableHeaderCell()); 605 cells[4].Text = "Input"; 606 cells.Add(new TableHeaderCell()); 607 cells[5].Text = "Pass"; 608 cells.Add(new TableHeaderCell()); 609 cells[6].Text = "Yield"; 610 } 611 break; 612 default: 613 break; 614 } 615 } 616 617 private void FormatCell(TableCellCollection cell ) 618 { 619 List<int> ColumnIndex=new List<int> (); 620 switch (ddl_yield_type.SelectedValue) 621 { 622 case "0": 623 ColumnIndex.Add(5); 624 ColumnIndex.Add(8); 625 ColumnIndex.Add(11); 626 ColumnIndex.Add(14); 627 ColumnIndex.Add(17); 628 break; 629 case "1": 630 case "2": 631 case "3": 632 case "4": 633 ColumnIndex.Add(5); 634 break; 635 default: 636 break; 637 } 638 double res; 639 foreach(int index in ColumnIndex) 640 { 641 if(double.TryParse((cell[index].Text).Replace("%","").ToString(),out res)) 642 { 643 if (res<99) 644 { 645 cell[index].Style.Value = "Background-Color:red"; 646 } 647 } 648 } 649 650 } 651 652 protected void gv_data_PreRender(object sender, EventArgs e) 653 { 654 GridDecorator.MergeRows(gv_data); 655 } 656 657 protected void gv_data_RowCreated(object sender, GridViewRowEventArgs e) 658 { 659 if (e.Row.RowType == DataControlRowType.Header) 660 { 661 TableCellCollection tcHeader = e.Row.Cells; 662 tcHeader.Clear(); 663 //添加第一行表頭 664 CreateTableHeader(tcHeader, ddl_yield_type.SelectedValue, 1); 665 //添加第二行表頭 666 CreateTableHeader(tcHeader, ddl_yield_type.SelectedValue, 2); 667 } 668 } 669 670 }
问题点:
1、动态生成列的时候,每次绑定数据源都要清空现有列——gv_data.Columns.Clear();否则,实际数据显示时会累加各列。
2、动态生成表头的时候,函数要写在RowCreated里,且表头集合也要清空。TableCellCollection tcHeader = e.Row.Cells;tcHeader.Clear();否则,会造成表头错位。
3、表头若有多行,在每行的最后一个单元格末尾,要加上换行标记</th></tr><tr>。否则,表头会一直横向排列,无限扩展。