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

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

کاربر سایت

webnevesht

عضویت از 1397/05/15

نمایش اطلاعات فایل اکسل حجیم در دیتاگرید ویو با روش db first entity framework

  • دوشنبه 15 مرداد 1397
  • 19:49
تشکر میکنم

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

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

روش bulk copy رو تست کردم تمام دیتاها بصورت علامت سوال درون دیتابیس نمایش داده میشه .. ( تبدیلها انجام شده ولی نتیجه مثبت نبوده )

ممنون میشم کمک کنید .

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

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

ایمان مدائنی

عضویت از 1392/01/20

  • دوشنبه 15 مرداد 1397
  • 22:34
کاربر سایت

webnevesht

عضویت از 1397/05/15

  • سه شنبه 16 مرداد 1397
  • 07:39

یکی از قابلیت های نرم افزاری که داره نوشته میشه همین موضوعی هست که گفتم 

یعنی تمام اطلاعات از قسمت های مختلف در قالب اکسل جمع آوری میشه و درون دیتابیس ذخیره خواهد شد

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

و این موضوعی که شما ارسال کردید کاملا منتفی هست .

دنبال راه دیگه ای هستم

تشکر

کاربر سایت

salman_b

عضویت از 1396/02/18

  • سه شنبه 16 مرداد 1397
  • 08:30

باید از قابلیت lazy loading برای datagridview استفاده کنید.

30 هزار داده خیلی زیاده، اگه تعداد ستون ها هم بالای 10 تا باشه که قطعا هنگ میکنه و حتی توی اسکرول هم لگ داره

lazy loading + smooth scrolling رو جستجو کنید.

داده ها رو نباید یکجا بریزید توی لیست، از streaming استفاده کنید.

از data binding هم باید استفاده کنید تا مجبور نباشید datagridview رو refresh کنید.

از async programming هم استفاده کنید تا تاخیرهای چند دهم ثانیه باعث قفل شدن main thread نشه و برنامه قفل شدن های لحظه ای نداشته باشه.

کلا کلمه کلیدی هایی که نوشتم رو جستجو کنید کارتون راه میفته.

موفق باشید.

کاربر سایت

webnevesht

عضویت از 1397/05/15

  • سه شنبه 16 مرداد 1397
  • 08:42

کدی که من نوشتم به این صورت هست ... 

        private void btn_Select_Excel_Click(object sender, EventArgs e)
        {
            string fname = "";
            OpenFileDialog fdlg = new OpenFileDialog();
            fdlg.Title = "Excel File Dialog";
            fdlg.Filter = "Excel Files |*.xlsx";
            fdlg.RestoreDirectory = true;
            if (fdlg.ShowDialog() == DialogResult.OK)
            {
                fname = fdlg.FileName;
            }
            else
            {
                FarsiMessage.Show("no select file .");
                btn_Select_Excel.Enabled = true;
                return;
            }
            Microsoft.Office.Interop.Excel.Application xlApp = new Microsoft.Office.Interop.Excel.Application();
            Workbook xlWorkbook = xlApp.Workbooks.Open(fname);
            _Worksheet xlWorksheet = xlWorkbook.Sheets[1];
            Range xlRange = xlWorksheet.UsedRange;

            int rowCount = xlRange.Rows.Count;
            int colCount = xlRange.Columns.Count;

            dg_Import.ColumnCount = colCount;
            dg_Import.RowCount = rowCount;

            for (int i = 1; i <= rowCount; i++)
            {
                for (int j = 1; j <= colCount; j++)
                {
                    //write the value to the Grid                      
                    if (xlRange.Cells[i, j] != null && xlRange.Cells[i, j].Value2 != null)
                    {
                        dg_Import.Rows[i - 1].Cells[j - 1].Value = xlRange.Cells[i, j].Value2.ToString();
                    }
                }
                //add useful things here!     
            }
        }

همین کد رو میشه اصلاح کرد ؟

کاربر سایت

salman_b

عضویت از 1396/02/18

  • سه شنبه 16 مرداد 1397
  • 09:30

آره کد ایرادی نداره

این قسمت باید از کلاس Stream استفاده کنی و فایل رو یکجا نیاری توی رم و دیتاگرید پرد کنی.

    for (int i = 1; i <= rowCount; i++)
    {
        for (int j = 1; j <= colCount; j++)
        {
            //write the value to the Grid                      
            if (xlRange.Cells[i, j] != null && xlRange.Cells[i, j].Value2 != null)
            {
                dg_Import.Rows[i - 1].Cells[j - 1].Value = xlRange.Cells[i, j].Value2.ToString();
            }
        }
        //add useful things here!     
    }

دیتاگرید رو هم نباید مستقیم پر کنی. باید داده ها رو بریزی تو یک لیست و دیتاگرید رو به اون لیست bind کنی.

و اینکه متد Excel_Click هم باید async باشه و عملیات رو داخل Task جداگانه ای انجام بدی.

خود دیتاگرید هم قابلیت هایی داره برای lazy loading و smooth scrolling که مشکل لگ داشتن و کندی دیتاگرید رو حل میکنه.

اما باید حواست باشه که بعدا که بخوای داده ها رو بخونی نمیتونی از دیتاگرید بخونی چون اطلاعات داخلش load نمیشه تا زمانی که اسکرول نخوره. واسه همینم گفتم باید داده ها رو تو یه لیست جدا نگه داری و bind کنیش به دیتاگرید.

lazu loading + smooth scrolling in data grid

read as stream from excel

databinding in windows form

async await programming

اینا تکنیک هایی هستش که باید استفاده کنی تا بهترین حس رو به کاربر منتقل کنی.

کاربر سایت

webnevesht

عضویت از 1397/05/15

  • سه شنبه 16 مرداد 1397
  • 11:02

بسیار ممنون

کمی سرچ کنم ببینم میتونم جمع و جورش کنم

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

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

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

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