无法从动态添加的控件中检索值

时间:2017-09-01 11:15:10

标签: c# asp.net webforms

我正在添加动态文本框和标签。我想用标签和文本框创建动态控件。之后我需要从提交中获取值,但是我无法获得将控件添加到表中的值。

    if (!string.IsNullOrEmpty(dynamicFieldstring))
    {
        string[] groupControl = dynamicFieldstring.Split('|');

        for (int i = 0; i < groupControl.Length; )
        {
            TableRow row = new TableRow();

            for (int j = 0; j < 2; j++)
            {
                if (i >= groupControl.Length)
                    break;

                string[] singleControl = groupControl[i].Split('=');

                Label label = new Label();
                TextBox textbox = new TextBox();
                string textboxId = string.Empty;
                string labelId = string.Empty;
                TableCell cell = new TableCell();

                label.Text = singleControl[0];
                labelId = "lbl" + i + j;
                label.ID = textboxId;
                label.Attributes.Add("runat", "server");
                cell.Controls.Add(label);

                TableCell cell1 = new TableCell();
                textbox.Text = singleControl[1];
                textboxId = "txt" + i + j;
                textbox.ID = textboxId;
                textbox.Attributes.Add("runat", "server");
                cell1.Controls.Add(textbox);

                _dynamicControlId.Add(labelId, textboxId);
                Session["controllIds"] = _dynamicControlId;
                // Add the TableCell to the TableRow
                row.Cells.Add(cell);
                row.Cells.Add(cell1);
                //}

                i = i + 1;
            }

            extraAttr.Rows.Add(row);
        }

Value added successfully, but when I am trying to get value from the code. I am getting null value. This is my code for get the value:

    string value = string.Empty;
    _dynamicControlId = (Dictionary<string, string>)Session["controllIds"];
    if (_dynamicControlId != null && _dynamicControlId.Count > 0)
    {
        TextBox textbox;

        for (int i = 0; i < this.Controls.Count; i++)
        {
           var control= this.Controls[i];
        }

        foreach (var item in _dynamicControlId)
        {
            Label label = (Label)this.FindControl(item.Key);
            //value = Request.Form("something_TextoxFirstName");
            value = label.Text + "=";
            textbox = (TextBox)this.FindControl(item.Value);
            value += textbox.Text + "|";
        }
    }
    return value;

1 个答案:

答案 0 :(得分:0)

动态控件的技巧是你需要 在回发时重新加载它们 ,因为它们不在控制树中。我们通常会在 Page Init 事件或 页面加载 事件中重新加载它们。

另一个问题是FindControl只寻找直接的孩子。如果要查找嵌套在其他控件中的控件,则需要递归地找到它。

enter image description here

结果

enter image description here

<asp:Table runat="server" ID="extraAttr" />
<asp:Button runat="server" ID="SubmitButton" OnClick="SubmitButton_Click" Text="Submit" />
<br/>
<asp:Label runat="server" ID="ResultLabel" />

代码背后

public partial class _Default : Page
{
    Dictionary<string, string> _dynamicControlId = new Dictionary<string, string>();

    protected void Page_Init(object sender, EventArgs e)
    {
        CreateControls();
    }

    protected void SubmitButton_Click(object sender, EventArgs e)
    {
        ResultLabel.Text = "Result : " + RetrieveValues();
    }

    private void CreateControls()
    {
        string dynamicFieldstring = "one=1|two=2|three=3|four=4";
        if (!string.IsNullOrEmpty(dynamicFieldstring))
        {
            string[] groupControl = dynamicFieldstring.Split('|');

            for (int i = 0; i < groupControl.Length;)
            {
                TableRow row = new TableRow();

                for (int j = 0; j < 2; j++)
                {
                    if (i >= groupControl.Length)
                        break;

                    string[] singleControl = groupControl[i].Split('=');

                    Label label = new Label();
                    TextBox textbox = new TextBox();
                    string textboxId = string.Empty;
                    string labelId = string.Empty;
                    TableCell cell = new TableCell();

                    label.Text = singleControl[0];
                    labelId = "lbl" + i + j;
                    label.ID = labelId; // <--- value should be labelId instead of textboxId
                    label.Attributes.Add("runat", "server");
                    cell.Controls.Add(label);

                    TableCell cell1 = new TableCell();
                    textbox.Text = singleControl[1];
                    textboxId = "txt" + i + j;
                    textbox.ID = textboxId;
                    textbox.Attributes.Add("runat", "server");
                    cell1.Controls.Add(textbox);

                    _dynamicControlId.Add(labelId, textboxId);
                    row.Cells.Add(cell);
                    row.Cells.Add(cell1);
                    i = i + 1;
                }
                extraAttr.Rows.Add(row);
                Session["controllIds"] = _dynamicControlId;
            }
        }
    }

    private string RetrieveValues()
    {
        string value = string.Empty;
        _dynamicControlId = Session["controllIds"] as Dictionary<string, string>;
        if (_dynamicControlId != null && _dynamicControlId.Count > 0)
        {

            foreach (var item in _dynamicControlId)
            {
                Label label = FindControlRecursive(extraAttr, item.Key) as Label;
                value += label.Text + "="; // <--- Operator should be should be +=
                var textbox = FindControlRecursive(extraAttr, item.Value) as TextBox;
                value += textbox.Text + "|";
            }
        }
        return value;
    }

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

        return root.Controls.Cast<Control>()
            .Select(c => FindControlRecursive(c, id))
            .FirstOrDefault(c => c != null);
    }
}