从asp .net中的动态创建的控件标签中检索值

时间:2016-03-03 07:42:21

标签: c# asp.net

我在点击按钮时动态创建了Label控件:

protected void createDynamicLabels_Click(object sender, EventArgs e)
{
    int n = 5;
    for (int i = 0; i < n; i++)
    {
        Label MyLabel = new Label();
        MyLabel.ID = "lb" + i.ToString();
        MyLabel.Text = "Labell: " + i.ToString();
        MyLabel.Style["Clear"] = "Both";
        MyLabel.Style["Float"] = "Left";
        MyLabel.Style["margin-left"] = "100px";

        Panel1.Controls.Add(MyLabel);
    }
}

当我尝试回读另一个按钮时,我看到Label Control返回null

  

标签str =(标签)Panel1.FindControl(“lb”+ i.ToString());

不确定这里出了什么问题

protected void bReadDynValue_Click(object sender, EventArgs e)
{

  int n = 5;
    for (int i = 0; i < n; i++)
    {
        Label str = (Label)Panel1.FindControl("lb" + i.ToString());
        lbGetText.Text = str.Text;
    }


}

3 个答案:

答案 0 :(得分:1)

这是每次页面加载事件的问题。当点击任何按钮时,ASP.net会在每次页面加载事件时触发。

在这个例子中假设..

protected void Page_Load(object sender, EventArgs e)
{

    if(!IsPostBack)
        createDynamicLabels();
}


private void createDynamicLabels()
    {
        int n = 5;
        for (int i = 0; i < n; i++)
        {
            Label MyLabel = new Label();
            MyLabel.ID = "lb" + i.ToString();
            MyLabel.Text = "Labell: " + i.ToString();
            MyLabel.Style["Clear"] = "Both";
            MyLabel.Style["Float"] = "Left";
            MyLabel.Style["margin-left"] = "100px";

            Panel1.Controls.Add(MyLabel);


        }
    }

protected void bReadDynValue_Click(object sender, EventArgs e)
{

    int n = 5;
    for (int i = 0; i < n; i++)
    {
        Label str = (Label)Panel1.FindControl("lb" + i.ToString());
        lbGetText.Text = str.Text;
    }


}

当按钮触发器页面没有任何标签,因为它是在运行时创建的。和页面没有找到特定的标签。如果您尝试上面的代码,它就可以正常运行。

 protected void Page_Load(object sender, EventArgs e)
{

        createDynamicLabels();
}


private void createDynamicLabels()
    {
        int n = 5;
        for (int i = 0; i < n; i++)
        {
            Label MyLabel = new Label();
            MyLabel.ID = "lb" + i.ToString();
            MyLabel.Text = "Labell: " + i.ToString();
            MyLabel.Style["Clear"] = "Both";
            MyLabel.Style["Float"] = "Left";
            MyLabel.Style["margin-left"] = "100px";

            Panel1.Controls.Add(MyLabel);


        }
    }

protected void bReadDynValue_Click(object sender, EventArgs e)
{

    int n = 5;
    for (int i = 0; i < n; i++)
    {
        Label str = (Label)Panel1.FindControl("lb" + i.ToString());
        lbGetText.Text = str.Text;
    }


}

在此示例代码中每次都找到标签,因为每次它都可以为此页面制作标签。

答案 1 :(得分:0)

动态创建的标签仅在下一次回发发生之前存在。当您单击另一个按钮以检索其值时,会发生回发并且值变为空。

为了在回发后保存标签状态,您必须使用一些隐藏字段。

答案 2 :(得分:0)

如果labes的文本/值没有改变,那么就足以在每次回发时生成它们(如已经提到的mck)。如果您需要检索在客户端进行的更改,您应该在OnInit事件而不是PageLoad中创建控件,并使用输入/ texbox而不是标签。

另一个选项(我建议)是使用asp:Repeater生成标签。