می خواهیم برخی از سطرها را از DataTable حذف کنیم برای اینکار روش های متعددی وجود دارد که بسته به پروژه خود می توانید یکی از آنها را انتخاب کنید .
روش اول
در این روش یک مشکلی وجود دارد و آن اینست که اگر آیتمی را حذف کنید ، عبارت dgw.Rows.Count بهم میریزد . فرقی نمی کند کدام سطر باشید . هر کدام که باشد این اتفاق می افتد .
اگر موردی را از مجموعه حذف کنید ، آن مجموعه تغییر کرده و نمی توانید از طریق آن شماره گیری را ادامه دهید .
در عوض ، از حلقه For استفاده کنید ، مانند قطعه کد زیر :
قطعه کدی که در زیر مشاهده می کنید توسط برنامه کامپایلر به جهت تست آزمایش شده و خروجی صحیح مدنظر را بدست آورد.
for(int i = dt.Rows.Count-1; i >= 0; i--) { DataRow dr = dt.Rows[i]; if (dr["name"] == "Joe") dr.Delete(); } dt.AcceptChanges();
توجه داشته باشید که شما حلقه را به صورت معکوس شمارش می کنید و تا پس از حذف آیتم فعلی ، از ردیف فعلی رد شوید.
نکته مهم :
اگر از DataTable برای به روزرسانی جدولی در یک سرور پایگاه داده استفاده می کنید می توانید ردیف ها را به عنوان حذف شده علامت گذاری کنید ، سپس ردیف ها را به روز رسانی کنید و ردیف های جدید را همه در یک حلقه اضافه کنید. برای انجام تغییرات در جدول Db می توانید از SqlAdapter استفاده کنید. با توجه به اینکه هر چند بار ممکن است یک مشکل ایجاد شود یا کل روند بسیار پیچیده باشه، اما جواب می دهد.
روش دوم
var table = $('#example1').DataTable(); table.row($(`#yesmediasec-${id}`).closest('tr')).remove( ).draw();
روش سوم
همانطور که ذکر شد روش های متعددی برای کار با دیتاتیبل وجود دارد اما بگذارید همه روش ها را جمع کنیم و چند مورد را توضیح دهیم.
اول از همه ، AcceptChanges فقط تمام موارد و تغییرات اعمال شده را ثبت می کند . این ثبت نهایی نیست و باز هم می شود دیتا را تغییر داد . این بدان معناست که اگر از DataTable به عنوان DataSource برای اتصال به عنوان مثال یک سرور SQL استفاده می کنید ، پس با AcceptChanges می توانید اطمینان حاصل کنید که تغییرات هرگز در سرور SQL ذخیره نمی شوند و باز دیتا قابل تغییر است .
آنچه باعث سردرگمی بیشتر این موضوع می شود این است که در واقع دو مورد وجود دارد که استثنا است و ما باید جلوی هر دو را بگیریم.
1. اصلاح مجموعه IEnumerable
ما نمی توانیم آرایه ای را به مجموعه ای که در حال شمارش است اضافه یا حذف کنیم زیرا انجام این کار ممکن است شمارش داخلی را به مشکل بیاندازد . برای دور زدن این مسئله دو راه وجود دارد: یا شمارش خود را در حلقه for انجام دهید ، یا از یک مجموعه جداگانه (که اصلاح نشده است) برای شمارش استفاده کنید.
2. تلاش برای خواندن ورودی حذف شده
از آنجا که DataTables مجموعه های تودرتو است ، ورودی ها می توانند برای حذف علامت گذاری شوند اما هنوز در شمارش وجود دارد. این بدان معناست که اگر برای ستون “نام” بخواهید یک مقدار ورودی اش را حذف کنید ابتدا باید آن را علامت گذاری کنید .این یک استثنا را ایجاد می کند. این بدان معناست که باید بررسی کنیم dr.RowState! = DataRowState. قبل از پرس و جو در یک ستون حذف شده است یا خیر ؟
string name = "Joe"; foreach(DataRow dr in dtPerson.Select($"name='{name}'")) dr.Delete();
روش چهارم
if (dt1.Columns.Contains("ID")) { for (int i = dt1.Rows.Count - 1; i >= 0; i--) { DataRow dr = dt1.Rows[i]; if (dr["ID"].ToString() != "" && dr["ID"].ToString() != null) { dr.Delete(); } } dt1.Columns.Remove("ID"); }
کدهای بیشتر - سی شارپ
جستجو یک متن در یک آرایه سی شارپ #C
1 Comments
خیلی سورس خوب و جامع ای بود
سپاس فراوان