簡體   English   中英

從datagridview刪除多行后索引超出范圍? C#

[英]Index was out of range after deleting multiple rows from the datagridview? C#

我使用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();
}

我對所選行的刪除代碼:

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后,二進制搜索運行正常!

測試刪除功能。

在此處輸入圖片說明

從datagridview中刪除了更多行。

在此處輸入圖片說明

從datagridview中刪除許多行后,如果我嘗試搜索名稱,則會出現錯誤。

在此處輸入圖片說明


希望我不要錯過任何描述信息。 謝謝,如果你讀它的低谷!

問題似乎是您只從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刪除一行時,它幾乎可以正常工作。 問題是,當我從頂部或底部和中間的datagridview中刪除許多行時,它給我一個錯誤。 ArrayList (datagridview)刪除一行后,如何刷新或更新ArrayList

解:

當我選擇兩次csv文件時,二進制搜索運行良好,但是第三次​​卻沒有,因為我必須使用ArrayList.Clear();清除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");
}

謝謝,如果你讀它的低谷!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM