当前位置:编程学习 > C#/ASP.NET >>

多层控件嵌套时出现的FindControl失效的情况

这是我页面的大体结构:

<asp:MultiView ID="mv1" runat="server" ActiveViewIndex="0">
                        <asp:View ID="jbqk" runat="server">
                            <asp:FormView ID ="fv_jbqk" Width ="100%" runat ="server" DataKeyNames="tb003" DataSourceID="SqlDataSource_jbqk"   DefaultMode ="edit"  Font-Size="9pt">
                                <EditItemTemplate >
                                    <table class="table1" style="width:100%;">
                             
                          <tr>
                            <td style="text-align:left; width: 170px;">
                                                <asp:DropDownList ID="hyfl" style="width:90%" runat="server" 
                                                    DataSourceID="SqlDataSource_hyfl" DataTextField="DC003" DataValueField="DCS002" 
                                                    OnSelectedIndexChanged="DropDownList_SelectedIndexChanged">
                                                </asp:DropDownList>
                                                <asp:TextBox ID="tb_DC003" runat="server"  Text='<%# Bind("dc003") %>' Visible="false"></asp:TextBox></td>
    </tr> 



我要得到id为"hyfl"的DropDownList控件 和 id为"tb_DC003"的TextBox控件

我进行多次尝试:
尝试1:

TextBox tb_DC003 = (TextBox)fv_jbqk.FindControl("tb_DC003");
        DropDownList hyfl = (DropDownList)fv_jbqk.FindControl("hyfl");

结果报错:未将对象引用设置到对象的实例,说明没有取得对象实例。

尝试2:

TextBox tb_DC003 = (TextBox)mv1.FindControl("jbqk").FindControl("fv_jbqk").FindControl("tb_TB015");
        DropDownList hyfl = (DropDownList)mv1.FindControl("jbqk").FindControl("fv_jbqk").FindControl("hyfl");

结果同上

尝试3:

TextBox tb_DC003 = (TextBox)mv1.FindControl("tb_TB015");
        DropDownList hyfl = (DropDownList)mv1.FindControl("hyfl");

结果还是一样,失败

尝试4:
我试了一下如果取的不是最底层的控件会怎么样?

View vi = (View)mv1.FindControl("jbqk");

能运行,取到了实例,奇怪了,请路过的朋友看看我到底错在哪了,该怎么办呢?谢谢了 ^_^

--------------------编程问答-------------------- 友情帮你顶了! --------------------编程问答-------------------- 你是不是要绑定数据?
在你FormView的创建项事件里给内嵌控件绑定数据,该事件的处理方法带一个e参数
使用e.Item.FindControl("你的控件id")的到控件实例,还有强制转换的代码不是很优雅,
使用 
你的控件的type 引用名 = e.Item.FindControl("你的控件id") as 你的控件的type;
比如 TextBox txt = e.Item.FindControl("tb_DC003") as TextBox; --------------------编程问答-------------------- DropDownList_SelectedIndexChanged(object sender, EventArgs e) 

andyleec 说的e.Item.FindControl("tb_DC003"),我这里的e对象是 DropDownList控件触发的,不行的,这样写不是我问题的通用解决办法,谢谢哦,你的“还有强制转换的代码不是很优雅”是个不错的建议,很友好,不过希望你进一步教我啊 ^_^ --------------------编程问答-------------------- 我没用过MultiView.但是你好象是把DropDownList等控件放到<EditItemTemplate >标记里面的.
<EditItemTemplate >标记里面的控件是当编辑的时候才创建的,所以在非编辑状态下是找不到你要的控件,因为这时候这些控件根本就没有创建.
如果要找到这些控件,只能在编辑状态下找.
没用过MultiView,其它一些控件是这样的,所以这个也应该这样,如果说的不对别怪我啊 --------------------编程问答--------------------

FormView.Row.FindControl("xxxxx");

不知道你具体是要取值还是赋值.... --------------------编程问答-------------------- 如果只是取值,还有一种更简单的方法

遍历Reqeust.Forms
string s ;
 for (int i = 0; i < Request.Form.AllKeys.Length; i++)
            {
                if (Request.Form.AllKeys[i].EndsWith("tb_DC003"))
                {
                    s = (Request.Form[i]);break;
                }
            } --------------------编程问答-------------------- TextBox tb_DC003 = (TextBox)mv1.FindControl("fv_jbqk").FindControl("tb_TB015");
这样试试呢?
--------------------编程问答-------------------- 阿福,我是有成功的例子的,呵呵,就是

<asp:FormView ID="FormView1" Width="100%" runat="server" DataKeyNames="us002" >
       <EditItemTemplate>
             <asp:DropDownList >

