أنا فاهم اللي تقصده تماماً ، وفاهم الفرق بين SelectedRows و Rows لكن اللي أقصده أن الكود اللي كتبته لي :
if r.Index لا يعود لي بإنديكس أول سجل داخل المصفوفة SelectRows، وإنما يعود بقيمة الإنديكس لذلك السجل من على مستوى الـ DataGrid نفسه .
شوف ..
مش الآن SelectedRows[0] = 1001004 وهو أول سجل داخل SelectRows ؟
أريد أن أضع بيانات هذا السجل على السجل الذي يقف عليه المستخدم في الجريد الخاص بالفاتورة .
فلو قلت أنا 0 == if r.Index فلن أحصل على هذا السجل ، لأن r.index سيأتي بقيمة الانديكس الخاص بالسجل 1001004 من على مستوى الجريد ككل وليس من داخل المصفوفة SelectRows .
تخيل معي كيف يخزن الميثود SelectedRows بداخله السجلات المختارة :
أريد الحصول على الإنديكس الذي بداخل المصفوفة SelectedRows
لأنه مهما كان الـ Index الخاص بأول سجل سيختاره المستخدم من الجريد ، عندما يتم وضعه داخل SelectedRows فإنه سيأخذ الإنديكس رقم صفر ( 0 )
وبالتالي سأقرأ البيانات من هذا السجل ذو الإنديكس 0 من SelectedRows وأضعه في السجل الحالي الذي يقف عليه المستخدم في الجريد الخاص بالفاتورة ..
أما باقي السجلات فسأضعها في نهاية الجريد ..
هل فهمت قصدي ؟ أتمنى أن الصورة اتضحت لك الآن .
السلام عليكم ورحمة الله
أخي أشرف
يبدو أنني لا أجيد التعليم أو أنني لم استطع فهم المطلوب، فسأترك الموضوع لغيري من الأخوة، لعله يفيدك.
بالعكس أخي مهموم ..
أسعدتني كثيراً محاولاتك ..
وكلنا نتعلم من بعض ..
شاكر ومقدر لمجهودك القيم ..
وبانتظار بقية الإخوة الأعضاء
وعليكم السلام ورحمة الله وبركاته ..
أولاً : أعتذر على التأخير في الرد أخي الكريم مهموم لظروف انقطاع النت عندي ..
ثانياً : أنا جربت الكود اللي حضرتك قمت بتعديله في آخر رد لك ، وبالفعل أصبح الآن يقرأ الـ Index اللي داخل الميثود (المصفوفة) SelectedRows وبذلك تخطينا العقبة الكبرى ..
لكن برضه في مشكلة صغيرة معليش ، وهي :
لاحظ النتيجة بعد التعديل الأخير، لو المستخدم اختار السجلات بشكل عشوائي ، فإنه لا يقوم بترتيب السجلات وإنما يقوم بعكس الترتيب فقط :
أي أنك قمت بعمل ()Reverse للسجلات ، فقلبت الترتيب رأساً على عقب ، ولذلك لو تلاحظ أصبح ترتيب 1001009 قبل 1001006 والمطلوب عمل Sort للسجلات بدلالة الحقل Item Code ، لكني لم أتمكن من عمل ذلك .. فعلمني رجاءً ..
السلام عليكم ورحمة الله
أخي أشرف
هذا تعديل بطريقة مختلفة، لكن إن شاء الله يكون حسب ما تريد
PHP كود :
private void BtnSearch_Click(object sender, EventArgs e)
{
FrmSearch frm = new FrmSearch();
if (frm.ShowDialog() == DialogResult.OK)
{
List<DataGridViewRow> selectedRows =
frm.simpleMultiselectDataGridView1
.SelectedRows.Cast<DataGridViewRow>()
.OrderBy(row => row.Cells[0].Value)
.ToList();
DGVInvoice.Rows.Insert(DGVInvoice.CurrentRow.Index, new object[] {
selectedRows[0].Cells[0].Value,
selectedRows[0].Cells[1].Value,
selectedRows[0].Cells[2].Value,
selectedRows[0].Cells[3].Value,
selectedRows[0].Cells[4].Value
});
selectedRows.RemoveAt(0);
foreach (DataGridViewRow r in selectedRows)
{
DGVInvoice.Rows.Add(new object[] {
r.Cells[0].Value,
r.Cells[1].Value,
r.Cells[2].Value,
r.Cells[3].Value,
r.Cells[4].Value
});
}
}
frm.Dispose();
}
نعم بالفعل أصبح الكود يرتب السجلات المختارة بالشكل المطلوب ، ولكن هناك مشكلة وهي :
أن السجل المختار الأول ، لا يتم وضعه في السجل الحالي (CurrentRow) ، وإنما يتم إضافة سجل فارغ جديد ، ليتم وضع البيانات فيه ..
أعتقد أن المشكلة في هذه الأكواد :
كود :
DGVInvoice.Rows.Insert(DGVInvoice.CurrentRow.Index, new object[] {
selectedRows[0].Cells[0].Value,
selectedRows[0].Cells[1].Value,
selectedRows[0].Cells[2].Value,
selectedRows[0].Cells[3].Value,
selectedRows[0].Cells[4].Value
});
بالإضافة إلى ذلك يا ريت تتكرم علي بشرح هذا الكود الذي كتبته :
كود :
;()Cast<DataGridViewRow>().OrderBy(row => row.Cells[0].Value).ToList
السلام عليكم ورحمة الله
أخي أشرف
إذا كان هناك سطر فارغ تريده أن يكون مكان فيمكنك حذف السطر الفارغ وذلك بوضع هذا السطر قبل كود إضافة السطر الذي ذكرتوه مباشرة
PHP كود :
DGVInvoice.Rows.RemoveAt(DGVInvoice.CurrentRow.Index);
السلام عليكم ورحمة الله
أخي أشرف
السطر الذي طلبتم شرحه يوجد فيه الأمر OrderBy ومنه يتضح أنه متعلق بالترتيب أي ترتيب الأسطر وفيه تم تحديد العمود [row.Cells[0 ليتم الترتيب على أساسه
كده الكود أصبح مكتملاً ..
جزاك الله خيراً أخي مهموم ..
الله يسعدك في الدنيا والآخرة ..