2017-08-28 16 views
0

我有下面的代碼,它將rowspan添加到html字符串中的數據表中,但我希望它不會接收作爲參數的數據表,而是接收作爲參數的一個html字符串在C#中。HTML在html表中生成rowspan字符串

protected void Page_Load(object sender, EventArgs e) 
{ 
    DataTable dt = new DataTable(); 
    dt.Columns.Add("Subject"); 
    dt.Columns.Add("Code"); 
    dt.Columns.Add("Test"); 
    dt.Columns.Add("Class"); 
    dt.Rows.Add("Math", "9", "ABC", "D1"); 
    dt.Rows.Add("Math", "9", "ABD", "D2"); 
    dt.Rows.Add("Math", "9", "ABE", "D3"); 
    dt.Rows.Add("Math", "9", "ABF", "D4"); 
    dt.Rows.Add("Science", "91", "ABG", "D1"); 
    dt.Rows.Add("Science", "91", "ABH", "D2"); 
    dt.Rows.Add("Science", "91", "ABI", "D3"); 
    dt.Rows.Add("English", "191", "ABJ", "D1"); 
    Label1.Text = ConvertDataTableToHTML(dt); 

} 
public static string ConvertDataTableToHTML(DataTable dt) 
{ 
    string html = "<table border=1>"; 
    //add header row 
    html += "<tr>"; 
    for (int i = 0; i < dt.Columns.Count; i++) 
    { 
     html += "<td>" + dt.Columns[i].ColumnName + "</td>"; 
    } 
    html += "</tr>"; 
    //add rows 
    string sub = ""; 
    for (int i = 0; i < dt.Rows.Count; i++) 
    { 
     html += "<tr>"; 
     int count = dt.Select("Subject ='" + dt.Rows[i][0].ToString() + "'").Count(); 
     for (int j = 0; j < dt.Columns.Count; j++) 
     { 
      if (j < 2) 
      { 
       if (sub != dt.Rows[i][0].ToString()) 
       { 
        html += "<td rowspan='" + count + "'>" + dt.Rows[i][j].ToString() + "</td>"; 
       } 
       continue; 
      } 
      html += "<td>" + dt.Rows[i][j].ToString() + "</td>"; 
     } 
     sub = dt.Rows[i][0].ToString(); 
     html += "</tr>"; 
    } 
    html += "</table>"; 
    return html; 
} 

這是結果,我希望

expected result

+1

能否請您提供一個樣本,你的代碼實際上產生? –

+0

什麼不起作用?你是否收到錯誤?你得到的輸出是什麼,它與你想要的輸出不符?請提供更多詳細信息。由於您的問題目前是短語,因此很難說出問題所在。 –

回答

0

有幾件事情錯的代碼,和幾個方法可以提高代碼:

  1. <table border=1>缺少1附近的報價。它應該是<table border='1'>
  2. 您錯過了行標記周圍的<thead><tbody>標記。
  3. 而不是經常使用+=,使用StringBuilder
  4. 爲了使代碼更加清晰,可以將for環路中的一些更改爲foreach環路。

你的代碼應該改成這樣的:

public static string ConvertDataTableToHTML(DataTable dt) 
{ 
    StringBuilder builder = new StringBuilder(); 

    //add header row 
    builder.Append("<table border='1'><thead><tr>"); 
    foreach (DataColumn col in dt.Columns) 
    { 
     builder.Append("<td>"); 
     builder.Append(col.ColumnName); 
     builder.Append("</td>"); 
    } 

    builder.Append("</tr></thead><tbody>"); 

    //add rows 
    string sub = ""; 

    ... 

    builder.Append("</tbody></table>"); 

    return builder.ToString(); 
} 

(只要將相同的概念,我去掉中間代碼)