[英]Index was out of range after deleting multiple rows from the datagridview? C#
我使用ArrayList
進行二進制搜索。 datagridview的行將添加到ArryList。 當我從datagridview刪除一行時,它幾乎可以正常工作。 問題是,當我從頂部或底部和中間的datagridview中刪除許多行時,它給我一個錯誤。 從ArrayList
(datagridview)刪除一行后,如何刷新或更新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;
}
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刪除一行時,它幾乎可以正常工作。 問題是,當我從頂部或底部和中間的datagridview中刪除許多行時,它給我一個錯誤。 從ArrayList
(datagridview)刪除一行后,如何刷新或更新ArrayList
?
當我選擇兩次csv文件時,二進制搜索運行良好,但是第三次卻沒有,因為我必須使用ArrayList.Clear();
清除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");
}
謝謝,如果你讀它的低谷!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.