在div上使用.FindControl()失败

时间:2011-05-23 23:24:19

标签: c# asp.net

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

但是clientGrid.findControl always = null!即使我将sting直接放入像clientGrid.findControl("cell_0_0");这样的构造函数中,它仍会返回NULL!这怎么可能?

我的理解是findControl方法找到带有字符串id的服务器控件元素?

我无法像cell_0_0.clientID那样直接访问子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 [,]是包含整数值的二维数组。然后通过clientGrid.innerHtml = allMyDivs

将这些div放入clientGrid

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

clientGrid.control.count = 0 ...... ???很明显......对于asp,这些div元素不存在...到asp.net ...在clientGrid div中有没有...但是...我的chrome浏览器上的inspect元素说是othervise!怎么回事?

2 个答案:

答案 0 :(得分:4)

尝试使用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:占位符并以编程方式将所有控件添加到该位置。

然后在回发时,您需要在init事件中重新呈现页面。需要重新创建动态创建的所有控件,并在每次回发时重新添加到页面以恢复页面状态。

然后你可以这样做:

clientGrid.FindControl("Cell_0_0")

重新渲染所有控件后。

互联网上有大量关于动态呈现的asp.net控件的帖子。

另一种选择是将每个单元格的隐藏控件放到表单上,并使用javascript将每个单元格的值放入提交时的相应隐藏控件中,并使用Request.Form(“Cell_0_0”)。

答案 1 :(得分:2)

您有_grid.AddControl(new cell)还是clientGrid.AddControl(new cell)

您正在循环_grid,但在clientGrid上进行搜索。也许它应该是_grid.FindControl()

编辑(1):

然后,您应该在PreRender() foreach(Control c in clientGrid) Response.Write(c.ID + "<br />");

中进行操作

获取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单击(对象){;}处理程序,然后将此行放在我的Page_Load()

控制div = clientGrid.FindControl(“cell_0_0”);

它发现没问题。所以你有一些奇怪的事情发生在你的代码发布中并不明显。