مرجع تخصصی برنامه نویسان

انجمن تخصصی برنامه نویسان فارسی زبان

کاربر سایت

mohmmad sadat

عضویت از 1392/02/16

ذخیره داده های موجود در گرید ویو در دیتابیس (ٌWeb Forms)

  • دوشنبه 23 اسفند 1395
  • 13:29
تشکر میکنم

سلام . من از طریق 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>

پاسخ های این پرسش

تعداد پاسخ ها : 16 پاسخ
کاربر سایت

lotfi1008

عضویت از 1394/07/06

  • دوشنبه 23 اسفند 1395
  • 17:05

می تونی همون جا که داری دیتا رو وارد دیتا تیبل می کنی دستور ورود اطلاعات به دیتا بیس رو هم  به صورت سطر  سطر بنویسی(بسته به نوع ارتباط برقرار کردن با دیتا بیس متفاوته)

یا اینکه یه 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;
                .
                .
                .
            }

کاربر سایت

mohmmad sadat

عضویت از 1392/02/16

  • دوشنبه 23 اسفند 1395
  • 17:51

ممنون بابت راهنماییت

کاربر سایت

mohmmad sadat

عضویت از 1392/02/16

  • دوشنبه 23 اسفند 1395
  • 19:33

اگه بخوام دستوری که در Buttom_Click نوشتم در fileupload بنویسم باید  چیکار کنم ؟ برای مثال من اینچا از fileupload عکس یا فایل را انتخاب میکردم و توسط کدی که در Buttom_Click نوشتم اطلاعات رو در گرید ویو بهم نمایش میداد اگه بخوام مستقیم اطلاعات رو از fileupload بخونم و بعد اطلاعات مستقیم در داخل گرید نمایش داده بشه و دیگه نیازی به Buttom_Click  نباشه باید چیکار کنم ؟ 

کاربر سایت

lotfi1008

عضویت از 1394/07/06

  • سه شنبه 24 اسفند 1395
  • 09:07

به طور پیش فرض کنترل 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;
}

کاربر سایت

mohmmad sadat

عضویت از 1392/02/16

  • سه شنبه 24 اسفند 1395
  • 11:18

ممنون آقای لطفی جواب گرفتم .

کاربر سایت

mohmmad sadat

عضویت از 1392/02/16

  • سه شنبه 24 اسفند 1395
  • 19:00

یک مشکل دیگه هم داشتم . وقتی من از 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")))
               {

کاربر سایت

lotfi1008

عضویت از 1394/07/06

  • چهارشنبه 25 اسفند 1395
  • 08:46

خب شما خودتون توی کد نوشتین که فایل هایی رو که آپلود کردین به عنوان رکورد در گرید ویوی اضافه کنه

نفهمیدم چیه مشکلتون دقیقا ؟

میخاین توی گرید فایلی که برای آپلود انتخاب کردین بیاد؟

کاربر سایت

mohmmad sadat

عضویت از 1392/02/16

  • چهارشنبه 25 اسفند 1395
  • 09:39

مشکل اصلی من اینکه : مثلاً من از fileupload دو تا فایل انتخاب میکنم و باید در گرید ویو اون دو تا فایل رو بهم نمایش بده ولی چون از directory استفاده میکنم اون دوتا فایل و تمام فایلهایی که از قبل داخل directory ذخیره شده هست رو بهم نمایش میده (مثلاً به جای اینکه به من 2 تا فایل نمایش بده 15 فایل بهم نمایش میده ) که اشتباهه . من فقط میخوام فایلهایی انتخابی خودمو تو گرید ویو بهم نمایش بده . ممنون میشم راهنماییم کنی

کاربر سایت

lotfi1008

عضویت از 1394/07/06

  • چهارشنبه 25 اسفند 1395
  • 09:46

ینی میخاین توی گرید ویو فایل هایی رو که برای آپلود انتخاب کردین رو نشون بده بعد که اونا رو دیدین آپلودشون کنین درسته؟

کاربر سایت

mohmmad sadat

عضویت از 1392/02/16

  • چهارشنبه 25 اسفند 1395
  • 09:49

بله درسته 

کاربر سایت

lotfi1008

عضویت از 1394/07/06

  • چهارشنبه 25 اسفند 1395
  • 10:04

می تونی اون دیتا تیبلی رو ک ساختی به صورت استاتیک و عمومی تعریف کنی

بعد توی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();

کاربر سایت

mohmmad sadat

عضویت از 1392/02/16

  • چهارشنبه 25 اسفند 1395
  • 10:39

ممنون آقای لطفی . فقط DataTable ای که بصورت استاتیک و عمومی گفتین تعریف کنم ، انجام دادم ولی یک مشکل دیگه ایجاد کرده . من برای گرید ویو امکان حذف سطر گذاشته بودم یعنی هر فایلی که انتخاب کردم و در گرید ویو بهم نمایش می داد ، اگه خواستم بتونم اون فایل رو از گرید ویو حذف کنم . ولی الان وقتی فایل رو حذف میکنم و صفحه رفرش میشه دوباره اون فایل تو گریدویو نمایش داده میشه.

کاربر سایت

lotfi1008

عضویت از 1394/07/06

  • چهارشنبه 25 اسفند 1395
  • 10:41

توی دیتا تیبل هم او سطر رو حذف می کنین؟

کاربر سایت

mohmmad sadat

عضویت از 1392/02/16

  • چهارشنبه 25 اسفند 1395
  • 10:45

من فقط تو گرید سطر حذف کردم ولی تو datatable نمیدونم چطور حذف کنم

کاربر سایت

lotfi1008

عضویت از 1394/07/06

  • چهارشنبه 25 اسفند 1395
  • 11:12

می تونید از این تابع استفاده کنید

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));
            }
        }

کاربر سایت

mohmmad sadat

عضویت از 1392/02/16

  • چهارشنبه 25 اسفند 1395
  • 14:34

آقای لطفی واقعاً ازت ممنونم . دستت درد نکنه وقت گذاشتی مشکلمو حل کردی . دمت گرم

کاربرانی که از این پست تشکر کرده اند

هیچ کاربری تا کنون از این پست تشکر نکرده است

اگر نیاز به یک مشاور در زمینه طراحی سایت ، برنامه نویسی و بازاریابی الکترونیکی دارید

با ما تماس بگیرید تا در این مسیر همراهتان باشیم :)