微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在div上使用.FindControl失败

如何解决在div上使用.FindControl失败

| 我有一个html div元素,其中包含多个div,它们的值要放入数组服务器端! 我的html div看起来像:
<div id=\"clientGrid\" runat=\"server\">
    <div id=\"cell_0_0\" runat=\"server\" class=\"Box\" onclick=\"clicked(this)\">2</div>
    <div id=\"cell_0_1\" runat=\"server\" class=\"Box\" onclick=\"clicked(this)\">1</div>
    <div id=\"cell_0_2\" runat=\"server\" class=\"Box\" onclick=\"clicked(this)\">3</div>
    <div id=\"cell_0_3\" runat=\"server\" class=\"Box\" onclick=\"clicked(this)\">4</div>

    <div id=\"cell_1_0\" runat=\"server\" class=\"Box\" onclick=\"clicked(this)\">3</div>
    <div id=\"cell_1_1\" runat=\"server\" class=\"Box\" onclick=\"clicked(this)\">2</div>
    <div id=\"cell_1_2\" runat=\"server\" class=\"Box\" onclick=\"clicked(this)\">4</div>
    <div id=\"cell_1_3\" runat=\"server\" class=\"Box\" onclick=\"clicked(this)\">1</div>

    <div id=\"cell_2_0\" runat=\"server\" class=\"Box\" onclick=\"clicked(this)\">4</div>
    <div id=\"cell_2_1\" runat=\"server\" class=\"Box\" onclick=\"clicked(this)\">3</div>
    <div id=\"cell_2_2\" runat=\"server\" class=\"Box\" onclick=\"clicked(this)\">2</div>
    <div id=\"cell_2_3\" runat=\"server\" class=\"Box\" onclick=\"clicked(this)\">1</div>
</div>
我希望这些div的值进入数组服务器端。我当前的代码如下所示:
for (int i = 0; i < _grid.getGridSize(); i++)
{
    for (int j = 0; j < _grid.getGridSize(); j++)
    {
        string divId = string.Format(\"cell_{0}_{1}\",i.ToString(),j.ToString());
        Control div = clientGrid.findControl(divId);
        //more code underneath
    }
}
所以div ID是由字符串格式生成的,没问题... 但是the2ѭ!即使我像
clientGrid.findControl(\"cell_0_0\");
这样直接将字符串放入构造函数中,它仍然会返回NULL!这怎么可能? 我的理解是
findControl
方法找到具有字符串ID的服务器控件元素吗? 我无法像ѭ5那样直接访问子div,因为子div是由服务器在运行时生成的。 在页面加载时,运行此功能...
    for (int i = 0; i < _grid.getGridSize(); i++)
    {
        for (int j = 0; j < _grid.getGridSize(); j++)
        {
            returnElement += \" <div \";
            returnElement += \"id=\\\"cell_\" + i + \"_\" + j + \"\\\" \";
            returnElement += \"runat=\\\"server\\\" \";
            returnElement += \"tabindex=\\\"-1\\\" \";
            returnElement += \"class=\\\"Box\\\" \";
            returnElement += \"onclick=\\\"clicked(this);\\\" \";
            returnElement += \"onkeypress=\\\"changeValue(event,this);\\\" \";
            returnElement += \"style=\\\"top:\" + top + \"%; left:\" + left + \"%;\\\">\";

            returnElement += test[i,j];

            returnElement += \"</div>\\n \";

            left = left + 20;
        }
        left = 0;
        top = top + 20;
    }
    return returnElement;
test [,]是一个包含整数值的二维数组。然后将这些div通过clientGrid.innerHtml = allMyDivs放入clientGrid中。 然后,用户将这些div的值编辑为所需的值,然后,当用户单击按钮时,这些div的值需要以某种方式最终返回到服务器端代码中,以便我进行处理。 clientGrid.control.count = 0 ... ???很明显...对于asp,这些div元素不存在...对于asp.net ... clientGrid div中没有​​任何内容...但是...我的Chrome浏览器中的inspect元素表示othervise!这是怎么回事??     

解决方法

尝试使用asp:Panel控件,它是HTML div元素。 这将使您简化代码: 客户端:
<asp:Panel ID=\"clientGrid\" runat=\"server\" />
服务器端:
for each row
  for each col
    Panel p = new Panel();
    p.ID = \"cell_\" + row.tostring() + \"_\" col.tostring();
    p.Text = \"&nbsp;\";
    p.OnClientClick = \"javascript:blah\";
    clientGrid.Controls.Add(p);
您甚至可以只使用asp:Placeholder并以编程方式向其中添加所有控件。 然后在回发时,您需要在init事件中重新呈现页面。动态创建的所有控件都需要在每次回发时重新创建并重新添加到页面中,以恢复页面状态。 然后,您可以执行以下操作:
clientGrid.FindControl(\"Cell_0_0\")
重新渲染所有控件后。 关于Internet上动态呈现的asp.net控件的大量信息。 另一个选择是将每个单元格的隐藏控件放在表单上,​​然后使用javascript,将每个单元格中的值放入提交时的相应隐藏控件中,并使用Request.Form(\“ Cell_0_0 \”)。     ,您曾经做过
_grid.AddControl(new cell)
clientGrid.AddControl(new cell)
吗? 您在_grid上循环,但在clientGrid上进行搜索。也许应该是
_grid.FindControl()
? 编辑(1): 然后,你应该在你的ѭ13中做 获取clientGrid知道的所有ID的列表。那应该可以帮助您寻找解决方案。 编辑(2): 您还可以尝试使用该ControlHelper方法来获取控件,因为该控件可能比预期的要深。
public static Control FindControlRecursive(this 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;
}
然后使用它代替FindControl。 编辑(3): 我只是将您的标记粘贴到表单中,添加了一个空白框css类和一个空白javascript clicked(object){;}处理函数,然后将此行放入我的Page_Load() 控件div = clientGrid.FindControl(\“ cell_0_0 \”); 它发现没有问题。因此,您会遇到一些奇怪的事情,这在代码发布中并不明显。     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。