我有一个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!怎么回事?
答案 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 = " ";
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”);
它发现没问题。所以你有一些奇怪的事情发生在你的代码发布中并不明显。