none
后台获取gridview模版列控件值问题 RRS feed

  • 问题

  • 我在前台gridview模版里放了一个上传控件

     <asp:TemplateField HeaderText="图片" SortExpression="Img">
                                <ItemTemplate>
                                    <%# Eval("Img")%>
                                </ItemTemplate>
                                <EditItemTemplate>
                                    <asp:HiddenField ID="hdfImg" runat="server" Value='<%# Eval("Img")%>' />
                                    <input type="file" runat="server" id="UpFile" style="width: 132px;" />
                                </EditItemTemplate>
                            </asp:TemplateField>
    

    我在后台获取这个ID为UpFile的值获取不到,不报错,为空 ,我别的文本框、下拉框都可以获取到
    我换成FileUpload控件后台还是获取不到值,这是为什么?

     string upFile = ((HtmlInputFile)gdvData.Rows[e.RowIndex].FindControl("UpFile")).Value;

    我只要是想用gridview自带的编辑实现 图片修改,可是老是获取不到file控件的值

    这是我代码问题吗?

    2012年7月13日 5:10

答案

  • 我完全可以,参考我的简化代码!

    [aspx]

    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="CSharp.WebForm1" %>
     
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <title></title>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
            <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" 
                onrowediting="GridView1_RowEditing" onrowupdating="GridView1_RowUpdating">
                <Columns>
                    <asp:TemplateField HeaderText="图片" SortExpression="Img">
                        <ItemTemplate>
                            ss
                        </ItemTemplate>
                        <EditItemTemplate>
                            <asp:FileUpload ID="FileUpload1" runat="server" />
                        </EditItemTemplate>
                    </asp:TemplateField>
                    <asp:CommandField ShowEditButton="True" />
                </Columns>
            </asp:GridView>
        </div>
        </form>
    </body>
    </html>
    

    [cs]

    public partial class WebForm1 : System.Web.UI.Page
        {
            private static List<string> files = new List<string> {"a","n" };
     
            protected void Page_Load(object sender, EventArgs e)
            {
                if (!IsPostBack)
                {
                    GridView1.DataSource = files;
                    GridView1.DataBind();
                }
            }
     
            protected void GridView1_RowEditing(object sender, GridViewEditEventArgs e)
            {
                GridView1.EditIndex = e.NewEditIndex;
                GridView1.DataSource = files;
                GridView1.DataBind();
            }
     
            protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)
            {
                Response.Write((GridView1.Rows[e.RowIndex].FindControl("FileUpload1")as FileUpload).FileName+"<br/>");
                Response.Write((GridView1.Rows[e.RowIndex].FindControl("FileUpload1"as FileUpload).PostedFile.FileName);
            }
        }

    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2012年7月13日 9:16
  • 我是用下列的程序代码来仿真你的状况,可以正确取得到EditTemplate中的hdfImg和UpFile,或许你可以比较一下跟你的程序代码有什么不同,看看对你是否有帮助。

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    
    namespace DemoCSharp
    {
        public partial class WebForm5 : System.Web.UI.Page
        {
            protected void Page_Load(object sender, EventArgs e)
            {
    
            }
    
            protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)
            {
                
                HiddenField hf = GridView1.Rows[e.RowIndex].FindControl("hdfImg") as HiddenField;
                if (hf != null) Response.Write(hf.Value + "<br/>");
    
                System.Web.UI.HtmlControls.HtmlInputFile hif = GridView1.Rows[e.RowIndex].FindControl("UpFile") as System.Web.UI.HtmlControls.HtmlInputFile;
                if (hif != null) Response.Write(hif.Value);
    
            }      
        }
    }
    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm5.aspx.cs" Inherits="DemoCSharp.WebForm5" %>
    
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <title></title>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
            <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" 
                DataKeyNames="RegionID" DataSourceID="SqlDataSource1" onrowupdating="GridView1_RowUpdating">
                <Columns>
                    <asp:CommandField ShowEditButton="True" />
                    <asp:BoundField DataField="RegionID" HeaderText="RegionID" ReadOnly="True" 
                        SortExpression="RegionID" />
                    <asp:BoundField DataField="RegionDescription" HeaderText="RegionDescription" 
                        SortExpression="RegionDescription" />
                    <asp:TemplateField HeaderText="圖片">
                        <EditItemTemplate>
                            <asp:HiddenField ID="hdfImg" runat="server" Value='<%# Eval("RegionDescription")%>' />
                            <input type="file" runat="server" id="UpFile" style="width: 132px;" />
                        </EditItemTemplate>
                    </asp:TemplateField>
                </Columns>
            </asp:GridView>
            <asp:SqlDataSource ID="SqlDataSource1" runat="server" 
                ConnectionString="<%$ ConnectionStrings:NorthwindConnectionString %>" 
                SelectCommand="SELECT * FROM [Region]"></asp:SqlDataSource>
        </div>
        </form>
    </body>
    </html>
    



    以上說明若有錯誤請指教,謝謝。
    http://www.dotblogs.com.tw/terrychuang/

    2012年7月14日 3:05

