使用字符串命名循环访问控件?

时间:2017-05-30 19:27:25

标签: c# loops dynamic-programming

我不确定这个问题究竟是什么,并且没有任何运气寻找答案。我目前正在尝试使用后面的代码中的for循环访问网页上的多个元素。问题是;我需要通过id访问有问题的元素,但是作为字符串,仍然能够为元素分配新类,以及更改内部HTML的能力。例如:

<li>Name: <a runat="server" id="name0" class="data">MACHINE</a></li>
<li>Name: <a runat="server" id="name1" class="data">MACHINE</a></li>
<li>Name: <a runat="server" id="name2" class="data">MACHINE</a></li>
<li>Name: <a runat="server" id="name3" class="data">MACHINE</a></li>
<li>Name: <a runat="server" id="name4" class="data">MACHINE</a></li>
        for (int i = 0; i < 10; i++) {
             container.controls(string.Format("name{0}", i)).class = "inactive";
             container.controls(string.Format("name{0}", i)).innerHtml = "NameFromDB";
        }

上面的C#代码是伪代码,我希望有人可以帮我解决这个问题,因为我没有运气。我认为这只是我在搜索中没有产生结果的方式。

2 个答案:

答案 0 :(得分:0)

假设您的所有控件都在另一个服务器控件内,如下所示:

<div runat="server" id="ContainerControl">
    <li>Name: <a runat="server" id="name0" class="data">MACHINE</a></li>
    <li>Name: <a runat="server" id="name1" class="data">MACHINE</a></li>
    <li>Name: <a runat="server" id="name2" class="data">MACHINE</a></li>
    <li>Name: <a runat="server" id="name3" class="data">MACHINE</a></li>
    <li>Name: <a runat="server" id="name4" class="data">MACHINE</a></li>
</div>

你可以这样做。转换为HtmlAnchor可确保我们不会捕获可能位于容器内的其他服务器控件。

var container = ContainerControl;
foreach (Control control in container.Controls)
{
    var anchor = control as HtmlAnchor;
    if (anchor != null)
    {
        anchor.InnerText = "new inner text";
        anchor.Attributes.Add("class", "newclass");
    }
}

或者,如果您想按编号引用它们,并且您已经知道它们是正确的控制类型,您可以这样做:

for (var index = 0; index <= 4; index++)
{
    var control = (HtmlContainerControl)FindControl("name" + index);
    control.InnerText = "new inner text";
    control.Attributes.Add("class", "newclass");
}

FindControl按ID获取页面控件。

(转换为HtmlContainerControl,这是InnerText控件的基类。您可以转换为HtmlAnchor。)

答案 1 :(得分:0)

有助于查看您的父控件是什么。循环遍历控件列表可以通过循环父级的子控件来完成。以下是在表单视图中循环控件的示例。

foreach (FormViewRow r in formView.Controls[0].Controls)
        {
            foreach (TableCell cell in r.Controls)
            {

                foreach (Control ctr in cell.Controls)
                {

                    //Check to see if child control is generic control
                    if (ctr is HtmlGenericControl)
                    {
                        // cast to HtmlGenericControl to access properties
                        HtmlGenericControl li = (HtmlGenericControl)ctr;                                                      
                        li.Attributes.Add("class", "inactive");
                        li.InnerHtml = "NameFromDB";

                    }
                }
            }
        }