访问动态创建的控件时出现问题

时间:2010-07-29 11:58:19

标签: c# asp.net

我正在动态创建一些链接按钮,并试图在后面的代码中的一些其他功能中访问它们但面临一些问题 我正在做的是页面加载事件

for (int i = 65; i <= 90; i++)
{
    LinkButton lbtnCharacters = new LinkButton();
    lbtnCharacters.Text = "<u>" + Char.ConvertFromUtf32(i) + "</u>";
    lbtnCharacters.ID = Char.ConvertFromUtf32(i);
    lbtnCharacters.CommandArgument = Char.ConvertFromUtf32(i);
    lbtnCharacters.CommandName = "AlphaPaging";
    lbtnCharacters.CssClass = "firstCharacter";
    lbtnCharacters.Click += new EventHandler(lbtnAlphabets_Click);
    alphabets.Controls.Add(lbtnCharacters);
}

由于有多个链接按钮,所以我已经为它们分配了唯一的ID,但我没有得到如何在代码后面的其他功能中访问它们。还有一件事,我添加所有链接按钮的“字母”是一个div任何人都可以告诉我如何访问它们

3 个答案:

答案 0 :(得分:4)

如果您想在CodeBehind中访问它们,您唯一真正的选择就是使用FindControl

LinkButton aButton = (LinkButton)alphabets.FindControl("a");
LinkButton bButton = (LinkButton)alphabets.FindControl("b");
LinkButton cButton = (LinkButton)alphabets.FindControl("c");

答案 1 :(得分:0)

您可以使用FindControl方法获取控件。

LinkButton aControl = (LinkButton)Page.FindControl("a");

答案 2 :(得分:0)

我认为这有两个部分。

首先,当您向.aspx页面添加控件时,visual studio会自动为这些控件创建属性(您可以通过查看aspx.designer.cs文件在某些​​版本的asp.net中看到这一点 - 您应该看到属性与aspx文件中的每个控件有关。)

当您动态添加控件时,控件不会添加到类中。因此,您需要手动跟踪它们。也许创建一个类级别的字段/属性并将它们存储在其中。在你的情况下可能值得使用词典:

private Dictionary<int, LinkButton> alphabetLinkButtons = new Dictionary<int, LinkButton>();

这应该允许您通过在page_load期间调用的其他代码中的id访问任何链接按钮:

˚F

or (int i = 65; i <= 90; i++)
        {
            LinkButton lbtnCharacters = new LinkButton();
            lbtnCharacters.Text = "<u>" + Char.ConvertFromUtf32(i) + "</u>";
            lbtnCharacters.ID = Char.ConvertFromUtf32(i);
            lbtnCharacters.CommandArgument = Char.ConvertFromUtf32(i);
            lbtnCharacters.CommandName = "AlphaPaging";
            lbtnCharacters.CssClass = "firstCharacter";
            lbtnCharacters.Click += new EventHandler(lbtnAlphabets_Click);
            alphabets.Controls.Add(lbtnCharacters);

            // add this
            alphabetLinkButtons.Add(lbtnCharacters);


        }

现在,稍后在您的代码中,您应该能够访问这样的控件:

alphabetLinkButtons[65].Text = "Some new text";

现在点2 ...这些按钮在回发时不会存在。

页面的ViewState是在页面生命周期的Initialize事件中创建的,因此通过在page_load期间将控件添加到页面,它们永远不会添加到视图状态,因此您无法在回发中访问它们事件。这可能不会给你带来任何问题,但要注意它。有很多帖子可以解决这个问题 - 只需搜索“动态添加控件viewstate page_load initialize”。

以下是此问题的good discussion

希望这有帮助