Если DataSrid вашего DataGridView является BindingSource и базовый список реализует FindCore, то вы можете использовать метод BindingSource Find () следующим образом:
BindingList<YourObject> objectList = new BindingList<YourObject>();
BindingSource source = new BindingSource();
source.DataSource = objectList;
dataGridView1.DataSource = source;
private int GetIndexOfItemById(int id)
{
return source.Find("Id", id);
}
Возможно, это правильный способ сделать это и может дать вам лучшую производительность (которая вам, вероятно, не понадобится). Тем не менее, Microsoft не сделала это простым. Каркасный объект BindingList не реализует FindCore, поэтому вам нужно будет создать собственный IBindingList () (а также реализовать сортировку, поскольку вы, вероятно, тоже этого хотите).
Вот код для реализации IBindingList, которая поддерживает Find () (взято из MSDN) .
protected override bool SupportsSearchingCore
{
get
{
return true;
}
}
protected override int FindCore(PropertyDescriptor prop, object key)
{
// Get the property info for the specified property.
PropertyInfo propInfo = typeof(T).GetProperty(prop.Name);
T item;
if (key != null)
{
// Loop through the items to see if the key
// value matches the property value.
for (int i = 0; i < Count; ++i)
{
item = (T)Items[i];
if (propInfo.GetValue(item, null).Equals(key))
return i;
}
}
return -1;
}
Если вы используете DataTable в качестве источника данных, то вы получаете поведение Find () из коробки, но, поскольку вы говорите, что у вас есть список пользовательских объектов, вы, вероятно, нет.