我有一个datagridview,我想从中删除一个特定的行(datagridview不是数据绑定)。要删除,我需要行的索引。 Datagridview项目都是对象。此时,我拥有的只是对象的id(属性)。我想知道datagridview中包含id对象的行的索引,比如2。
我如何做到这一点?或者是否有另一种基于对象值删除行的方法?
答案 0 :(得分:3)
这可能是一种更清洁的方式,但使用LINQ:
private int GetIndexOfRowWithId(DataGridView dataGrid, int id) {
return dataGrid.Rows.Cast<MyRowObj>().Select((row, index) => new {
index,
row
}).Where(x => x.row.id == id).Select(x => x.index).First();
}
没有LINQ:
private int GetIndexOfRowWithId(DataGridView dataGrid, int id) {
for (int i = 0; i < dataGrid.Rows.Count; i += 1) {
MyRowObj row = (MyRowObj)dataGrid.Rows[i].Tag; // or.DataBoundItem;
if (row.id == id) {
return i;
}
}
throw new ArgumentException("No item with specified id exists in the dataGrid.", "id");
}
答案 1 :(得分:2)
如果您的DataGridView的DataSource是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);
}
这可以说是正确这样做的方式,可能会给你更好的性能(你可能不需要)。但是,微软还没有使用这个简单的方法。框架BindingList对象没有实现FindCore,因此您需要创建自己的IBindingList()(以及实现排序,因为您可能也需要它)。
以下是支持Find()(taken from MSDN)。
的IBindingList实现的代码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作为您的DataSource,那么您可以获得开箱即用的Find()行为,但由于您说您有自定义对象列表,您可能不是。
答案 2 :(得分:1)
LINQ'ish方法。
var row = dataGrid.Rows.OfType<MyRowObj>().FirstOrDefault(r => r.id == id);
if (row != null) {
var rowIndex = dataGrid.Rows.IndexOf(row);
// ... if you need the row index
} else {
// cry :(
}
这里我使用Rows.IndexOf
- 否则索引可以用于LINQ查询。 SO上有很多这样的例子。 (就像ICR在他的回答中添加的那样:)
快乐的编码。
答案 3 :(得分:0)
var query = from DataGridViewRow row in _dataGrid.Rows
where ((DataRowView)row.DataBoundItem).Row == boundedRow
select row;
if (query.Count() > 0)
{
// actions
}