2013-07-31 5 views
1

Я загружаю изображения с помощью элемента управления Fileupload и после загрузки файла при нажатии кнопки «Загрузить» файл будет сохранен в папке на сервере, но перед сохранением в базе данных мне нужно добавить описание изображения вместе с изображение. Но я не знаю, что я получаю некоторую ошибку. Я могу сохранить файл в папке, но когда я сохраню его в базе данных, будет найден только один динамический добавленный элемент управления, а затем он даст Ссылка на объект не установлена ​​в экземпляр объекта Даже если в этом конкретном div имеется несколько элементов управления , Прежде чем перейти в код, я расскажу, какие элементы управления я добавляю после загрузки файла. Я добавляю один элемент управления изображением и текстовое поле для каждого из файлов изображений, которые я загрузил. Когда я загружаю только один файл, он просто войдет в foreach цикл снова после 1-го раза .. Мой код может объяснить это больше.Ошибка в поиске динамического созданного элемента управления

Так что это мой .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; 
    } 
} 

* Я получаю сообщение об ошибке в последней части кода выше, т.е. сохранить щелчок кнопки события. Для управления текстовым полем я получаю ошибку. Первое изображение будет сохранено успешно, но для других изображений его не обнаружит, даже если они присутствуют в дизайне. *

Я просто хочу знать ли я совершать какие-либо ошибки сохранения нажмите событие или есть какая-то ошибка в целом кодирования себя

Редактировать

Так что это источник 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> 

Эдите d

KI просто пошел вглубь, за исключением я получаю ... Его говоря ..

'((System.Web.UI.HtmlControls.HtmlContainerControl) (DV)). InnerHtml' кинул исключение типа «System.Web.HttpException»

Что это значит на самом деле. В нем также говорится, что контроль не является буквальным. Что это значит. Почему это не удается найти элемент управления, который у меня есть? прилагается .. Помогите мне пожалуйста.

+0

FindControl не только осуществляет поиск на одном уровне, но и все иерархии управления. возможно, это не причина ошибки, но это помогает понять ситуацию. также вы можете проверить Request.Form.Keys и посмотреть, есть ли идентификатор текстового поля. – TakeMeAsAGuest

+0

@TakeMeAsAGuest .. Скажем, если у меня есть div, и я включаю динамически добавленные текстовые поля и изображения в этом div. Теперь, если я использую Findcontrols и найду эти идентификаторы, тогда, очевидно, я должен получить право. Есть элементы управления с этим правом когда я вижу это во время выполнения. Но findcontrol не найдет его ...:(Пожалуйста, дайте мне решение, если u knw ... –

+0

@TakeMeAsAGuest .. Невозможно проверить изображения с помощью Request.Form.Keys .. cs Я могу найти текстовые поля, но не изображения ... :( –

ответ

0

добавьте элементы управления в событие PreRender, получите доступ к ним, по крайней мере, из PageLoad.

+0

@TakeMeAsAGuest. Я снова загружаю элементы управления в page_load. Поэтому всякий раз, когда страница загружается, элементы управления будут там. Здесь есть 2 случая: Case1: Если я загружаю только один файл, тогда изображение и текстовое поле, относящиеся к этому файл будет обработан и добавлен .. Но здесь он снова входит в forloop и пытается найти элемент управления ... который дает ошибку .. Case2: Если файлов более одного файла, то и в том же случае .. Это идет in и wont find any control ... :( –

0

Можете ли вы также включить HTML-источник после его рендеринга в браузер? Что делать, если cd.FindControl("ind" + cnt1) возвращает null в первом случае?

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

Первый случай, когда он не вернет null .. только со второго раза он вернется, поскольку ссылка на объект не установлена ​​в экземпляр объекта ... Кстати, вы отправили тот же код, что я пробовал ... Вы будете разрабатывать PLS ... –

+0

@Amit ... Я добавил источник HTML после рендеринга .. Можете ли вы получить представление об этом сейчас ... :( –