3

動的テーブルを作成して行を追加するチュートリアルを見つけました:

http://geekswithblogs.net/dotNETvinz/archive/2009/06/29/faq-dynamically-adding-rows-in-asp-table-on-button-click.aspx

テーブル内のすべての行を読み取ってから、セル内のテキストボックスの値を読み取るにはどうすればよいですか? 値はデータベース (SQL Server) のテーブルに入力されます。C# と asp.net を引き続き使用できますか? それとも Javascript を使用する必要がありますか?

誰かが私を助けてくれることを願っています。

これはコードです:

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>Dynamic Adding of Rows in ASP Table Demo</title>
</head>
<body>
    <form id="form1" runat="server">
    <asp:Button ID="Button1" runat="server" onclick="Button1_Click" Text="Add New Row" />
    </form>
    </body>
</html>

コードビハインド:

public partial class _Default1 : System.Web.UI.Page
{
    //A global variable that will hold the current number of Rows
    //We set the values to 1 so that it will generate a default Row when the page loads
    private int numOfRows = 1;

    protected void Page_Load(object sender, EventArgs e)
    {
        //Generate the Rows on Initial Load
        if (!Page.IsPostBack)
        {
            GenerateTable(numOfRows);
        }
    }

    protected void Button1_Click(object sender, EventArgs e)
    {
        if (ViewState["RowsCount"] != null)
        {
            numOfRows = Convert.ToInt32(ViewState["RowsCount"].ToString());
            GenerateTable(numOfRows);
        }
    }

    private void SetPreviousData(int rowsCount, int colsCount)
    {
        Table table = (Table)Page.FindControl("Table1");
        if (table != null)
        {
            for (int i = 0; i < rowsCount; i++)
            {
                for (int j = 0; j < colsCount; j++)
                {
                    //Extracting the Dynamic Controls from the Table
                    TextBox tb = (TextBox)table.Rows[i].Cells[j].FindControl("TextBoxRow_" + i + "Col_" + j);
                    //Use Request objects for getting the previous data of the dynamic textbox
                    tb.Text = Request.Form["TextBoxRow_" + i + "Col_" + j];
                }
            }
        }
    }

    private void GenerateTable(int rowsCount)
    {

        //Creat the Table and Add it to the Page
        Table table = new Table();
        table.ID = "Table1";
        Page.Form.Controls.Add(table);

        //The number of Columns to be generated
        const int colsCount = 3;//You can changed the value of 3 based on you requirements

        // Now iterate through the table and add your controls

        for (int i = 0; i < rowsCount; i++)
        {
            TableRow row = new TableRow();
            for (int j = 0; j < colsCount; j++)
            {
                TableCell cell = new TableCell();
                TextBox tb = new TextBox();

                // Set a unique ID for each TextBox added
                tb.ID = "TextBoxRow_" + i + "Col_" + j;
                // Add the control to the TableCell
                cell.Controls.Add(tb);
                // Add the TableCell to the TableRow
                row.Cells.Add(cell);
            }

            // And finally, add the TableRow to the Table
            table.Rows.Add(row);
        }

        //Set Previous Data on PostBacks
        SetPreviousData(rowsCount, colsCount);

        //Sore the current Rows Count in ViewState
        rowsCount++;
        ViewState["RowsCount"] = rowsCount;
    }
}
4

5 に答える 5

3

テーブルを動的に作成しているため、ページに静的に埋め込まれたコントロールのようにテーブルを参照することはできません。Table オブジェクトへの参照を取得するには、例のように、Page の ControlCollection でそれを見つけてキャストする必要があります。

Table table = (Table)Page.FindControl("Table1");

Table クラスには、ループする必要があるテーブル行コレクションが含まれています。行コレクションの各行にはセルのコレクションがあり、各セルにはテキスト ボックスとなる子コントロール(Controls プロパティを参照) が含まれます。

于 2013-02-05T17:32:19.183 に答える
2

こんにちは、この関数が以前のテキストボックスの値を読み込もうとしているのを見てみるとSetPreviousData、何か問題があります。SetPreviousData

 Table table = (Table)Page.FindControl("Table1");

この関数は再帰関数ではなく、テーブルがページのコンテナー内にある可能性があるため、常に NULL を返します。次の関数をコードに追加します。

private Control FindControlRecursive(Control root, string id)
{
    if (root.ID == id)
    {
        return root;
    }

    foreach (Control c in root.Controls)
    {
        Control t = FindControlRecursive(c, id);
        if (t != null)
        {
            return t;
        }
    }

    return null;
}

