DetailView的EidtTemplate下有一个字段用了FileUpload1,但用了FindControl方法却不生效,提示错误为“指定的参数已超出有效值的范围。
参数名: index ”
//编辑
    protected void lbtnEdit_Click(object sender, EventArgs e)
    {
        //Response.Write("lbtnEdit_Click");
        FileUpload FileUpload1 = (FileUpload)this.DetailsView1.Rows[0].Cells[4].FindControl("FileUpload1");
        //Response.Write("aa");
        FileUpload1.Attributes.Add("onpropertychange", "javascript:document.getElementById('Image1').src=document.getElementById('FileUpload1').value");
    }lbtnEdit是“编辑”按钮的id,因为DetailView帮定的是GridView的id(主键),所以Rows[0]下标用了0,
对应字段是第5个,所以Cell[4]下标用了4,然后FindControl("FileUpload1")获取控件,但失败了
提示错误就是“指定的参数已超出有效值的范围。
参数名: index ”
请专家看看~

解决方案 »

  1.   

    Rows[0].Cells[4].FindControl改成Rows[0].FindControl试试。
      

  2.   

    发表于:2007-11-30 13:02:221楼 得分:0 
    Rows[0].Cells[4].FindControl 改成 Rows[0].FindControl 试试。 
    该了后,提示错误变成了“未将对象引用设置到对象的实例。”
    想的是获取了FileUpload1之后,再给FileUpload1添加属性FileUpload1.Attributes.Add("onpropertychange", "javascript:document.getElementById('Image1').src=document.getElementById('FileUpload1').value");
    可是现在是FileUpload1.Attributes.Add("onpropertychange", "javascript:document.getElementById('Image1').src=document.getElementById('FileUpload1').value");
    是红色提示
    可能是哪里的问题呢?
    已经一天了,baidu大都这么说,可是我这样就是不对~
      

  3.   

    你要不要调试跟踪一下 
    看你的 Rows[0].Cells[4] 的控件类型是什么
    然后再作判断
      

  4.   

    (FileUpload)this.DetailsView1.FindControl("FileUpload1"); 
      

  5.   

    是了
    <asp:TemplateField HeaderText="图片名称" SortExpression="ImageName">
                        <EditItemTemplate>
     <asp:Image ID="Image1" runat="server" /><br />
                            <asp:FileUpload ID="FileUpload1" runat="server" />                    </EditItemTemplate>
    <InsertItemTemplate>
                            <asp:TextBox ID="TextBox3" runat="server" Text='<%# Bind("ImageName") %>'></asp:TextBox>
                        </InsertItemTemplate>
                        <ItemTemplate>
                            <asp:Label ID="Label3" runat="server" Text='<%# Bind("ImageName") %>'></asp:Label>
                        </ItemTemplate>
      

  6.   

    哦,原来是这样,那当然找不到了,因为初始情况下是itemtemplate中的控件,关注中...
      

  7.   

    C# codeFileUpload FileUpload1=(FileUpload)this.DetailsView1.FindControl("FileUpload1"); 
    之后给FileUpload1添加属性
    FileUpload1.Attributes.Add("onpropertychange", "javascript:document.getElementById('Image1').src=document.getElementById('FileUpload1').value");
    之后,提示错误:“未将对象引用设置到对象的实例。”
    难道是FileUpload1.Attributes.Add("onpropertychange", "javascript:document.getElementById('Image1').src=document.getElementById('FileUpload1').value");的问题?
      

  8.   

    发表于:2007-11-30 13:42:498楼 得分:0 
    哦,原来是这样,那当然找不到了,因为初始情况下是itemtemplate中的控件,关注中... ???
    那应该是怎样才能获取到?
    请指点
      

  9.   

    我是在”编辑“按钮的Click事件里,写的FileUpload1=(FileUpload)this.DetailsView1.FindControl("FileUpload1");  
    这个时候,模式已经变为EditMode了
    难道是这里的问题?
      

  10.   

    你首先应该将detailsview的状态变成编辑,再绑定才可找到,因为fileupload是在EidtTemplate里    protected void lbtnEdit_Click(object sender, EventArgs e)
            {
                //将DetailsView1变成编辑状态
                this.DetailsView1.ChangeMode(DetailsViewMode.Edit);
                
                Bind();//此函数里将DetailsView1重新绑定            FileUpload FileUpload1 = (FileUpload)this.DetailsView1.Rows[0].Cells[4].FindControl("FileUpload1");
                FileUpload1.Attributes.Add("onpropertychange", "javascript:document.getElementById('Image1').src=document.getElementById('FileUpload1').value");
            } 
      

  11.   

    angelHeaderUpdate1.Attributes.Add("onpropertychange", "this.value!=''? Image1.src=this.value:'~/WebUI/Portrait/images/tu/200511172092734480.jpg';");
    看看这个
      

  12.   

    正式要获得<EditItemTemplate>的时候的Upload1,这个时候Upload1是存在的
      

  13.   

    发表于:2007-11-30 13:48:3313楼 得分:0 
    你首先应该将detailsview的状态变成编辑,再绑定才可找到,因为fileupload是在EidtTemplate里 C# code
        protected void lbtnEdit_Click(object sender, EventArgs e)
            {
                //将DetailsView1变成编辑状态
                this.DetailsView1.ChangeMode(DetailsViewMode.Edit);
                
                Bind();//此函数里将DetailsView1重新绑定            FileUpload FileUpload1 = (FileUpload)this.DetailsView1.Rows[0].Cells[4].FindControl("FileUpload1");
                FileUpload1.Attributes.Add("onpropertychange", "javascript:document.getElementById('Image1').src=document.getElementById('FileUpload1').value");
            } 

    我是自动帮定的
    加上这句//将DetailsView1变成编辑状态
                this.DetailsView1.ChangeMode(DetailsViewMode.Edit);
    还是提示:未将对象引用设置到对象的实例。
     
      

  14.   

    我当然知道你是自动绑定的,你要将DetailsView1的状态变成编辑就必须再绑定一次,所以你要将你现在的绑定代码分离出来放在一个函数中,比如上面的Bind(),然后你pageload时调用一次,此处再调用一次
      

  15.   

    <body>
        <form id="form1" runat="server">
        <div class="font12">
            <asp:DetailsView ID="DetailsView1" runat="server" Height="50px" Width="680px" AutoGenerateRows="False" DataSourceID="SqlDataSource2" DataKeyNames="ID" BackColor="#CCCCCC" OnItemInserting="DetailsView1_ItemInserting" OnItemCommand="DetailsView1_ItemCommand" OnModeChanged="DetailsView1_ModeChanged" OnModeChanging="DetailsView1_ModeChanging" OnItemUpdating="DetailsView1_ItemUpdating" OnDataBinding="DetailsView1_DataBinding" OnDataBound="DetailsView1_DataBound" OnPageIndexChanged="DetailsView1_PageIndexChanged" OnPageIndexChanging="DetailsView1_PageIndexChanging" OnItemCreated="DetailsView1_ItemCreated">
                <Fields>
                    <asp:BoundField DataField="ID" HeaderText="编号" InsertVisible="False" ReadOnly="True"
                        SortExpression="ID" >
                        <ItemStyle ForeColor="Blue" />
                    </asp:BoundField>
                    <asp:TemplateField HeaderText="所属类别" SortExpression="SmallClassName">
                        <EditItemTemplate>
                            <%--<asp:TextBox ID="TextBox1" runat="server" Text='<%# Bind("SmallClassName") %>'></asp:TextBox>--%>
                            <asp:DropDownList ID="DropDownList1" runat="server" DataSourceID="SqlDataSource1" DataMember="DefaultView" DataTextField="SmallClassName" DataValueField="SmallClassID" SelectedValue='<%# Bind("SmallClassID") %>'>
                            </asp:DropDownList><asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:hjConnectionString %>"
                                SelectCommand="SELECT [SmallClassID], [SmallClassName] FROM [ZxalSmallClass]"></asp:SqlDataSource>
                        </EditItemTemplate>
                        <InsertItemTemplate>
                            <%--<asp:TextBox ID="TextBox1" runat="server" Text='<%# Bind("SmallClassName") %>'></asp:TextBox>--%>
                            <asp:DropDownList ID="DropDownList2" runat="server" DataSourceID="SqlDataSource1" DataTextField="SmallClassName" DataValueField="SmallClassID">
                            </asp:DropDownList><asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:hjConnectionString %>"
                                SelectCommand="SELECT [SmallClassID], [SmallClassName] FROM [ZxalSmallClass]"></asp:SqlDataSource>
                        </InsertItemTemplate>
                        <ItemTemplate>
                            <asp:Label ID="Label1" runat="server" Text='<%# Bind("SmallClassName") %>'></asp:Label>
                        </ItemTemplate>
                    </asp:TemplateField>
                    <asp:TemplateField HeaderText="新闻标题" SortExpression="Title">
                        <EditItemTemplate>
                            <asp:TextBox ID="TextBox4" runat="server" Text='<%# Bind("Title") %>' Width="200px"></asp:TextBox>
                        </EditItemTemplate>
                        <InsertItemTemplate>
                            <asp:TextBox ID="TextBox4" runat="server" Text='<%# Bind("Title") %>' Width="200px"></asp:TextBox>
                        </InsertItemTemplate>
                        <ItemTemplate>
                            <asp:Label ID="Label4" runat="server" Text='<%# Bind("Title") %>'></asp:Label>
                        </ItemTemplate>
                    </asp:TemplateField>
                    <asp:TemplateField HeaderText="文章内容" SortExpression="Content">
                        <EditItemTemplate>
                            <asp:TextBox ID="TextBox2" runat="server" Text='<%# Bind("Content") %>' Width="400px" Height="300px" TextMode="MultiLine"></asp:TextBox>&nbsp;<br />
                            <asp:RequiredFieldValidator ID="RequiredFieldValidator2" runat="server" ControlToValidate="TextBox2"
                                ErrorMessage="文章内容不能为空 "></asp:RequiredFieldValidator>
                        </EditItemTemplate>
                        <InsertItemTemplate>
                            <asp:TextBox ID="TextBox2" runat="server" Text='<%# Bind("Content") %>' Height="300px" TextMode="MultiLine" Width="400px"></asp:TextBox>
                            <asp:RequiredFieldValidator ID="RequiredFieldValidator1" runat="server" ControlToValidate="TextBox2"
                                ErrorMessage="文章内容不能为空"></asp:RequiredFieldValidator>
                        </InsertItemTemplate>
                        <ItemTemplate>
                            <asp:Label ID="Label2" runat="server" Text=<%# DataBinder.Eval(Container.DataItem, "Content", "{0}").Replace("&nbsp;", " ").Replace("  ", " ").Replace("\n", "<br>") %> ></asp:Label>
                            <%--<asp:Label ID="Label2" runat="server" Text=<%# Bind("Content") %> ></asp:Label>--%>
                        </ItemTemplate>
                    </asp:TemplateField>
                    <asp:TemplateField HeaderText="图片名称" SortExpression="ImageName">
                        <EditItemTemplate>
                            <%--<asp:Label ID="Label3" runat="server" Text='<%# Bind("ImageName") %>'></asp:Label>--%>
                            <%--<img id="Image1" src="upload/<%# DataBinder.Eval(Container.DataItem,"ImageName","{0}") %>" width="150" height="150" /><br />
                            <input type="file" id="FileUpload1" onpropertychange="imageBroser();" OnKeyPress="event.returnValue=IsDigit();" /><br />--%>
                            <%--<asp:FileUpload name="FileUpload1" runat="server" Width="400px" onpropertychange="imageBroser();" OnKeyPress="event.returnValue=IsDigit();" />--%>
                            <asp:Image ID="Image1" runat="server" /><br />
                            <asp:FileUpload ID="FileUpload1" runat="server" />
                        </EditItemTemplate>
                        <InsertItemTemplate>
                            <asp:TextBox ID="TextBox3" runat="server" Text='<%# Bind("ImageName") %>'></asp:TextBox>
                        </InsertItemTemplate>
                        <ItemTemplate>
                            <asp:Label ID="Label3" runat="server" Text='<%# Bind("ImageName") %>'></asp:Label>
                        </ItemTemplate>
                    </asp:TemplateField>
                    <asp:BoundField DataField="PublishDate" HeaderText="发布时间" SortExpression="PublishDate" InsertVisible="False" ReadOnly="True" />
                    <asp:BoundField DataField="ClickCount" HeaderText="点击量" SortExpression="ClickCount" InsertVisible="False" ReadOnly="True" />
                    <asp:TemplateField HeaderText="管理" ShowHeader="False">
                        <EditItemTemplate>
                            <asp:LinkButton ID="lbtnUpdate" runat="server" CausesValidation="True" CommandName="Update"
                                Text="更新" OnClick="lbtnUpdate_Click"></asp:LinkButton>
                            <asp:LinkButton ID="lbtnCancel" runat="server" CausesValidation="False" CommandName="Cancel"
                                Text="取消" OnClick="lbtnCancel_Click"></asp:LinkButton>
                        </EditItemTemplate>
                        <ControlStyle ForeColor="Blue" />
                        <ItemStyle HorizontalAlign="Center" />
                        <ItemTemplate>
                            <asp:LinkButton ID="lbtnEdit" runat="server" CausesValidation="False" CommandName="Edit"
                                Text="编辑" OnClick="lbtnEdit_Click"></asp:LinkButton>

                        </ItemTemplate>
                    </asp:TemplateField>
                </Fields>
            </asp:DetailsView>
        </div>
        </form>
    </body>
      

  16.   

    你后台没有类似this.DetailsView1.DataBind()的代码吗?如果有请贴出来
      

  17.   

    加QQ好吗?
    解决立马结分~
    38391232
    没有this.DetailsView1.DataBind()这样的代码
      

  18.   

    经过 seedling_lq  的帮助
    解决了
    下面是代码:
    protected void lbtnEdit_Click(object sender, EventArgs e)
            {
                //将DetailsView1变成编辑状态
                this.DetailsView1.ChangeMode(DetailsViewMode.Edit);
                //此函数里将DetailsView1重新绑定
                this.DetailsView1.DataBind();
                Image Image1 = (Image)this.DetailsView1.FindControl("Image1");
                FileUpload FileUpload1 = (FileUpload)this.DetailsView1.FindControl("FileUpload1");
                //FileUpload1.Attributes.Add("onpropertychange", "javascript:document.getElementById('Image1').src=document.getElementById('FileUpload1').value");
                FileUpload1.Attributes.Add("onpropertychange", "javascript:document.getElementById('"+Image1.ClientID+"').src=document.getElementById('"+FileUpload1.ClientID+"').value");
            }ClientiD表示运行时控件在页面上的动态id,很常用
    结分~