لماذا لا يقوم Columns.Insert بتحديث DisplayIndex في DataGridView (C#)؟

StackOverflow https://stackoverflow.com/questions/227612

  •  03-07-2019
  •  | 
  •  

سؤال

أقوم بإدراج عمود في DataGridView برمجيًا (أي غير مرتبط بأي جداول بيانات/قواعد بيانات) كما يلي:

int lastIndex = m_DGV.Columns.Count - 1;  // Count = 4 in this case
DataGridViewTextBoxColumn col = (DataGridViewTextBoxColumn)m_DGV.Columns[lastIndex];
m_DGV.Columns.RemoveAt(lastIndex);
m_DGV.Columns.Insert(insertIndex, col);  // insertIndex = 2

لقد وجدت أن أعمدتي معطلة بصريًا في بعض الأحيان باستخدام هذه الطريقة.الحل البديل هو تعيين خاصية DisplayIndex للعمود يدويًا بعد ذلك.تؤدي إضافة هذا الرمز إلى "إصلاح المشكلة"، لكنني لا أفهم سبب تصرفها بهذه الطريقة.

Console.Write(m_DGV.Columns[0].DisplayIndex); // Has value of 0
Console.Write(m_DGV.Columns[1].DisplayIndex); // Has value of 1
Console.Write(m_DGV.Columns[2].DisplayIndex); // Has value of 3
Console.Write(m_DGV.Columns[3].DisplayIndex); // Has value of 2
col.DisplayIndex = insertIndex;
Console.Write(m_DGV.Columns[0].DisplayIndex); // Has value of 0
Console.Write(m_DGV.Columns[1].DisplayIndex); // Has value of 1
Console.Write(m_DGV.Columns[2].DisplayIndex); // Has value of 2
Console.Write(m_DGV.Columns[3].DisplayIndex); // Has value of 3

بالإضافة إلى ذلك، يمكن لشبكتي زيادة عدد أعمدتها ديناميكيًا.كنت أرغب في تنميته على شكل أجزاء، بحيث لا يتطلب كل إدراج تخصيص عمود (والتهيئة المرتبطة به).سيتم بعد ذلك إضافة كل عمود "جديد" عن طريق انتزاع عمود غير مستخدم من النهاية، وإدخاله في الموضع المطلوب، وجعله مرئيًا.

هل كانت مفيدة؟

المحلول

وأظن أن هذا هو لأن ترتيب الأعمدة في داتاغريدفيف لا تملي بالضرورة ترتيب العرض، على الرغم من دون صراحة يتم تعيين افتراضيا ترتيب الأعمدة تملي قيمة العقارات DisplayIndex. وهذا هو سبب وجود خاصية DisplayIndex، لذلك يمكنك إضافة أعمدة إلى جمع بدون تنفيذ إدراجات - تحتاج فقط لتحديد قيمة DisplayIndex ويحدث التحديث شلال في كل شيء مع DisplayIndex مساوية أو أكبر. ويبدو من المثال الخاص بك العمود المدرج يتلقى أيضا أول تخطي قيمة DisplayIndex.

سؤال / جواب وجدت:

<اقتباس فقرة>   

وسوف تغيير DisplayIndex تسبب   كافة الأعمدة بين القديم   DisplayIndex وDisplayIndex جديد   إلى أن تحول.

وكما هو الحال مع جميع المجموعات تقريبا (عدا LinkedLists) عن الافضل دائما إضافة إلى مجموعة <لأ href = "http://www.dotnetperls.com/Content/List-Insert.aspx" يختلط = "نوفولو noreferrer" > من إدراجها في مجموعة. السلوك الذي نشهد هو انعكاس لتلك القاعدة.

نصائح أخرى

لدي فكرتين.

  1. ماذا عن معالجة أعمدتك باسم فريد، بدلاً من الفهرس الموجود في المجموعة؟قد لا يكون لديهم اسم بالفعل، ولكن يمكنك تتبع من هو إذا أعطيتهم اسمًا يعني شيئًا ما.

  2. يمكنك استخدام ال GetFirstColumn, GetNextColumn, GetPreviousColumn, GetLastColumn أساليب DataGridViewColumnCollection class، والتي تعمل على ترتيب العرض، وليس الترتيب في المجموعة.يمكنك أيضًا التكرار خلال المجموعة باستخدام حلقة for و m_DGV.Columns[i] حتى تجد الشخص الذي تريده.

  3. إنشاء موروثة DataGridView و DataGridViewColumnCollection.ال DataGridView تم تجاوزه ببساطة لاستخدام فئة المجموعة الجديدة الخاصة بك.انت جديد DataGridViewColumnCollection سيتضمن طريقة لمعالجة المجموعة من خلال فهرس العرض، من خلال التكرار خلال المجموعة حتى تجد المجموعة التي تريدها (انظر رقم 2).أو يمكنك حفظ القاموس وإبقائه محدثًا لعدد كبير جدًا من الأعمدة.

    أشك في زيادة أداء الاحتفاظ بالقاموس، لأنه في كل مرة يتحرك فيها عمود، يتعين عليك إعادة كتابة الأمر بأكمله.التكرار هو O(n) على أي حال، وما لم تكن تتحدث عن عمليات غير متزامنة مع مئات الأعمدة، فمن المحتمل أنك بخير.

    قد تتمكن من تجاوز this[] المشغل أيضًا، على افتراض أنه لا يفسد DataGridView.

قد تكون الفكرة رقم 1 هي الأسهل في التنفيذ، ولكنها ليست بالضرورة الأجمل.الفكرة رقم 2 تعمل، ويمكنك وضعها في وظيفة DataGridViewColumn GetColumnByDisplayIndex(int Index).الفكرة رقم 3 لطيفة، وهي بالتأكيد الطريقة الأكثر تغليفًا، ولكنها ليست تافهة تمامًا.

وبفضل cfeduke للمشورة الممتازة. كنت أظن أن Insert يكون أبطأ، ولكن الرابط المقدم المستنير لي على مدى أبطأ بكثير.

وهذا إحضار مسألة كيفية إدراج بكفاءة وإزالة الأعمدة بشكل حيوي على داتاغريدفيف. يبدو أن التصميم المثالي سيكون لإضافة الكثير من الأعمدة باستخدام Add أو AddRange، وبعد ذلك أبدا إزالة حقا لهم. هل يمكن بعد ذلك محاكاة إزالة عن طريق تعيين الخاصية Visible إلى false. وكنت قد إدراج عمود عن طريق الاستيلاء على عمود غير مرئي، ووضع DisplayIndex وجعله مرئيا.

ولكن، وأظن أنه سيكون هناك الألغام الأرضية لتجنب مع هذا النهج. يجري قبل كل شيء أن مؤشر يمكنك لم تعد البيانات الخاصة بك بطريقة مباشرة. وهذا هو، لن يتم تعيينها m_DGV.Columns[i] وm_DGV.Rows[n].Cells[i] بشكل صحيح. أفترض أنك يمكن إنشاء خريطة / قاموس للحفاظ على مخطط بديهية الخارجي.

ومنذ طلبي (صممت لتكون حاليا) يتطلب كثرة الإدراج العمود وإزالة أنه قد يكون يستحق ذلك. أي شخص لديه أي اقتراحات؟

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top