コードを変更します

Table table = (Table)Page.FindControl("Table1");

Table table = FindControlRecursive(Page , "Table1") as Table;

次のステップで、次のコードを変更しますSetPreviousData

tb.Text = Request.Form["TextBoxRow_" + i + "Col_" + j];

tb.Text = Request.Form[tb.UniqueID];

ブレークポイントを設定して結果を確認するのが難しい場合は、テーブルデータを返す関数を提供することをお知らせくださいdatatable

于 2013-02-05T18:13:19.143 に答える
0

動的テーブルの参照がうまくいかない、Microsoft のせいにする、

私はこれを使用します:

セッション List[YourObjectData] 内に保存し、 Page_Load に入るたびにテーブルに入力します

ここに番号2の解決策があります:

Default.aspx 内のどこか

<div class="specialTable">
    <asp:Table ID="Table1" runat="server"  />
</div>

コードビハインド:

protected void Page_Load(object sender, EventArgs e)
{
    FillDynamicTable();

    if (!IsPostBack)
    {

    }
}

private void FillDynamicTable()
{
    Table1.Rows.Clear(); //  Count=0 but anyways

    if (Session["Table1"] == null) return;

    foreach (var data in Session["Table1"] as List<MyObject>)
    {
        AddRow(data);
    }
}

private void AddRow(MyObject data)
{
    var row = new TableRow { Height = 50 };
    var cell = new TableCell();
    var label = new Label { Text = data.something, Width = 150 };
    cell.Controls.Add(label);
    row.Cells.Add(cell);
    Table1.Rows.Add(row);
}
于 2014-02-23T09:42:02.820 に答える
0
<script type="text/javascript">
       var StringToSend='';
       function fncTextChanged(newvalueadded) {
           if (StringToSend != '')
               StringToSend = StringToSend + ';' + newvalueadded;
           else
               StringToSend = newvalueadded;
           //alert(StringToSend); -- For Testing all values
           // now store the value of StringToSend into hidden field ---- HFTEXTVALUES to access it from server side.
         }

    </script>
     <asp:Button ID="Save" runat="server" onclick="SaveTextBoxValues_Click" Text="save" /> 
     <asp:Button ID="Button1" runat="server" onclick="Button1_Click" Text="Add New Row" /> 
    <asp:HiddenField ID="hfTextValues" runat="server" Visible="false" Value="" />

サーバ側 :

protected void Page_Load(object sender, EventArgs e)
{
    //Generate the Rows on Initial Load
    if (!Page.IsPostBack)
    {
        GenerateTable(numOfRows);
    }
}

protected void Button1_Click(object sender, EventArgs e)
{
    if (ViewState["RowsCount"] != null)
    {
        numOfRows = Convert.ToInt32(ViewState["RowsCount"].ToString());
        GenerateTable(numOfRows);
    }
}
protected void SaveTextBoxValues_Click(object sender, EventArgs e)
{
    string AllTextBoxValues = hfTextValues.Value;
    string[] EachTextBoxValue = AllTextBoxValues.Split('~');
    //here you would get all values, EachTextBoxValue[0] gives value of first textbox and so on.
}

private void GenerateTable(int rowsCount)
{

    //Creat the Table and Add it to the Page
    Table table = new Table();
    table.ID = "Table1";
    Page.Form.Controls.Add(table);

    //The number of Columns to be generated
    const int colsCount = 3;//You can changed the value of 3 based on you requirements

    // Now iterate through the table and add your controls

    for (int i = 0; i < rowsCount; i++)
    {
        TableRow row = new TableRow();
        for (int j = 0; j < colsCount; j++)
        {
            TableCell cell = new TableCell();
            TextBox tb = new TextBox();
            HiddenField hf = new HiddenField();
            // Set a unique ID for each TextBox added
            tb.ID = "tb" + i + j;
            hf.ID = "hf" + i + j;
            tb.Attributes.Add("onblur", "fncTextChanged(this.value);");
            // Add the control to the TableCell
            cell.Controls.Add(tb);
            // Add the TableCell to the TableRow
            row.Cells.Add(cell);
        }

        // And finally, add the TableRow to the Table
        table.Rows.Add(row);
    }
}

ご不明な点がございましたら、お知らせください。

もう1つ、値を保存して後で取得したい場合は、それに応じてコードを変更します。

于 2013-02-05T21:44:34.773 に答える