سلام . من از طریق fileupload اطلاعات (عکس و متن word و...) از ورودی گرفتم در مسیر مشخصی ذخیره کردم و اون اطلاعات رو از طریق گرید ویو ( اسم فایل و حجم فایل و پسوند فایل) رو نمایش دادم . حالا می خوام اطلاعاتی که داخل گرید ویو هست سطر به سطر از داخل گرید ویو درون دیتابیس ذخیره کنم . نمیدونم باید چیکار کنم . لطفاً راهنماییم کنید. فیلد های داخل دیتابیس fileName , fileByte , FileSize می باشد.
protected void Buttom_Click(object sender, EventArgs e) { DataTable dt = new DataTable(); if (FileUpload_image.HasFile == true) { FileUpload_image.PostedFile.SaveAs(Server.MapPath("~/Image/Upload_File/") + FileUpload_image.FileName); dt.Columns.Add("Type", typeof(string)); dt.Columns.Add("Byte", typeof(string)); dt.Columns.Add("Name", typeof(string)); foreach (string strFile in Directory.GetFiles(Server.MapPath("~/Image/Upload_File"))) { FileInfo fi = new FileInfo(strFile); dt.Rows.Add(fi.Extension, fi.Length, fi.Name); } } GridView2.DataSource = dt; GridView2.DataBind(); }
و خود گرید ویو هم به اینصورت می باشد
<asp:GridView ID="GridView2" runat="server" > <AlternatingRowStyle BackColor="AliceBlue" /> <Columns> <asp:TemplateField HeaderText="ردیف" HeaderStyle-BackColor="Moccasin"> <ItemTemplate> <asp:Label ID="Label1" runat="server" Text="<%#Container.DataItemIndex+1 %>"></asp:Label> </ItemTemplate> <HeaderStyle HorizontalAlign="Center" VerticalAlign="Middle" /> </asp:TemplateField> <asp:BoundField DataField="Type" HeaderText="نوع فایل" /> <asp:BoundField DataField="Byte" HeaderText="حجم فایل" /> <asp:BoundField DataField="Name" HeaderText="نام فایل" /> <asp:TemplateField HeaderText="عملیات"> <ItemTemplate> <asp:LinkButton ID="LinkButton1" runat="server" CssClass="btn btn-danger btn-xs" CommandName="Delete">حذف</asp:LinkButton> </ItemTemplate> </asp:TemplateField> </Columns> </asp:GridView>
می تونی همون جا که داری دیتا رو وارد دیتا تیبل می کنی دستور ورود اطلاعات به دیتا بیس رو هم به صورت سطر سطر بنویسی(بسته به نوع ارتباط برقرار کردن با دیتا بیس متفاوته)
یا اینکه یه foreach بزاری روی سطر های گرید ویو مثل کد زیر اطلاعاتشون رو بدست بیار و بعد به دیتا بیس اضافه کنی
foreach (GridViewRow row in GridViewTasks.Rows) { test.fileName=row.Cells[0].Text; test.fileByte=row.Cells[1].Text; test.FileSize=row.Cells[2].Text; . . . }
ممنون بابت راهنماییت
اگه بخوام دستوری که در Buttom_Click نوشتم در fileupload بنویسم باید چیکار کنم ؟ برای مثال من اینچا از fileupload عکس یا فایل را انتخاب میکردم و توسط کدی که در Buttom_Click نوشتم اطلاعات رو در گرید ویو بهم نمایش میداد اگه بخوام مستقیم اطلاعات رو از fileupload بخونم و بعد اطلاعات مستقیم در داخل گرید نمایش داده بشه و دیگه نیازی به Buttom_Click نباشه باید چیکار کنم ؟
به طور پیش فرض کنترل FileUplaud این قابلیت رو نداره ولی میشه با چند خط جاوا اسکریپت اینکار رو هم انجام داد.
روش کار:
فرض می کنیم این فرم شما باشه که توی اون دکمه ارسال رو مخفی کردیم
<asp:FileUpload ID="FileUpload1" runat="server" /> <br /> <asp:Label ID="lblMessage" runat="server" Text="File uploaded successfully." ForeColor="Green" Visible="false" /> <asp:Button ID="btnUpload" Text="Upload" runat="server" OnClick="Upload" Style="display: none" />
توی فرم لودتون این کد رو اظافه کنین تا رویداد( فک کنم سمت کلاینت کنترل) onchange رو به تابع جاوا اسکریپ UlpoudFile وصل کنه
protected void Page_Load(object sender, EventArgs e) { FileUpload1.Attributes["onchange"] = "UploadFile(this)"; }
اینم کد جاوا اسکریتیه ک باید بزاری
<script type="text/javascript"> function UploadFile(fileUpload) { if (fileUpload.value != '') { document.getElementById("<%=btnUpload.ClientID %>").click(); } } </script>
اینم کد ذخیره من
protected void Upload(object sender, EventArgs e) { FileUpload1.SaveAs(Server.MapPath("~/Uploads/" + Path.GetFileName(FileUpload1.FileName))); lblMessage.Visible = true; }
ممنون آقای لطفی جواب گرفتم .
یک مشکل دیگه هم داشتم . وقتی من از fileupload فایل رو انتخاب میکنم برای من داخل directory ذخیره میکنه و بعد داخل گرید بهم نمایش میده . مشکل اینجایکه وقتی فایلی رو از fileupload انتخاب میکنم اون فایل همراه با تمام فایل هایی که داخل directory هستش داخل گرید برام میاره در صورتی که من فقط میخوام فایل انتخابی رو برام داخل گرید لیست کنه . ممنون میشم راهنماییم کنید . کدی که این اشکال رو داره پایین میزارم
protected void Buttom_Click(object sender, EventArgs e) { DataTable dt = new DataTable(); if (FileUpload_image.HasFile == true) { FileUpload_image.PostedFile.SaveAs(Server.MapPath("~/Image/Upload_File/") + FileUpload_image.FileName); dt.Columns.Add("Type", typeof(string)); dt.Columns.Add("Byte", typeof(string)); dt.Columns.Add("Name", typeof(string)); foreach (string strFile in Directory.GetFiles(Server.MapPath("~/Image/Upload_File"))) { FileInfo fi = new FileInfo(strFile); dt.Rows.Add(fi.Extension, fi.Length, fi.Name); } } GridView2.DataSource = dt; GridView2.DataBind(); }
مشکل از این foreach است نمیدونم باید چطور حلش کرد
foreach (string strFile in Directory.GetFiles(Server.MapPath("~/Image/Upload_File"))) {
خب شما خودتون توی کد نوشتین که فایل هایی رو که آپلود کردین به عنوان رکورد در گرید ویوی اضافه کنه
نفهمیدم چیه مشکلتون دقیقا ؟
میخاین توی گرید فایلی که برای آپلود انتخاب کردین بیاد؟
مشکل اصلی من اینکه : مثلاً من از fileupload دو تا فایل انتخاب میکنم و باید در گرید ویو اون دو تا فایل رو بهم نمایش بده ولی چون از directory استفاده میکنم اون دوتا فایل و تمام فایلهایی که از قبل داخل directory ذخیره شده هست رو بهم نمایش میده (مثلاً به جای اینکه به من 2 تا فایل نمایش بده 15 فایل بهم نمایش میده ) که اشتباهه . من فقط میخوام فایلهایی انتخابی خودمو تو گرید ویو بهم نمایش بده . ممنون میشم راهنماییم کنی
ینی میخاین توی گرید ویو فایل هایی رو که برای آپلود انتخاب کردین رو نشون بده بعد که اونا رو دیدین آپلودشون کنین درسته؟
بله درسته
می تونی اون دیتا تیبلی رو ک ساختی به صورت استاتیک و عمومی تعریف کنی
بعد تویform load برای با اول ک بالا میاد ستون های دیتای تیبل رو بسازی و هر بار که از فایل آپلود فالی رو انتخاب می کنی به جای اون حلقه foreach خیلی ساده فقط اون یه فایل رو به دیتا تیبل اضافه کنی اینجوری من ده تا فایل مختلف اضافه کردم بعد برای زخیره هم می تونین مقادیر رو مثل همون دیتا تیبل توی یه فایل استاتیک نگه دارین و بعد آپلود کنین یا همون اول که انتخابش می کنین آپلودش کنین
private static DataTable dt=new DataTable(); protected void Page_Load(object sender, EventArgs e) { if (!Page.IsPostBack) { FileUpload1.Attributes["onchange"] = "UploadFile(this)"; dt.Columns.Add("Type", typeof(string)); dt.Columns.Add("Byte", typeof(string)); dt.Columns.Add("Name", typeof(string)); } }
----------------------------------------------------------------------------------
string[] s = FileUpload1.PostedFile.FileName.Split('.'); dt.Rows.Add("."+s[s.Length-1], FileUpload1.PostedFile.ContentLength, FileUpload1.PostedFile.FileName); GridView1.DataSource = dt; GridView1.DataBind();
ممنون آقای لطفی . فقط DataTable ای که بصورت استاتیک و عمومی گفتین تعریف کنم ، انجام دادم ولی یک مشکل دیگه ایجاد کرده . من برای گرید ویو امکان حذف سطر گذاشته بودم یعنی هر فایلی که انتخاب کردم و در گرید ویو بهم نمایش می داد ، اگه خواستم بتونم اون فایل رو از گرید ویو حذف کنم . ولی الان وقتی فایل رو حذف میکنم و صفحه رفرش میشه دوباره اون فایل تو گریدویو نمایش داده میشه.
توی دیتا تیبل هم او سطر رو حذف می کنین؟
من فقط تو گرید سطر حذف کردم ولی تو datatable نمیدونم چطور حذف کنم
می تونید از این تابع استفاده کنید
protected void GridView1_OnRowDeleting(object sender, GridViewDeleteEventArgs e) { deleteFromDataTable(dt, GridView1.Rows[e.RowIndex].Cells[3].Text, GridView1.Rows[e.RowIndex].Cells[1].Text); GridView1.DataSource = dt; GridView1.DataBind(); } //----------------------------------------------------------------------- private void deleteFromDataTable(DataTable dataTable,string filename,string typ) { foreach (DataRow row in dataTable.Rows) { if (row[2].ToString() == filename && row[0].ToString()==typ) { row.Delete(); break; } } }
فقط در form load این خط رو هم اضافه کنین
protected void Page_Load(object sender, EventArgs e) { if (!Page.IsPostBack) { dt.Columns.Clear(); FileUpload1.Attributes["onchange"] = "UploadFile(this)"; dt.Columns.Add("Type", typeof(string)); dt.Columns.Add("Byte", typeof(string)); dt.Columns.Add("Name", typeof(string)); } }
آقای لطفی واقعاً ازت ممنونم . دستت درد نکنه وقت گذاشتی مشکلمو حل کردی . دمت گرم
هیچ کاربری تا کنون از این پست تشکر نکرده است
با ما تماس بگیرید تا در این مسیر همراهتان باشیم :)