gpt4 book ai didi

c# - 在 div 上使用 .FindControl() 失败

转载 作者:太空狗 更新时间:2023-10-29 21:36:11 24 4
gpt4 key购买 nike

我有一个包含多个 div 的 html 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 总是 = null!即使我像 clientGrid.findControl("cell_0_0"); 一样将 sting 直接放入构造函数中,它仍然返回 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[,] 是一个包含整数值的二维数组。这些 div 然后通过 clientGrid.innerHtml = allMyDivs 放入 clientGrid

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

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

最佳答案

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

关于c# - 在 div 上使用 .FindControl() 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6104159/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com