【问题标题】:fileupload not working within gridview inside update panel文件上传在更新面板内的gridview中不起作用
【发布时间】:2020-04-01 02:47:04
【问题描述】:

我在 gridview 中有文件上传控件,并且该 gridview 在更新面板内 当我尝试更新gridview时,一切正常,但文件上传的图像路径不保存 请帮帮我...

page.aspx

<asp:GridView ID="GridView1" runat="server"  AutoGenerateColumns="False" BackColor="White" 
                                BorderColor="#CCCCCC" BorderStyle="None" BorderWidth="1px" CellPadding="4" CellSpacing="4" 
                                DataKeyNames="pid" ForeColor="Black" ShowHeaderWhenEmpty="True" 
                                GridLines="Horizontal" onrowediting="GridView1_RowEditing" 
                                onrowupdating="GridView1_RowUpdating" 
                                onrowcancelingedit="GridView1_RowCancelingEdit" 
                                onrowdeleting="GridView1_RowDeleting">
                                <Columns>
                                    <asp:TemplateField HeaderText="Operation">
                                        <EditItemTemplate>
                                            <asp:LinkButton ID="LinkButton1" runat="server" CausesValidation="True" CommandName="Update" Text="Update"></asp:LinkButton>&nbsp;
                                            <asp:LinkButton ID="LinkButton2" runat="server" CausesValidation="False" CommandName="Cancel" Text="Cancel"></asp:LinkButton>
                                        </EditItemTemplate>
                                        <ItemTemplate>
                                            <asp:LinkButton ID="LinkButton1" runat="server" CausesValidation="False" CommandName="Edit" Text="Edit" ForeColor="#94b52c"></asp:LinkButton>&nbsp;
                                            <asp:LinkButton ID="LinkButton2" runat="server" CausesValidation="False" CommandName="Delete" Text="Delete" ForeColor="#94b52c"
                                                            OnClientClick="return confirm('Are You Sure Want To Delete ?');"></asp:LinkButton>
                                        </ItemTemplate>
                                        <HeaderStyle HorizontalAlign="Center" VerticalAlign="Middle" />
                                        <ItemStyle Font-Bold="True" HorizontalAlign="Center" VerticalAlign="Middle" />
                                    </asp:TemplateField>
                                    <asp:TemplateField HeaderText="Product ID" InsertVisible="False" SortExpression="pid">
                                        <EditItemTemplate>
                                            <asp:Label ID="lblpid" runat="server" Text='<%# Eval("pid") %>'></asp:Label>
                                        </EditItemTemplate>
                                        <ItemTemplate>
                                            <asp:Label ID="lblproductid" runat="server" Text='<%# Bind("pid") %>'></asp:Label>
                                        </ItemTemplate>
                                        <HeaderStyle HorizontalAlign="Center" VerticalAlign="Middle" />
                                        <ItemStyle Font-Bold="True" HorizontalAlign="Center" VerticalAlign="Middle" />
                                    </asp:TemplateField>
                                    <asp:TemplateField HeaderText="Product Detail" SortExpression="pdetail">
                                        <EditItemTemplate>
                                            <asp:TextBox ID="txtproductdetail" runat="server" Text='<%# Bind("pdetail") %>'></asp:TextBox>
                                        </EditItemTemplate>
                                        <ItemTemplate>
                                            <asp:Label ID="lblproductdetail" runat="server" Text='<%# Bind("pdetail") %>'></asp:Label>
                                        </ItemTemplate>
                                        <HeaderStyle HorizontalAlign="Center" VerticalAlign="Middle" />
                                        <ItemStyle Font-Bold="True" HorizontalAlign="Center" VerticalAlign="Middle" />
                                    </asp:TemplateField>
                                    <asp:TemplateField HeaderText="Product Image" SortExpression="pimage">
                                        <EditItemTemplate>
                                            <asp:FileUpload ID="FileUpload1" runat="server" />
                                        </EditItemTemplate>
                                        <ItemTemplate>
                                            <asp:Image ID="imgproductimage" runat="server" ImageUrl='<%# Bind("pimage") %>' Height="50px" Width="50px"/>
                                        </ItemTemplate>
                                        <HeaderStyle HorizontalAlign="Center" VerticalAlign="Middle" />
                                        <ItemStyle HorizontalAlign="Center" VerticalAlign="Middle" />
                                    </asp:TemplateField>

                                </Columns>
                                <FooterStyle BackColor="#F0F0F0" ForeColor="Black" />
                                <HeaderStyle BackColor="#333333" Font-Bold="True" ForeColor="White" HorizontalAlign="Center" VerticalAlign="Middle"  />
                                <PagerStyle BackColor="White" ForeColor="Black" HorizontalAlign="Right" />
                                <SelectedRowStyle BackColor="#CC3333" Font-Bold="True" ForeColor="White" />
                                <SortedAscendingCellStyle BackColor="#F7F7F7" />
                                <SortedAscendingHeaderStyle BackColor="#4B4B4B" />
                                <SortedDescendingCellStyle BackColor="#E5E5E5" />
                                <SortedDescendingHeaderStyle BackColor="#242121" />
                            </asp:GridView>
    </ContentTemplate>
                        </asp:UpdatePanel>

