HTML générer rowspan dans une chaîne de table html

c# html html-agility-pack html-table

Question

J'ai le code suivant, qui ajoute rowspan à un datatable dans une chaîne html, mais je veux qu'il ne reçoive pas un paramètre datatable, mais qu'il reçoive en paramètre une chaîne html en C #.

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;
}

C'est le résultat que j'espère

résultat attendu

Réponse populaire

Il y a quelques problèmes avec le code et quelques façons d'améliorer votre code:

  1. <table border=1> manque les guillemets autour de 1 <table border=1> . Ce devrait être <table border='1'> .
  2. Il manque les <thead> et <tbody> autour des balises de rangée.
  3. Au lieu d'utiliser constamment += , utilisez un StringBuilder .
  4. Pour rendre votre code plus propre, vous pouvez modifier certaines de vos boucles for boucles foreach .

Votre code devrait être changé en quelque chose comme ceci:

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();
}

(Appliquez simplement les mêmes concepts au code du milieu que j'ai supprimé.)




Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi