在不成功的一个div使用.FindControl() [英] Unsuccessful using .FindControl() on a div

查看:107
本文介绍了在不成功的一个div使用.FindControl()的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个包含多个div与我想提出一个数组服务器端值的HTML div元素!

我的HTML div的看起来像:

 < D​​IV ID =clientGrid=服务器>
    < D​​IV ID =cell_0_0=服务器级=盒子的onclick =点击(本)> 2'; / DIV>
    < D​​IV ID =cell_0_1=服务器级=盒子的onclick =点击(本)> 1 LT; / DIV>
    < D​​IV ID =cell_0_2=服务器级=盒子的onclick =点击(本)>第3版; / DIV>
    < D​​IV ID =cell_0_3=服务器级=盒子的onclick =点击(本)> 4℃; / DIV>    < D​​IV ID =cell_1_0=服务器级=盒子的onclick =点击(本)>第3版; / DIV>
    < D​​IV ID =cell_1_1=服务器级=盒子的onclick =点击(本)> 2'; / DIV>
    < D​​IV ID =cell_1_2=服务器级=盒子的onclick =点击(本)> 4℃; / DIV>
    < D​​IV ID =cell_1_3=服务器级=盒子的onclick =点击(本)> 1 LT; / DIV>    < D​​IV ID =cell_2_0=服务器级=盒子的onclick =点击(本)> 4℃; / DIV>
    < D​​IV ID =cell_2_1=服务器级=盒子的onclick =点击(本)>第3版; / DIV>
    < D​​IV ID =cell_2_2=服务器级=盒子的onclick =点击(本)> 2'; / DIV>
    < D​​IV ID =cell_2_3=服务器级=盒子的onclick =点击(本)> 1 LT; / DIV>
< / DIV>

我想这两个div的价值去到一个数组服务器端。我现在的code是这样的:

 的for(int i = 0; I< _grid.getGridSize();我++)
{
    对于(INT J = 0; J< _grid.getGridSize(); J ++)
    {
        串DIVID =的String.Format(cell_ {0} _ {1},i.ToString(),j.ToString());
        控制DIV = clientGrid.findControl(DIVID);
        //更多code下方
    }
}

这样的由字符串格式产生的DIV ID,没有问题...

clientGrid.findControl总是= NULL !即使我把蜇直接到像 clientGrid.findControl构造(cell_0_0); 它仍然返回NULL!这怎么可能?

这是我的理解中的的FindControl 方法找到服务器控件元素的字符串ID?

由于孩子的div通过在运行时服务器生成的我不能直接访问孩子的div像 cell_0_0.clientID

在页面加载,这个功能是运行...

 的for(int i = 0; I< _grid.getGridSize();我++)
    {
        对于(INT J = 0; J< _grid.getGridSize(); J ++)
        {
            returnElement + =其中p格;
            returnElement + =ID = \\cell_+ I +_+ J +\\;
            returnElement + =RUNAT = \\服务器\\;
            returnElement + =的tabindex = \\ - 1 \\;
            returnElement + =级= \\对话框\\;
            returnElement + =的onclick = \\点击(本); \\;
            returnElement + =安其preSS = \\changeValue(事件,这一点); \\;
            returnElement + =的风格= \\顶+顶部+%;左:+左+%\\>中;            returnElement + =试验[I,J]。            returnElement + =< / DIV> \\ N的;            左=左+ 20;
        }
        左边= 0;
        顶部顶部= + 20;
    }
    返回returnElement;

测试[,]是一个包含整数一个二维数组。那么这些div都是由clientGrid.innerHtml = allMyDivs

投入clientGrid

的用户,那么编辑这两个div到任何他们想要的值,然后当用户点击一个按钮,这两个div的值需要以某种方式结束回到服务器端code,所以我可以处理它们。

该clientGrid.control.count = 0 ... ???所以很明显......到ASP,这些div元素不存在...到... asp.net还有就是clientGrid DIV中NOTHING ......但在我的chrome浏览器的检查元素说othervise!怎么回事?


解决方案

尝试使用ASP:面板控制,这是一个HTML div元素,而不是

这将允许您简化您的code:

客户端:

 < ASP:面板ID =clientGrid=服务器/>

服务器端:

 的每一行
  每个山坳
    面板P =新面板();
    p.ID =cell_+ row.tostring()+_col.tostring();
    p.Text =与& NBSP;;
    p.OnClientClick =JavaScript的:嗒嗒;
    clientGrid.Controls.Add(P);

您可以仅仅只是用一个asp:占位符和编程方式添加所有控件到

然后在回传需要在init事件重新呈现页面。重新创建了动态创建所需要的所有的控制和重新添加到页面上的每一个回发到恢复页面的状态。

您可以然后执行:

  clientGrid.FindControl(Cell_0_0)

您已经重新呈现所有控件。之后

有一吨大约都在互联网上动态呈现的asp.net控件帖子。

另一种选择是对把一个隐藏控制每个小区上的形式,并使用JavaScript,放置从每个单元的值成在相应的隐藏控制提交和使用的Request.Form(Cell_0_0)。

I have a html div element containing multiple divs with values that I want to put in an array server side!

my html divs look something like:

<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>

i want the values of these divs to go into an array server side. My current code looks like this:

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
    }
}

so the div id's are generated by the string format, no problem...

but the clientGrid.findControl always = null! even if i put the sting directly into the constructor like clientGrid.findControl("cell_0_0"); it still returns NULL! How is this possible?

It is my understanding the the findControl method finds server control elements with the string id?

I can't access the child divs directly like cell_0_0.clientID because the child divs are generated by the server at runtime.

on page load, this function is run...

    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[,] is a 2d array containing integer values. these divs are then put into clientGrid by clientGrid.innerHtml = allMyDivs

The users then edits the values of these divs to whatever they want, and then when the user clicks a button, the values of these divs need to somehow end up back in the serverside code so i can process them.

The clientGrid.control.count = 0 ... ??? so obviously... to the asp, these div elements do not exist... to asp.net... there is NOTHING inside the clientGrid div... but... the inspect element on my chrome browser says othervise! Whats Going On??

解决方案

Try using the asp:Panel control, which is an HTML div element, instead.

This would allow you to streamline your code:

Client Side:

<asp:Panel ID="clientGrid" runat="server" />

Server Side:

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);

You could even just use an asp:Placeholder and programmatically add all controls to that.

Then on postback you need to re-render the page in the init event. All controls that were dynamically created need to be re-created and re-added to the page on every single postback to restore the page state.

You can then do:

clientGrid.FindControl("Cell_0_0")

after you've re-rendered all of the controls.

There's a ton of posts about dynamically rendered asp.net controls all over the internet.

Another option is to the put a hidden control for each cell onto the form and, using javascript, place the value from each cell into the respective hidden control on submit and use Request.Form("Cell_0_0").

这篇关于在不成功的一个div使用.FindControl()的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