私のウェブサイトでは、asp:FileUpload [複数のファイル - 画像] を介して写真をアップロードしています。アップロード後、アップロードされた画像の説明を書き込むテキストボックスとともにパネルに表示しています。次に、それらをデータベースに保存します。しかし、保存イベントでテキストボックスの値を見つけたり、パネルに追加したコントロールを見つけることができません。ただし、画像とテキストボックスはパネルに表示されます。
私のフロントエンドコードは次のようなものです:
<form id="form1" 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" Text="Save" OnClick="btnsave_Click" Font-Bold="true" BackColor="Yellow" />
</asp:Panel>
</div>
</form>
私のバックエンドコードは次のようなものです:
protected void uploadFile_Click(object sender, EventArgs e)
{
if (UploadImages.HasFiles)
{
int tid = 0;
string fileExt = Path.GetExtension(UploadImages.FileName).ToLower();
if (fileExt == ".jpeg" || fileExt == ".png" || fileExt == ".jpg" || fileExt == ".bmp")
{
HtmlGenericControl dh = new HtmlGenericControl("div");
dh.Attributes.Add("class", "head");
dh.InnerText = "Write Description";
updtpanel.Controls.Add(dh);
HtmlGenericControl dload;
foreach (HttpPostedFile uploadedFile in UploadImages.PostedFiles)
{
tid = tid + 1;
textid = "txt" + tid;
Image img = new Image();
TextBox ta = new TextBox();
ta.TextMode = TextBoxMode.MultiLine;
filepath = Server.MapPath("~/Images/Gallery/" + uploadedFile.FileName);
uploadedFile.SaveAs(filepath);
newpath = "../Images/Gallery/" + uploadedFile.FileName;
try
{
dload = new HtmlGenericControl("div");
updtpanel.Visible = true;
dload.Attributes.Add("class", "dataload");
dload.Attributes.Add("runat", "server");
dload.ID = "ind" + tid;
img.CssClass = "loadimg";
img.ImageUrl = newpath.ToString();
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);
}
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);
}
}
protected void btnsave_Click(object sender, EventArgs e)
{
foreach (Control c in updtpanel.Controls)
{
cnt1 += 1;
HtmlGenericControl div = ((HtmlGenericControl)updtpanel.FindControl("ind"+cnt1.ToString()));
foreach (Control nc in div.Controls)
{
string str = "";
string iurl = "";
TextBox txt = (TextBox)div.FindControl("txt" + cnt1.ToString());
Image img = (Image)div.FindControl("img" + cnt1.ToString());
str = txt.Text;
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;
}
しかし、保存中にエラーが発生し、保存クリックイベントのFindcontrolの後にオブジェクト参照がオブジェクトのインスタンスに設定されていないというエラーが表示されます。私が間違っているところ。私は過去3日間からこれを実際に取り組んでいますが、まだ取得できません。これから抜け出す方法を教えてください。
これに追加する必要があるものは他にありますか? ポストバック後に Page_Load でコントロールを再作成する必要があると述べているサイトに出くわしました。しかし、イベントでコントロールを作成しているときに、Page_Load でコントロールを再作成するにはどうすればよいですか。