从datagridview中删除多行后,索引超出范围?C#

从datagridview中删除多行后,索引超出范围?C#,c#,winforms,arraylist,datagridview,binary-search,C#,Winforms,Arraylist,Datagridview,Binary Search,我使用ArrayList进行二进制搜索。datagridview的行将添加到ArryList中。当我从datagridview中删除一行时,它几乎可以完美地工作。问题是,当我从datagridview的顶部或底部和中间删除许多行时,它会给我一个错误。从ArrayList(datagridview)中删除一行后,如何刷新或更新ArrayList 错误: “指数超出范围。必须为非负数且小于集合的大小。 参数名称:索引' 将行复制到ArrayList的我的代码: 我将此代码放入按钮MouseEnte

我使用
ArrayList
进行二进制搜索。datagridview的行将添加到ArryList中。当我从datagridview中删除一行时,它几乎可以完美地工作。问题是,当我从datagridview的顶部或底部和中间删除许多行时,它会给我一个错误。从
ArrayList
(datagridview)中删除一行后,如何刷新或更新
ArrayList

错误: “指数超出范围。必须为非负数且小于集合的大小。 参数名称:索引'


将行复制到ArrayList的我的代码: 我将此代码放入按钮
MouseEnter
事件中,因此在单击按钮进行搜索之前,它会将所有内容复制到
ArrayList

foreach (var row in dataGridView2.Rows.Cast<DataGridViewRow>())
{
   ArrayList[row.Index] = row.Cells[0].Value.ToString().Trim();
}
dataGridView2.Rows.Clear();
ArryList.Clear();
foreach (var row in dataGridView2.Rows.Cast<DataGridViewRow>())
{
   ArrayList[row.Index] = row.Cells[0].Value.ToString().Trim();
}
winform中二进制搜索的我的代码:
错误发生在:
打开csv后,二进制搜索工作正常

测试删除功能。

从datagridview中删除了更多行。

从datagridview中删除许多行后,如果我尝试搜索名称,则会出现错误。



我希望我的描述中没有遗漏任何信息。如果你读了,谢谢

问题似乎在于,您只是从DataGridView中删除项目,而不是从ArrayList中删除项目,然后对DataGridView使用ArrayList搜索索引。因此,如果您从DataGridView中删除最后一项,它仍然存在于ArrayList中,因此如果您匹配该项并尝试在DataGridView中使用索引,您将获得索引超出范围异常

如果arraylist和datagridview中有10项,则从datagridview中删除2项,此时arraylist中有10项,datagridview中有8项。若您收到arraylist(8或9)中最后2个项目的索引,并尝试访问datagridview中这些标记中的项目,它将抛出异常

尝试使用数据绑定,然后仅对ArrayList进行操作

dataGridView2.DataSource = ArrayList;
另外,如果你在一个列表上循环删除项目,那么就要反向操作。从项目开始,使用最后一个项目,然后返回到开始:

for(int i = dataGridView2.SelectedRows.Count - 1 ; i >= 0 ; i--)
{
    dataGridView2.Rows.RemoveAt(dataGridView2.SelectedRows[i].Index);
}

执行foreach操作会导致枚举器在列表从一个过程更改到下一个过程时引发异常。

问题似乎在于,您只是从DataGridView中删除项,而不是从ArrayList中删除项,然后对DataGridView使用ArrayList搜索索引。因此,如果您从DataGridView中删除最后一项,它仍然存在于ArrayList中,因此如果您匹配该项并尝试在DataGridView中使用索引,您将获得索引超出范围异常

如果arraylist和datagridview中有10项,则从datagridview中删除2项,此时arraylist中有10项,datagridview中有8项。若您收到arraylist(8或9)中最后2个项目的索引,并尝试访问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());
        }
    }
}
公共部分类表单1:表单
{
公共表格1()
{
初始化组件();
PopulateGrid();
}
private ArrayList myList=new ArrayList();
私人名单学生=新名单();
私有void PopulateGrid()
{
学生=新名单
{
新学生{Lastname=“aa”},
新学生{Lastname=“bb”},
新学生{Lastname=“cc”},
新学生{Lastname=“cc”},
新学生{Lastname=“cc”},
新学生{Lastname=“ee”},
新学生{Lastname=“ff”},
新学生{Lastname=“ff”},
新学生{Lastname=“gg”},
新学生{Lastname=“gg”},
};
dataGridView2.DataSource=学生;
myList=newarraylist(students.Select(x=>x.Lastname.ToList());
}
公立班学生
{
公共字符串Lastname{get;set;}
}
私有无效btnSearch_单击(对象发送者,事件参数e)
{
var index=myList.BinarySearch(textBoxBinarySearch.Text);
如果(索引>-1)
{
dataGridView2.SelectionMode=DataGridViewSelectionMode.RowHeaderSelect;
dataGridView2.Rows[index]。Selected=true;
dataGridView2.CurrentCell=dataGridView2.Rows[index]。单元格[0];
Show(“索引等于:”+索引,“二进制搜索”);
}
}
私有void btnDelete\u单击(对象发送者,事件参数e)
{
如果(dataGridView2.SelectedRows.Count>0)
{
所选变量=dataGridView2.SelectedRows[0];
学生.RemoveAt(selected.Index);
dataGridView2.DataSource=null;
dataGridView2.DataSource=学生;
myList=newarraylist(students.Select(x=>x.Lastname.ToList());
}
}
}

但我建议不要使用
ArrayList
,因为它不是强类型。使用
列表
。我想使用ArrayList的原因是
BinarySearch
方法。

我提供了一种快速的方法:

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());
        }
    }
}
公共部分类表单1:表单
{
公共表格1()
{
初始化组件();
PopulateGrid();
}
private ArrayList myList=new ArrayList();
私人名单学生=新名单();
私有void PopulateGrid()
{
学生=新名单
{
新学生{Lastname=“aa”},
新学生{Lastname=“bb”},
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");
}