0

我一直在尝试遵循一些教程和代码示例,但有些东西并没有像我预期的那样工作。

我在网页上有一系列文本框,我需要遍历每个文本框并将其值保存到数据库中。页面上的文本框数量会有所不同。我从数据库中加载它们。它们都被添加到一个表对象中。

TableCell cellb = new TableCell();
TextBox txtAnswer = new TextBox();
txtAnswer.TextMode = TextBoxMode.MultiLine;
txtAnswer.Rows = 2;
txtAnswer.ID = "field_" + dataRow["fieldID"].ToString();
txtAnswer.Text = "answer"; //this will be got from the database

cellb.Controls.Add(txtAnswer);

以便将文本框添加到表格行。然后我有一个保存按钮,其中包含以下代码

foreach (Control c in Page.Controls)
{
    foreach (Control childc in c.Controls) 
    {
        if (childc is TextBox)
        {
            TextBox tmpText = (TextBox)childc;
            tmpField = tmpText.ID.Split('_');
            fieldID = Convert.ToInt32(tmpField[1]);
            //save value to the database (eventually)
            debug.InnerHtml += tmpText.Text; //this just outputs the values for now
        }
    }
}

所以上面应该循环遍历所有页面控件并找到添加到 page_load 上的文本字段。但是,我现在想知道是否是因为它们不存在。所以当我保存页面时,它不知道控件。我可以看到表格控件,但里面什么都没有……有什么想法吗?!

4

3 回答 3

1

必须在每个页面请求上添加动态控件。最好在Init活动期间。当您遍历控件时,听起来它们还没有(再次)添加。

此外,如果您知道您的 TextBoxes 在特定控件中,您可能应该首先找到该控件,然后使用您正在使用的相同方法迭代控件。造成这种情况的两个原因是:效率,而且,在您的代码中,您只需从页面控件向下搜索两个级别。这可能没问题,但它包括不包含任何这些文本框的其他控件。

于 2012-12-17T13:39:57.590 回答
0

为什么不使用 Gridview 控件,然后使用 Texbox 制作自定义模板。然后在页面加载时,您可以添加所需的文本框,然后循环网格视图并保存数据。

于 2012-12-17T13:39:18.420 回答
0

第一件事。确保您没有在内部创建控件if (!isPostBack){}- 因为它们需要在每次回发时重新创建。

其次,我不相信您的循环会找到所有控件,因为它只会真正穿过第一级。

理想情况下,您应该递归搜索控件。

这是我使用的递归方法 - 这将有助于查找给定 ID 的所有控件。

    /// <summary> 
    /// Finds a Control recursively. Note finds the first match that exists 
    /// </summary> 
    /// <param name="ContainerCtl">Should be the lowest container in the heirarchy, for eg dont choose Master page if you can pick the specific panel</param> 
    /// <param name="IdToFind">ID of the control you are looking for</param> 
    /// <returns>the control if found else null</returns> 
    public static Control FindControlRecursive(Control Root, string Id)
    {
        if (Root.ID == Id) { return Root; }

        foreach (Control Ctl in Root.Controls)
        {
            Control FoundCtl = FindControlRecursive(Ctl, Id);
            if (FoundCtl != null) { return FoundCtl; }
        }
        return null;
    }

现在,我要做的是:

创建TextBox's 时,将所有ID's 存储在Array. 然后当你需要访问它们时,循环遍历Array每个条目,调用上面的方法。这将返回TextBox你需要的。

于 2012-12-17T14:41:37.957 回答