在 div 上使用 .FindControl() 失败

2024-01-03

我有一个 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是由字符串格式生成的,没问题......

but the clientGrid.findControl always = null!即使我将刺直接放入构造函数中,例如clientGrid.findControl("cell_0_0");它仍然返回NULL!这怎么可能?

这是我的理解findControl方法查找具有字符串 id 的服务器控制元素?

我无法像这样直接访问子 divcell_0_0.clientID因为子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[] 是一个包含整数值的二维数组。然后通过 clientGrid.innerHtml = allMyDivs 将这些 div 放入 clientGrid

然后,用户将这些 div 的值编辑为他们想要的任何内容,然后当用户单击按钮时,这些 div 的值需要以某种方式返回到服务器端代码中,以便我可以处理它们。

clientGrid.control.count = 0 ... ???很明显...对于asp,这些div元素不存在...对于asp.net...clientGrid div内没有任何内容...但是...我的chrome浏览器上的检查元素说否则!这是怎么回事??


尝试使用 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")。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 div 上使用 .FindControl() 失败 的相关文章

随机推荐