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

问题描述 投票:0回答:3

我使用ArrayList进行二分查找。 datagridview的行被添加到ArryList。当我从datagridview中删除一行时,它几乎完美地工作。问题是当我从数据网格视图中从顶部或底部和中间删除许多行时,它会给我一个错误。从ArrayList(datagridview)删除一行后,如何刷新或更新ArrayList

错误:

'指数超出范围。必须是非负数且小于集合的大小。参数名称:index'


我将代码复制到ArrayList的代码:

我将此代码放入按钮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;
}

我在winform中进行二进制搜索的代码:

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;

打开csv后,二进制搜索工作完美!

测试删除功能。

enter image description here

从datagridview中删除了更多行。

enter image description here

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

enter image description here


我希望我不会错过我的描述中的任何信息。谢谢,如果你读到它!

c# winforms arraylist datagridview binary-search
3个回答
1
投票

问题似乎是您只是从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会导致枚举器抛出异常,因为列表已从一个传递更改为下一个传递。


1
投票

我已经快速做了这个:

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方法。


0
投票

我使用ArrayList进行二分查找。 datagridview的行被添加到ArryList。当我从datagridview中删除一行时,它几乎完美地工作。问题是当我从数据网格视图中从顶部或底部和中间删除许多行时,它会给我一个错误。从ArrayList(datagridview)删除一行后,如何刷新或更新ArrayList

解:

当我选择两次csv文件时,二进制搜索工作得很好,但第三次没有,因为我不得不用ArrayList清除我的ArrayList.Clear();而不仅仅是datagridview。然后我可以将datagridview行复制到空的ArrayList

dataGridView2.Rows.Clear();
ArryList.Clear();

然后 - >

我将代码复制到ArrayList的代码:

我将此代码放入按钮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);
}

我在winform中进行二进制搜索的代码:

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");
}

谢谢,如果你读完了!

© www.soinside.com 2019 - 2024. All rights reserved.