با سلام
قصد داریم یک فایل اکسل حجیم که دارای بیش از سی هزار سطر هست رو در دیتاگرید ویو نمایش بدم
کد مربوطه رو نوشتم و فقط مشکل اینه که تمامی سطر رو ستونها رو یکباره وارد نمیکنه و سطر به سطر و ستون به ستون بصورت خطی وارد دیتاگرید ویو میکنه که هم باعث هنگ کردن برنامه میشه و هم خیلی زمان بر هست
قصد ما برای این کار این هست که پس از نمایش اطلاعات در صورت صحیح بودن دیتا تمامی این اطلاعات رو به دیتابیس منتقل کنیم که این قسمت هم انجام شده که سرعتش هم بالاست .
حالا آیا راهی هست که بشه این اطلاعات رو بصورت یکباره در دیتا گرید ویو نمایش بدیم ؟
یا اینکه
راهی هست که پس از انتخاب فایل اکسل مستقیم و بدون نمایش اطلاعات در دیتاگرید ویو تمام اطلاعات مستقیم وارد دیتابیس بشه ؟
روش bulk copy رو تست کردم تمام دیتاها بصورت علامت سوال درون دیتابیس نمایش داده میشه .. ( تبدیلها انجام شده ولی نتیجه مثبت نبوده )
ممنون میشم کمک کنید .
یکی از قابلیت های نرم افزاری که داره نوشته میشه همین موضوعی هست که گفتم
یعنی تمام اطلاعات از قسمت های مختلف در قالب اکسل جمع آوری میشه و درون دیتابیس ذخیره خواهد شد
و قرار نیست دسترسی به دیتابیس به یک اپراتور داده بشه
و این موضوعی که شما ارسال کردید کاملا منتفی هست .
دنبال راه دیگه ای هستم
تشکر
باید از قابلیت lazy loading برای datagridview استفاده کنید.
30 هزار داده خیلی زیاده، اگه تعداد ستون ها هم بالای 10 تا باشه که قطعا هنگ میکنه و حتی توی اسکرول هم لگ داره
lazy loading + smooth scrolling رو جستجو کنید.
داده ها رو نباید یکجا بریزید توی لیست، از streaming استفاده کنید.
از data binding هم باید استفاده کنید تا مجبور نباشید datagridview رو refresh کنید.
از async programming هم استفاده کنید تا تاخیرهای چند دهم ثانیه باعث قفل شدن main thread نشه و برنامه قفل شدن های لحظه ای نداشته باشه.
کلا کلمه کلیدی هایی که نوشتم رو جستجو کنید کارتون راه میفته.
موفق باشید.
کدی که من نوشتم به این صورت هست ...
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! } }
همین کد رو میشه اصلاح کرد ؟
آره کد ایرادی نداره
این قسمت باید از کلاس 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
اینا تکنیک هایی هستش که باید استفاده کنی تا بهترین حس رو به کاربر منتقل کنی.
بسیار ممنون
کمی سرچ کنم ببینم میتونم جمع و جورش کنم
هیچ کاربری تا کنون از این پست تشکر نکرده است
با ما تماس بگیرید تا در این مسیر همراهتان باشیم :)