2

ボタンをクリックして、テーブル コントロールに行を追加したいと考えています。以下のコードを使用してみましたが、エラーが発生しました。誰か助けてもらえますか?

protected void btn_Click(object sender, EventArgs e)
{
    //Table table = (Table)Page.FindControl("tblName");
    TableRow tr = new TableRow();
    tr.Cells.Add(new TableCell());
    tr.Cells.Add(new TableCell());
    tr.Cells.Add(new TableCell());
    tr.Cells[0].Text = TextBox1.Text;
    tr.Cells[1].Text = TextBox2.Text;
    tr.Cells[2].Text = TextBox3.Text;
    //add the row to the existing table.
    this.tblName.Rows.Add(tr);
    //this.tblName.Rows.Add();
}

------------------asp.net-------------------------

  <form id="form1" runat="server">
<div>
    <asp:Button ID="Button1" runat="server" Text="Button" onclick="btn_Click" />
    <table id="tblName" Runat="server" style="width:100%;">
        <tr>
            <td>
                <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox></td>
            <td>
               <asp:TextBox ID="TextBox2" runat="server"></asp:TextBox></td>
            <td>
               <asp:TextBox ID="TextBox3" runat="server"></asp:TextBox></td>
        </tr>

    </table>
    <br />
</div>
</form>
4

1 に答える 1

1

テーブルのタイプが であるため、System.Web.UI.WebControls.TableRow使用する必要はありません。System.Web.UI.HtmlControls.HtmlTableRowSystem.Web.UI.HtmlControls.HtmlTable

とにかく、既存のコードにはロジックが欠けています。これは、以前に追加したものを上書きして、常に 1 つの行のみを追加するためです。追加を続けるには、既に追加したものをどこかに保存する必要があります。理想的な場所は ViewState コレクションです。

最適化されたコードは次のようになります。

//build array of new values
string[] currentValues = new string[] { TextBox1.Text, TextBox2.Text, TextBox3.Text };

//get list from view state and append new values
List<string[]> tableRowValues = (List<string[]>)ViewState["AppendedRows"];
if (tableRowValues == null)
    tableRowValues = new List<string[]>();
tableRowValues.Add(currentValues);

//add rows to table
tableRowValues.ForEach(values =>
{
    System.Web.UI.HtmlControls.HtmlTableRow tr = new System.Web.UI.HtmlControls.HtmlTableRow();
    foreach (string value in values)
    {
        System.Web.UI.HtmlControls.HtmlTableCell cell = new System.Web.UI.HtmlControls.HtmlTableCell();
        cell.InnerHtml = value;
        tr.Cells.Add(cell);
    }
    this.tblName.Rows.Add(tr);
});

//update global container
ViewState["AppendedRows"] = tableRowValues;
于 2013-09-15T09:20:22.507 に答える