2013-07-31 13 views
1

我使用Fileupload控件上传图片,并在点击Upload按钮时加载文件后,该文件将保存在服务器中的文件夹中,但在保存到数据库之前,我需要添加图像描述以及图像..但我不知道我得到一些错误。我能够保存文件夹中的文件,但是当我将它保存到数据库中时,只会找到一个动态添加的控件,然后它会给出未将对象引用设置为对象的实例即使该特定div中有多个控件。在进入代码之前,我会告诉我在上传文件后添加了哪些控件..我为每个上传的图像文件添加了一个图像控件和文本框。当我只上传一个文件时,它将简单地进入foreach第一次后再循环..我的代码可能会解释更多。查找动态创建的控件时出错

所以这是我的.aspx代码:

<form id="ContentPlaceHolder1" runat="server"> 

    <div class="transbox" id="mainbk" runat="server" style="position:absolute; top:0px; left:0px; width: 100%; height: 100%;" > 
     <asp:FileUpload runat="server" ID="UploadImages" style="background-color:white; position:absolute; font-family:'Palatino Linotype'; font-size:medium; top: 4px; left: 350px; right: 251px;" Width="500px" AllowMultiple="true"/> 

     <asp:Button runat="server" ID="uploadedFile" style="position:absolute; font-family:'Palatino Linotype'; font-size:medium; top: 4px; left: 870px; width: 112px; height: 29px;" Text="Upload" OnClick="uploadFile_Click" /> 
     <asp:Panel ID="updtpanel" runat="server" CssClass="transbox" style="width:100%;height:100%;left:0px;top:0px;position:absolute" Visible="false"> 
      <asp:Button ID="btnsave" runat="server" UseSubmitBehavior="true" Text="Save" OnClick="btnsave_Click" Font-Bold="true" BackColor="Yellow"></asp:Button> 

     </asp:Panel> 
    </div> 


    </form> 

,这是我的后端代码。

SqlCommand com = new SqlCommand(); 
SqlConnection con = new SqlConnection(); 
SqlDataReader reader; 
int id = 0; 
StringBuilder sb = new StringBuilder(); 
string filepath = ""; 
string newpath = ""; 
int tid = 0; 
int count = 0; 
int cnt1 = 0; 
string textid = ""; 
Panel dload; 
Image img; 
TextBox ta; 
protected void Page_Load(object sender, EventArgs e) 
{ 

    con.ConnectionString = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString; 
    con.Open(); 
    com = new SqlCommand("select max(slid) from slider", con); 
    reader = com.ExecuteReader(); 
    if (reader.HasRows) 
    { 
     while (reader.Read()) 
     { 
      id = Convert.ToInt32(reader.GetInt32(0)); 
     } 
    } 
    con.Close(); 
    com.Dispose(); 
    HtmlGenericControl dh = new HtmlGenericControl("div"); 
    dh.Attributes.Add("class", "head"); 
    dh.InnerText = "Write Description"; 
    updtpanel.Controls.Add(dh); 
    foreach (HttpPostedFile upld in UploadImages.PostedFiles) 
    { 
     createImgPanel(); 
    } 
} 



protected void uploadFile_Click(object sender, EventArgs e) 
{ 
    if (UploadImages.HasFiles) 
    { 
     string fileExt = Path.GetExtension(UploadImages.FileName).ToLower(); 
     if (fileExt == ".jpeg" || fileExt == ".png" || fileExt == ".jpg" || fileExt == ".bmp") 
     { 
      foreach (HttpPostedFile uploadedFile in UploadImages.PostedFiles) 
      { 
       count += 1; 
       filepath = Server.MapPath("~/Images/Gallery/" + uploadedFile.FileName); 
       uploadedFile.SaveAs(filepath); 
       newpath = "../Images/Gallery/" + uploadedFile.FileName; 
       try 
       { 
        Image nimg = dload.FindControl("img" + count) as Image; 
        nimg.ImageUrl = newpath.ToString(); 
       } 

       catch (Exception ex) 
       { 
        Response.Write(ex.Message); 
       } 

      } 
     } 
     else 
     { 
      Page.ClientScript.RegisterStartupScript(GetType(), "msgbox", "alert('Please Select only Image Files!!');", true); 
     } 

    } 
    else 
    { 
     Page.ClientScript.RegisterStartupScript(GetType(), "msgbox", "alert('Please Select a File First!!');", true);   
    } 
} 

public void createImgPanel() 
{ 
    tid = tid + 1; 
    textid = "txt" + tid; 
    ta = new TextBox(); 
    img = new Image(); 
    ta.TextMode = TextBoxMode.MultiLine; 
    dload = new Panel(); 
    updtpanel.Visible = true; 
    dload.Attributes.Add("class", "dataload"); 
    //dload.Attributes.Add("runat", "server"); 
    dload.ID = "ind" + tid; 
    img.CssClass = "loadimg"; 

    img.ID = "img" + tid; 
    //img.Attributes.Add("runat", "server"); 
    ta.Attributes.Add("class", "txtdes"); 
    ta.ID = textid; 
    //ta.Attributes.Add("runat", "server"); 
    dload.Controls.Add(img); 
    dload.Controls.Add(ta); 
    updtpanel.Controls.Add(dload); 
} 

