我使用ArrayList
进行二分查找。 datagridview的行被添加到ArryList。当我从datagridview中删除一行时,它几乎完美地工作。问题是当我从数据网格视图中从顶部或底部和中间删除许多行时,它会给我一个错误。从ArrayList
(datagridview)删除一行后,如何刷新或更新ArrayList
?
'指数超出范围。必须是非负数且小于集合的大小。参数名称:index'
我将此代码放入按钮MouseEnter
事件中,所以在我点击按钮进行搜索之前,将所有内容复制到ArrayList
。
foreach (var row in dataGridView2.Rows.Cast<DataGridViewRow>())
{
ArrayList[row.Index] = row.Cells[0].Value.ToString().Trim();
}
foreach (DataGridViewRow item in this.dataGridView2.SelectedRows)
{
dataGridView2.Rows.RemoveAt(item.Index);
return;
}
int index = this.ArrayList.BinarySearch(textBoxBinarySearch.Text);
if (index > -1)
{
dataGridView2.SelectionMode = DataGridViewSelectionMode.RowHeaderSelect;
dataGridView2.Rows[index].Selected = true;
dataGridView2.CurrentCell = dataGridView2.Rows[index].Cells[0];
MessageBox.Show("Index is equal to: " + index, "Binary Search");
}
dataGridView2.Rows[index].Selected = true;
我希望我不会错过我的描述中的任何信息。谢谢,如果你读到它!
问题似乎是您只是从DataGridView中删除项目,而不是从ArrayList中删除项目,然后使用针对DataGridView的arraylist搜索索引。因此,如果从DataGridView中删除最后一项,它仍然存在于ArrayList中,因此如果您匹配该项并尝试使用DataGridView中的索引,您将获得索引超出范围的异常。
如果你在arraylist和datagridview中有10个项目然后从datagridview中删除2,那么你现在在arraylist中有10个项目,在datagridview中有8个项目。如果您收到arraylist(8或9)中最后两个项目之一的索引并尝试访问datagridview中这些项目中的项目,则会抛出异常。
尝试使用数据绑定,然后仅在ArrayList上操作。
dataGridView2.DataSource = ArrayList;
此外,如果您循环移动列表,则删除项目会向后执行。从最后一项的项目开始,然后回到开始:
for(int i = dataGridView2.SelectedRows.Count - 1 ; i >= 0 ; i--)
{
dataGridView2.Rows.RemoveAt(dataGridView2.SelectedRows[i].Index);
}
执行foreach会导致枚举器抛出异常,因为列表已从一个传递更改为下一个传递。
我已经快速做了这个:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
PopulateGrid();
}
private ArrayList myList = new ArrayList();
private List<Student> students = new List<Student>();
private void PopulateGrid()
{
students = new List<Student>
{
new Student {Lastname = "aa"},
new Student {Lastname = "bb"},
new Student {Lastname = "cc"},
new Student {Lastname = "cc"},
new Student {Lastname = "cc"},
new Student {Lastname = "ee"},
new Student {Lastname = "ff"},
new Student {Lastname = "ff"},
new Student {Lastname = "gg"},
new Student {Lastname = "gg"},
};
dataGridView2.DataSource = students;
myList = new ArrayList(students.Select(x => x.Lastname).ToList());
}
public class Student
{
public string Lastname { get; set; }
}
private void btnSearch_Click(object sender, EventArgs e)
{
var index = myList.BinarySearch(textBoxBinarySearch.Text);
if(index > -1)
{
dataGridView2.SelectionMode = DataGridViewSelectionMode.RowHeaderSelect;
dataGridView2.Rows[index].Selected = true;
dataGridView2.CurrentCell = dataGridView2.Rows[index].Cells[0];
MessageBox.Show("Index is equal to: " + index, "Binary Search");
}
}
private void btnDelete_Click(object sender, EventArgs e)
{
if (dataGridView2.SelectedRows.Count > 0)
{
var selected = dataGridView2.SelectedRows[0];
students.RemoveAt(selected.Index);
dataGridView2.DataSource = null;
dataGridView2.DataSource = students;
myList = new ArrayList(students.Select(x => x.Lastname).ToList());
}
}
}
但我建议避免使用ArrayList
,因为它不是强类型。请改用List<T>
。我猜使用ArrayList的原因是BinarySearch
方法。
我使用
ArrayList
进行二分查找。 datagridview的行被添加到ArryList。当我从datagridview中删除一行时,它几乎完美地工作。问题是当我从数据网格视图中从顶部或底部和中间删除许多行时,它会给我一个错误。从ArrayList
(datagridview)删除一行后,如何刷新或更新ArrayList
?
当我选择两次csv文件时,二进制搜索工作得很好,但第三次没有,因为我不得不用ArrayList
清除我的ArrayList.Clear();
而不仅仅是datagridview。然后我可以将datagridview行复制到空的ArrayList
。
dataGridView2.Rows.Clear();
ArryList.Clear();
然后 - >
我将此代码放入按钮MouseEnter
事件中,所以在我点击按钮进行搜索之前,将所有内容复制到ArrayList
。
foreach (var row in dataGridView2.Rows.Cast<DataGridViewRow>())
{
ArrayList[row.Index] = row.Cells[0].Value.ToString().Trim();
}
for (int i = dataGridView2.SelectedRows.Count - 1; i >= 0; i--)
{
dataGridView2.Rows.RemoveAt(dataGridView2.SelectedRows[i].Index);
ListOfPeople.RemoveAt(i);
}
int index = this.ArrayList.BinarySearch(textBoxBinarySearch.Text);
if (index > -1)
{
dataGridView2.SelectionMode = DataGridViewSelectionMode.RowHeaderSelect;
dataGridView2.Rows[index].Selected = true;
dataGridView2.CurrentCell = dataGridView2.Rows[index].Cells[0];
MessageBox.Show("Index is equal to: " + index, "Binary Search");
}
谢谢,如果你读完了!