这是.cs文件

 public void bindgrid()
{
    string qry = "select pid,pdetail,pimage from productdetail p,categorydetail c where p.cid=c.cid";
    GridView1.DataSource = abal.Qry_Fire(qry);
    GridView1.DataBind();
}
protected void GridView1_RowEditing(object sender, GridViewEditEventArgs e)
{
    GridView1.EditIndex = e.NewEditIndex;
    bindgrid();
}
protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)
{
    Label l = (Label)GridView1.Rows[e.RowIndex].FindControl("lblpid");
    TextBox txtproductdetail = (TextBox)GridView1.Rows[e.RowIndex].FindControl("txtproductdetail");
    FileUpload f = (FileUpload)GridView1.Rows[e.RowIndex].FindControl("FileUpload1");
    string path = "~/user/product_image/" + f.FileName.ToString();
    int msg = abal.Qry_All("update productdetail set pdetail='" + txtproductdetail.Text + "',pimage='" + path 

+ "' WHERE pid='" + Convert.ToInt32(l.Text) + "'");
    if(msg==1)
        f.SaveAs(Server.MapPath(path));
    GridView1.EditIndex = -1;
    bindgrid();
}

【问题讨论】:

  • 你遇到了什么错误
  • 没有触发器没有错误..但是文件的文件名不可访问..所以在 path 字段中它只写 ~/user/product_image/ 但应该是 ~ /user/product_image/filename.jpg
  • @merhardik 如果您的答案已解决,请更新您的答案,因为我收到一个错误,即通过 RegisterAsyncPostBackControl 或 RegisterPostBackControl 注册 ID 为“FileUpload1”的控件必须实现 INamingContainer、IPostBackDataHandler 或 IPostBackEventHandler

标签: asp.net datagridview asp.net-ajax


【解决方案1】:

我遇到了同样的问题并使用以下解决方案解决了它。

在你的代码后面添加如下代码。

Page.Form.Attributes.Add("enctype", "multipart/form-data");

protected void gvLineItems_RowDataBound(object sender, GridViewRowEventArgs e)
{
  if (e.Row.RowType == DataControlRowType.DataRow)
  {

    if (e.Row.RowState.Equals(DataControlRowState.Edit))
     {
       Button btnUpload = e.Row.FindControl("btnUpload") as Button;
       ScriptManager.GetCurrent(this).RegisterPostBackControl(btnUpload);
     }
  }
}

添加上述代码后,我可以检索 fileUpload 控件的值。

protected void UpdateRow(object sender, GridViewUpdateEventArgs e)
{
   FileUpload uploadedFile = (FileUpload)dgDocuments.Rows[editIndex].FindControl("UploadFile");
   if (uploadedFile.HasFile)
   {
    uploadedFile.SaveAs(FileUploadURL + "\\Temp\\" + uploadedFile.FileName);
   }
}

【讨论】:

    【解决方案2】:

    只需在&lt;/ContentTemplate&gt; 之后为FileUploader 添加PostBackTrigger,如下所示:

     </ContentTemplate>
      <Triggers>
      <asp:PostBackTrigger ControlID="FileUpload1" /> 
     </Triggers>
    </asp:UpdatePanel> 
    

    更新如果它在 gridview 中,那么你可以试试下面的代码:

     protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)  
     {  
       FileUpload flUpload = e.Row.FindControl("FileUpload1") as FileUpload;  
       ScriptManager.GetCurrent(this).RegisterPostBackControl(flUpload);  
     } 
    

    Update2gridview中添加事件OnRowDataBound

    <asp:gridview
        id="GridView1" 
        onrowdatabound="GridView1_RowDataBound"
    

    gridview添加代码

    【讨论】:

    • 它给出了类似“在 UpdataPanel 中找不到触发器的 ID 为 'FileUpload1' 的控件“'UpdatePanel1'”这样的错误可能是因为 FileUpload1 在 gridview 内..你能帮忙吗跨度>
    • 仍然无法正常工作.. 使用此代码没有任何变化.. rowupdating 也不会触发
    • 我做了上面的改变。现在它给出以下错误:通过 RegisterAsyncPostBackControl 或 RegisterPostBackControl 注册 ID 为“FileUpload1”的控件必须实现 INamingContainer、IPostBackDataHandler 或 IPostBackEventHandler。
    • @Arshad 如果可能的话,你能不能尝试解决这个问题,因为它与stackoverflow.com/questions/21283809/… 相同
    【解决方案3】:

    添加:Page.Form.Attributes.Add("enctype", "multipart/form-data");到页面加载事件:

    protected void Page_Load(object sender, EventArgs e)
            {
                Page.Form.Attributes.Add("enctype", "multipart/form-data"); 
                 ..............................
             }
    

    然后试试这个。

    </ContentTemplate>
      <Triggers>
      <asp:PostBackTrigger ControlID="GridView1" /> 
     </Triggers>
    </asp:UpdatePanel>
    

    【讨论】:

      【解决方案4】:

      更新面板无法与 Fileupload 类似的某些控件正常工作。因此请尝试使用 ajax 调用,这是一个更好的选择。

      【讨论】:

      • 解决办法是什么??你能详细说明一下吗??
      【解决方案5】:

      只需添加 "Page.Form.Attributes.Add("enctype", "multipart/form-data");"正如 Jisha Muthuswamy 发布的那样。由 UpdatePanel 包裹的 gridview 内的 FileUpload 控件永远无法访问,因此无法设置为 PostBackTrigger ControlID。谢谢

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-05-05
        • 2014-02-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-11-25
        相关资源
        最近更新 更多