protected void btnsave_Click(object sender, EventArgs e) 
{ 
    if (Page.IsPostBack) 
    { 

      Panel pv = (this.Form.FindControl("mainbk").FindControl("updtpanel")) as Panel; 

      foreach (Control cd in pv.Controls) 
      { 
       cnt1 = cnt1 + 1; 
       TextBox txt = cd.FindControl("ind" + cnt1).FindControl("txt" + cnt1) as TextBox;****This is where I am getting the above said error**** 
       Image img = cd.FindControl("ind" + cnt1).FindControl("img" + cnt1) as Image; 

        string str = ""; 
        str = txt.Text; 
        string iurl = ""; 
        iurl = img.ImageUrl; 

        id += 1; 

        string Insert = "Insert into slider (slid,slurl,slalt) values (@id,@IMAGE_PATH,@alter)"; 
        SqlCommand cmd = new SqlCommand(Insert, con); 
        cmd.Parameters.AddWithValue("@IMAGE_PATH", iurl); 
        cmd.Parameters.AddWithValue("@id", id); 
        cmd.Parameters.AddWithValue("@alter", str); 
        try 
        { 
         con.Open(); 
         cmd.ExecuteNonQuery(); 
         con.Close(); 

        } 
        catch (Exception e1) 
        { 
         Response.Write(e1.Message); 
        } 
       } 





     updtpanel.Visible = false; 
    } 
} 

* 我在上面的代码即保存按钮单击事件的最后一部分收到错误。对于文本框查找控件我收到错误。 First Image将被成功保存,但对于其他图像,即使它们存在于设计中,也不能找到控制。 *

我只是想知道我是否犯任何错误,在保存单击事件或有整体编码本身

编辑

任何错误,所以这是HTML源代码之后呈现控件在运行时:

<div id="mainbk" class="transbox" style="position:absolute; top:0px; left:0px; width: 100%; height: 100%;"> 
      <input type="file" multiple="multiple" name="UploadImages" id="UploadImages" style="width:500px;background-color:white; position:absolute; font-family:'Palatino Linotype'; font-size:medium; top: 4px; left: 350px; right: 251px;"> 

      <input type="submit" name="uploadedFile" value="Upload" id="uploadedFile" style="position:absolute; font-family:'Palatino Linotype'; font-size:medium; top: 4px; left: 870px; width: 112px; height: 29px;"> 
      <div id="updtpanel" class="transbox" style="width:100%;height:100%;left:0px;top:0px;position:absolute"> 

       <input type="submit" name="btnsave" value="Save" id="btnsave" style="background-color:Yellow;font-weight:bold;"> 

      <div class="head">Write Description</div><div id="ind1" class="dataload"> 
      <img id="img1" class="loadimg" runat="server" src="../Images/Gallery/God%201.jpg"> 
<textarea name="txt1" rows="2" cols="20" id="txt1" class="txtdes"></textarea> 
     </div><div id="ind2" class="dataload"> 
      <img id="img2" class="loadimg" runat="server" src="../Images/Gallery/God%202.jpg"> 
<textarea name="txt2" rows="2" cols="20" id="txt2" class="txtdes"></textarea> 
     </div><div id="ind3" class="dataload"> 
      <img id="img3" class="loadimg" runat="server" src="../Images/Gallery/God%203.jpg"> 
<textarea name="txt3" rows="2" cols="20" id="txt3" class="txtdes"></textarea> 
     </div> 
    </div> 
     </div> 

Edite d

KI刚去深入投掷了我得到的例外...它说..

'innerHTML的((DV)(System.Web.UI.HtmlControls.HtmlContainerControl))'类型“System.Web.HttpException”的例外

什么,这实际上意味着。其还表示,该控制并非字面..这是什么意思。为什么它不能够找到我的控制附加..请帮我看看..

+0

FindControl不仅仅搜索一个层次,而是搜索所有的控制层次。也许它不是错误的原因,但它有助于弄清楚事情。你也可以检查Request.Form.Keys,看看是否有文本框的ID。 – TakeMeAsAGuest

+0

@TakeMeAsAGuest ..说如果我有一个div,并且包括我在该div中动态添加的文本框和图像。现在,如果我使用Findcontrols并找到这些ID,那么显然我应该正确..有控制权当我在运行时看到它..但findcontrol不会找到它...:(请给我一个解决方案,如果你呃... –

+0

@TakeMeAsAGuest ..是不是可以检查图像使用Request.Form.Keys .. cs我能够找到文本框,但不是图像...... :( –

回答

0

在PreRender事件中添加控件,至少从PageLoad访问它们。

+0

@TakeMeAsAGuest ..我再次在page_load中加载控件..所以每当页面加载的控件将在那里..有两种情况在这里: Case1:如果我只上传一个文件,然后图像和文本框关于那文件将被处理并添加..但在这里它再次进入forloop,并试图找到控制...这会给出错误.. 情况2:如果有多个文件,那么也是相同的情况..它会在和不会找到任何控制...... :( –

0

你还可以在HTML呈现给浏览器之后添加HTML源代码吗? 如果cd.FindControl("ind" + cnt1)在第一种情况下返回null?

cd.FindControl("ind" + cnt1).FindControl("txt" + cnt1) as TextBox 
+0

第一种情况下,它不会返回null..only从第二次它将返回作为对象引用未设置为对象的实例... 顺便说一句,你已经发布了相同的代码,我已经尝试过...你会详细说明请... –

+0

@Amit ...我已经在渲染后添加了HTML源代码。你现在可以得到一些想法... :( –