كيف يمكنني الحصول على فهرس من عنصر في مربع القائمة؟

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

  •  03-07-2019
  •  | 
  •  

سؤال

وانا إضافة بنود إلى ListBox مثل ذلك:

myListBox.Items.addRange(myObjectArray);

ووأريد أيضا أن اختيار بعض البنود أود أن أضيف بما يلي:

foreach(MyObject m in otherListOfMyObjects) 
{
    int index = myListBox.Items.IndexOf(m);
    myListBox.SelectedIndices.Add(index);
}

ولكن index دائما -1.

هل هناك طريقة مختلفة للحصول على مؤشر كائن في ListBox؟

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

المحلول

ويجب عليك التأكد من أن MyObject يتجاوز Equals()، GetHashCode() وToString() بحيث طريقة IndexOf() يمكن العثور على الكائن بشكل صحيح.

ومن الناحية الفنية، لا يحتاج ToString() إلى أن يتم تجاوز للاختبار المساواة، ولكن من المفيد لتصحيح الأخطاء.

نصائح أخرى

ويمكنك استخدام نوع من مفتاح للقيم في مربع القائمة، مثل المعرفات الفريدة العمومية. ثم يمكنك بسهولة استخدام myListBox.Items.FindByValue(value) للعثور على بند حق.

وIndexOf يتحقق الإشارة، لذلك إذا كانت العناصر في otherListOfMyObjects لا تشير نفس الكائنات الدقيقة في الذاكرة كما myListBox.Items، ثم سوف IndexOf لا تعمل.

ما الذي يمكن القيام به هو استخدام LINQ. وإليك بعض التعليمات البرمجية المستعارة التي تبدو مثل C #، قد تجميع وقد تعمل في الواقع:

var items =  from x in myListBox.Items where otherListOfMyObjects.Any(y => y == x /*SEE NOTE*/) select x;
foreach(item i in items)
  myListBox.SelectedItems.Add(i);

ومن الواضح أن التي لن تعمل كما ذ == س سيعود دائما كاذبة (وهذا هو السبب في الطريقة الحالية لن تعمل). تحتاج إلى استبدال ذ == السينية لإجراء مقارنة المساواة التي ستحدد المساواة كما YOU تحديده لMyObject. يمكنك القيام بذلك عن طريق إضافة ID كما الساقطة اقترح أو تجاوز على buttload طرق كما اقترح نيل (+ الصورة لكل منهم)، أو عن طريق مجرد تحديد الخصائص التي من MyObject للتحقق من أجل التعرف عليها كما بالضبط نفس الكائن .

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