这里的FormView控件是页面的顶级元素,而我失败的那个不是最上层的,在FormView上面还嵌套有控件,最后它里面的DropDownList就找不到了,下面是成功的例子的c#

DropDownList DropDownList1 = (DropDownList)FormView1.FindControl("DropDownList1");

和我失败的写法是一样的,问题可能还是出在控件的层次上,还是顶一下阿福,再看看,谢啦 --------------------编程问答-------------------- 再发一下我的页面结构:

<asp:MultiView ID="mv1" runat="server" ActiveViewIndex="0">
                        <asp:View ID="jbqk" runat="server">
                            <asp:FormView ID ="fv_jbqk" Width ="100%" runat ="server" DataKeyNames="tb003" DataSourceID="SqlDataSource_jbqk"   DefaultMode ="edit"  Font-Size="9pt">
                                <EditItemTemplate >
                                    <table class="table1" style="width:100%;">
                                       <tr>
                                          <td style="text-align:left; width: 170px;">
                                                <asp:DropDownList ID="hyfl" style="width:90%" runat="server" DataSourceID="SqlDataSource_hyfl" >
                                                </asp:DropDownList>
                                                <asp:TextBox ID="tb_DC003" runat="server"  Text='<%# Bind("dc003") %>' Visible="false"></asp:TextBox>
                                           </td>
                                        </tr> 
                                    </EditItemTemplate >
                             </asp:FormView>
                        </asp:View > 
              </asp:MultiView >




问题在于取不到DropDownList和TextBox的对象实例,和取值赋值没关系,谢谢楼上的各位 ^_^ --------------------编程问答-------------------- 我个人觉得是针对你的那个控件的某行的某单元格的FINDCtrol方法! --------------------编程问答-------------------- 对,其实就是10楼的那个意思.... --------------------编程问答-------------------- 请10楼和11楼的大哥说详细一点,小弟不懂啊,我都把10楼扫了好几遍,还是不懂耶,麻烦各位了,谢谢哦 --------------------编程问答-------------------- 鼓励一下 --------------------编程问答-------------------- 外面几个都是要进行绑定的吧?
你用的是哪个控件的哪个事件回传?
这样都好想办法找..
--------------------编程问答-------------------- 请dh2087 大哥看一下8楼我的解释,麻烦了,谢谢哦 --------------------编程问答--------------------  不能半途而废,自己顶一下 --------------------编程问答-------------------- 你试试
TextBox txt = fv_jbqk.Row.FindControl("tb_DC003") as TextBox;
--------------------编程问答-------------------- 不行啊,还是‘未将对象引用设置到对象的实例’ --------------------编程问答--------------------  <asp:MultiView ID="mv1" runat="server" ActiveViewIndex="0">
    <asp:View ID="jbqk" runat="server">       <asp:FormView ID ="fv_jbqk" Width ="100%" runat ="server"  Font-Size="9pt" DataSourceID="SqlDataSource2" DataMember="DefaultView" DefaultMode="Edit">
            <EditItemTemplate>
                <table class="table1" style="width:100%;">
                   <tr>
                      <td style="text-align:left; width: 170px;">
                            <asp:DropDownList ID="hyfl" style="width:90%" runat="server" OnSelectedIndexChanged="hyfl_SelectedIndexChanged" AutoPostBack="True" DataSourceID="SqlDataSource1" DataTextField="c_edu" DataValueField="c_edu" DataMember="DefaultView" >
                            </asp:DropDownList>
                            <asp:TextBox ID="tb_DC003" runat="server"  Text='<%# Eval("name") %>' Visible="true"></asp:TextBox>
                       </td>
                    </tr></table>
                </EditItemTemplate >
         </asp:FormView>
    </asp:View > 
</asp:MultiView >
        <asp:Label ID="Label1" runat="server" ForeColor="Red" Text="Label"></asp:Label>





    protected void Page_Load(object sender, EventArgs e)
    {
        TextBox txt = (TextBox)fv_jbqk.Row.FindControl("tb_DC003");
        Label1.Text = txt.Text;
    }

    protected void hyfl_SelectedIndexChanged(object sender, EventArgs e)
    {
        TextBox txt = (TextBox)fv_jbqk.Row.FindControl("tb_DC003");
        Label1.Text = txt.Text;
    }

--------------------编程问答-------------------- 我试验的,可以啊. --------------------编程问答-------------------- 恩。有同样的问题。呵呵 --------------------编程问答-------------------- 我想,原因可能是4楼,说的。
    我也遇到这种问题了。呵呵
补充:.NET技术 ,  ASP.NET
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,