在GridView中更新事件后无限循环

时间:2013-01-09 10:13:55

标签: c# asp.net gridview

我正面临一个非常奇怪的问题而且不知道该怎么做。但会尽我所能。

我有一个网格视图,它包含文件上传控件,当调用Update事件时,文件存储在DB中。文件上传代码被写为一个函数,只要单击更新按钮就会调用该函数。

现在一切都很好,就像我点击更新,文件在数据库中更新,但页面进入无限循环,似乎正在处理某些事情。过了一段时间后,会出现一个对话框,在其中我可以选择以上传的格式文件下载整个网页(不知道原因,这个对话框是如何出现的),但页面仍处于循环中并正在处理中。我已经检查了我的代码数百次,但仍然无法找到问题。

任何解决方案都会受到欢迎。提前谢谢。

上传文档代码

rotected void UploadDoc(object sender, EventArgs e)
    {
        int i = 0;

        foreach (GridViewRow row in GVTaskCompDept.Rows)
        {
            if ((row.RowState & DataControlRowState.Edit) > 0)
            {
                FileUpload FU = (FileUpload)GVTaskCompDept.Rows[i].Cells[8].FindControl("FileUpload1");

                string filePath = FU.PostedFile.FileName;
                string filename = Path.GetFileName(filePath);

                if (filePath != null && filePath != "")
                {
                    FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read);
                    BinaryReader br = new BinaryReader(fs);
                    Byte[] bytes = br.ReadBytes((Int32)fs.Length);
                    br.Close();
                    fs.Close();

                    string ext = System.IO.Path.GetExtension(FU.FileName).TrimStart(".".ToCharArray()).ToLower();
                    string name = System.IO.Path.GetFileName(FU.FileName);

                    // string ContentType = "";
                    if (ext == "doc" || ext == "docx")
                        ContentType = "application/vnd.ms-word";
                    else if (ext == "xlx" || ext == "xlsx" || ext == "xls")
                        ContentType = "application/vnd.ms-excel";
                    else if (ext == "jpeg" || ext == "jpeg")
                        ContentType = "image/jpeg";
                    else if (ext == "pdf")
                        ContentType = "application/pdf";

                    (Session)["Data"] = bytes;
                    (Session)["Name"] = name;
                    (Session)["Type"] = ContentType;
                }
                else
                {
                    (Session)["Data"] = null;
                    (Session)["Name"] = null;
                    (Session)["Type"] = null;
                }
            }
            i += 1;
        }
    }

RowUpdating事件与

类似
 protected void GVTaskCompDept_RowUpdating(object sender, GridViewUpdateEventArgs e)
    {          
            GridViewRow gvrow = GVTaskCompDept.Rows[e.RowIndex];
            Session["rowindex"] = e.RowIndex;
            UploadDoc(null, null);              

     //---Some Code-----//       

            {
                DSTaskCompliance.UpdateParameters["UploadDocTitle"].DefaultValue = (Session)["Name"].ToString();
                DSTaskCompliance.UpdateParameters["UploadDocType"].DefaultValue = (Session["Type"]).ToString();
            }
 //-------Some Code---------//
 DSTaskCompliance.Update();
            DSTaskCompliance.DataBind();            
    }

现在在DataSource更新事件中,我将会话变量与其他部分代码一起传递给DB

protected void DSTaskCompliance_Updating(object sender, SqlDataSourceCommandEventArgs e)
    {
        e.Command.Parameters["@UploadDocContent"].Value = Session["Data"];
    } 

2 个答案:

答案 0 :(得分:0)

你这样的代码没有意义。无论如何,UploadDoc代码最有可能在下面的行中引发异常:

FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read);

filePath是客户端路径(在非IE浏览器中只是文件名),并且尝试在服务器上打开在生产方案中必然会失败。它可能在dev环境中工作,其中客户端/服务器都是同一台机器。

就您的具体问题而言,我怀疑是在页面的另一部分 - 您是否在页面中有任何代码试图显示/下载上传的文档?显然,您是否尝试通过在visual studio等中设置断点来调试问题

答案 1 :(得分:0)

最后,最后我可以找到解决问题的方法。这只是一个小错误。在上面的代码中,我指定了'ContentType',以便在上传特定类型的文件时具体。例如:对于word文件,它是application / vnd.ms-word。

没有必要指定这个,因为我发现代码自己找到类型并将其存储在DB中。我不需要。由于将其指定为应用程序,它总是倾向于以上载的格式下载文件。

非常感谢您的支持!!!!! :)