全部回复

  • 可以参考 http://www.cnblogs.com/cracker/archive/2011/09/21/mvc_upload_progress.html 这篇文章 试试!
    2012年7月13日 7:09
    版主
  • 我用了,不行的,file和fileupload都不行,但是如果我换成文本框或者下拉框就没问题..
    2012年7月13日 7:45
  • 我用了,不行的,file和fileupload都不行,但是如果我换成文本框或者下拉框就没问题..

    我突然发现一个问题——你的FileUpLoad是在EditTemplate中!

    请在RowEdit或者RowUpdating事件中获取它。例如:

    protected void TaskGridView_RowEditing(object sender, GridViewEditEventArgs e)
      {
        FileUpLoad fl = GridView1.Rows[e.NewEditInde].FindControl("Id of FindControl") as FileUpLoad;
        //Bind data to the GridView control by resetting the DataSource and call DataBind()
        BindData();
      }


    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2012年7月13日 8:16
  • 我用了,不行的,file和fileupload都不行,但是如果我换成文本框或者下拉框就没问题..

    我突然发现一个问题——你的FileUpLoad是在EditTemplate中!

    请在RowEdit或者RowUpdating事件中获取它。例如:

    protected void TaskGridView_RowEditing(object sender, GridViewEditEventArgs e)
      {
        FileUpLoad fl = GridView1.Rows[e.NewEditInde].FindControl("Id of FindControl") as FileUpLoad;
        //Bind data to the GridView control by resetting the DataSource and call DataBind()
        BindData();
      }


    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    是的这两控件都不行,但是在RowEditing事件里,我都没给上传空间赋值呢,怎么能获取到值呢
    2012年7月13日 8:45
  • 在Row_Updating事件中看看!

     protected void TaskGridView_RowUpdating(object sender, GridViewUpdateEventArgs e)
      {
              FileUpLoad fl = GridView1.Rows[e.RowIndex].FindControl("Id of FindControl") as FileUpLoad;
      }


    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2012年7月13日 8:55
  • 在Row_Updating事件中看看!

     protected void TaskGridView_RowUpdating(object sender, GridViewUpdateEventArgs e)
      {
              FileUpLoad fl = GridView1.Rows[e.RowIndex].FindControl("Id of FindControl") as FileUpLoad;
      }


    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    我这个一开始就在RowUpdating事件里才获取不到值的....
    2012年7月13日 9:02
  • 我完全可以,参考我的简化代码!

    [aspx]

    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="CSharp.WebForm1" %>
     
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <title></title>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
            <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" 
                onrowediting="GridView1_RowEditing" onrowupdating="GridView1_RowUpdating">
                <Columns>
                    <asp:TemplateField HeaderText="图片" SortExpression="Img">
                        <ItemTemplate>
                            ss
                        </ItemTemplate>
                        <EditItemTemplate>
                            <asp:FileUpload ID="FileUpload1" runat="server" />
                        </EditItemTemplate>
                    </asp:TemplateField>
                    <asp:CommandField ShowEditButton="True" />
                </Columns>
            </asp:GridView>
        </div>
        </form>
    </body>
    </html>
    

    [cs]

    public partial class WebForm1 : System.Web.UI.Page
        {
            private static List<string> files = new List<string> {"a","n" };
     
            protected void Page_Load(object sender, EventArgs e)
            {
                if (!IsPostBack)
                {
                    GridView1.DataSource = files;
                    GridView1.DataBind();
                }
            }
     
            protected void GridView1_RowEditing(object sender, GridViewEditEventArgs e)
            {
                GridView1.EditIndex = e.NewEditIndex;
                GridView1.DataSource = files;
                GridView1.DataBind();
            }
     
            protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)
            {
                Response.Write((GridView1.Rows[e.RowIndex].FindControl("FileUpload1")as FileUpload).FileName+"<br/>");
                Response.Write((GridView1.Rows[e.RowIndex].FindControl("FileUpload1"as FileUpload).PostedFile.FileName);
            }
        }

    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2012年7月13日 9:16
  • 我是用下列的程序代码来仿真你的状况,可以正确取得到EditTemplate中的hdfImg和UpFile,或许你可以比较一下跟你的程序代码有什么不同,看看对你是否有帮助。

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    
    namespace DemoCSharp
    {
        public partial class WebForm5 : System.Web.UI.Page
        {
            protected void Page_Load(object sender, EventArgs e)
            {
    
            }
    
            protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)
            {
                
                HiddenField hf = GridView1.Rows[e.RowIndex].FindControl("hdfImg") as HiddenField;
                if (hf != null) Response.Write(hf.Value + "<br/>");
    
                System.Web.UI.HtmlControls.HtmlInputFile hif = GridView1.Rows[e.RowIndex].FindControl("UpFile") as System.Web.UI.HtmlControls.HtmlInputFile;
                if (hif != null) Response.Write(hif.Value);
    
            }      
        }
    }
    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm5.aspx.cs" Inherits="DemoCSharp.WebForm5" %>
    
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <title></title>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
            <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" 
                DataKeyNames="RegionID" DataSourceID="SqlDataSource1" onrowupdating="GridView1_RowUpdating">
                <Columns>
                    <asp:CommandField ShowEditButton="True" />
                    <asp:BoundField DataField="RegionID" HeaderText="RegionID" ReadOnly="True" 
                        SortExpression="RegionID" />
                    <asp:BoundField DataField="RegionDescription" HeaderText="RegionDescription" 
                        SortExpression="RegionDescription" />
                    <asp:TemplateField HeaderText="圖片">
                        <EditItemTemplate>
                            <asp:HiddenField ID="hdfImg" runat="server" Value='<%# Eval("RegionDescription")%>' />
                            <input type="file" runat="server" id="UpFile" style="width: 132px;" />
                        </EditItemTemplate>
                    </asp:TemplateField>
                </Columns>
            </asp:GridView>
            <asp:SqlDataSource ID="SqlDataSource1" runat="server" 
                ConnectionString="<%$ ConnectionStrings:NorthwindConnectionString %>" 
                SelectCommand="SELECT * FROM [Region]"></asp:SqlDataSource>
        </div>
        </form>
    </body>
    </html>
    



    以上說明若有錯誤請指教,謝謝。
    http://www.dotblogs.com.tw/terrychuang/

    2012年7月14日 3:05