2010-01-19 44 views
11

Tôi có một hộp danh sách được điền từ một kéo SQLDATA và nó kéo xuống một số cột mà tôi không muốn như OBJECT_dfj, OBJECT_daskd. Chìa khóa là tất cả những điều này với OBJECT_, có cách nào để loại bỏ chúng khỏi hộp danh sách không? Tôi không thể thay đổi câu lệnh SQL của mình.C# xóa các mục khỏi danh sách

tôi đã cố gắng này:

foreach (string item in listBox1.Items) 
{ 
    string removelistitem = "OBJECT"; 
    if(item.Contains(removelistitem)) 
    { 
     listBox1.Items.Remove(item); 
    } 
} 

nhưng nó đã cho tôi những lỗi:

List that this enumerator is bound to has been modified. An enumerator can only be used if the list does not change.

+0

Làm thế nào là nó đang được dân cư, thông qua mã hoặc liên kết dữ liệu? Đây có phải là WPF không? WinForms? ASP.NET? – keithwarren7

+0

Winform, và nó được phổ biến từ một SQLCOMMAND –

+0

Điều này không có ý nghĩa gì cả. Hộp danh sách WinForms chỉ có thể chứa một cột văn bản trừ khi bạn đang vẽ bản vẽ tùy chỉnh. Bạn có ghép các nội dung của tất cả các lĩnh vực, hoặc những gì? –

Trả lời

0

kẻ Xin lỗi tôi đã phải điều chỉnh chuỗi

sqldatapull = dr[0].ToString(); 
       if (sqldatapull.StartsWith("OBJECT")) 
       { 
        sqldatapull = ""; 
       } 
       listBox1.Items.Add(sqldatapull); 
       for (int i = listBox1.Items.Count - 1; i >= 0; i--) 
       { 
        if (String.IsNullOrEmpty(listBox1.Items[i] as String)) 
         listBox1.Items.RemoveAt(i); 
       } 
      } 
5

Bạn không thể sửa đổi các tài liệu tham khảo trong một Enumerator trong khi bạn liệt kê trên nó; bạn phải theo dõi những cái cần xóa rồi xóa chúng đi.

Đây là một ví dụ về các công trình xung quanh:

List<string> listbox = new List<string>(); 
     List<object> toRemove = new List<object>(); 

     foreach (string item in listbox) 
     { 
      string removelistitem = "OBJECT"; 
      if (item.Contains(removelistitem)) 
      { 
       toRemove.Add(item); 
      } 
     } 

     foreach (string item in toRemove) 
     { 
      listbox.Remove(item); 
     } 

Nhưng nếu bạn đang sử dụng C# 3.5, bạn có thể nói một cái gì đó như thế này.

listbox.Items = listbox.Items.Select(n => !n.Contains("OBJECT")); 
+0

đã thử nó, dường như không xóa bất cứ điều gì –

+1

nó đã thắng 't làm việc như một công việc cắt và dán, đó là một đầu mối nhiều hơn một câu trả lời vì tôi không có một IDE để tay. – gingerbreadboy

+0

liều phương pháp này không có hiệu suất tốt, nó liệt kê các mục danh sách hai lần ... –

0

Các lỗi mà bạn đang nhận được phương tiện mà

foreach (string item in listBox1.Items) 

nên được thay thế bằng

for(int i = 0; i < listBox1.Items.Count; i++) { 
    string item = (string)listBox1.Items[i]; 

Nói cách khác, không sử dụng một foreach.

Chỉnh sửa: thêm cast vào chuỗi trong mã trên

EDIT2: Vì bạn đang sử dụng RemoveAt(), hãy nhớ rằng chỉ số của bạn cho phiên bản kế tiếp (biến i trong ví dụ trên) không nên tăng (kể từ khi bạn chỉ xoá nó).

+0

cho tôi: Lỗi Không thể chuyển đổi rõ ràng loại 'đối tượng' sang 'chuỗi'. Một chuyển đổi rõ ràng tồn tại (bạn đang thiếu một diễn viên?) –

+0

thử chuỗi item = (string) listBox1.Items [i]; –

+0

Thao tác này sẽ không hoạt động - anh ấy đang xóa mục, vì vậy sau khi các mục [5] bị xóa, các mục [6] sẽ không trỏ đến mục tiếp theo trong danh sách gốc. Thay vào đó, bạn phải lặp lại từ đầu đến cuối. – egrunin

0

Bạn không thể sửa đổi bộ sưu tập trong khi đang lặp lại bộ sưu tập đó với foreach. Bạn có thể thử sử dụng câu lệnh for() thông thường.

Bạn có thể cần phải lặp lại từ cuối bộ sưu tập để đảm bảo bạn bao gồm mọi mục trong bộ sưu tập và không vô tình vượt quá cuối bộ sưu tập sau khi xóa một mục (vì độ dài thay đổi). Tôi không thể nhớ nếu NET tài khoản cho khả năng đó hay không.

19

Bạn không thể sử dụng một Enumerator, bạn phải vòng lặp sử dụng một chỉ số, bắt đầu từ mục cuối cùng:

for (int n = listBox1.Items.Count - 1; n >= 0; --n) 
{ 
    string removelistitem = "OBJECT"; 
    if (listBox1.Items[n].ToString().Contains(removelistitem)) 
    { 
     listBox1.Items.RemoveAt(n); 
    } 
} 
0

Vấn đề ở đây là bạn đang thay đổi điều tra viên của bạn khi bạn loại bỏ các mục từ danh sách. Điều này không hợp lệ với vòng lặp 'foreach'. Nhưng chỉ là về bất kỳ loại vòng lặp nào khác sẽ là OK.

Vì vậy, bạn có thể thử một cái gì đó như thế này:

for(int i=0; i < listBox1.Items.Count;) 
{ 
    string removelistitem = "OBJECT"; 
    if(listBox1.Items[i].Contains(removelistitem)) 
     listBox1.Items.Remove(item); 
    else 
     ++i; 
} 
+0

Lỗi 1 'đối tượng' không chứa định nghĩa cho 'Chứa' và không có phương pháp mở rộng 'Chứa' chấp nhận đối số đầu tiên của loại 'đối tượng' có thể được tìm thấy (bạn đang thiếu một chỉ thị sử dụng hoặc tham chiếu assembly?) –

2

Bạn muốn lặp ngược thông qua sử dụng một bộ đếm thay vì foreach. Nếu bạn lặp lại, bạn phải điều chỉnh bộ đếm khi bạn xóa các mục.

for(int i=listBox1.Items.Count - 1; i > -1; i--) { 
{ 
    if(listBox1.Items[i].Contains("OBJECT")) 
    { 
     listBox1.Items.RemoveAt(i); 
    } 
} 
+0

Lỗi 'đối tượng' không chứa định nghĩa cho 'Chứa' và không có phương pháp mở rộng 'Chứa' chấp nhận đối số đầu tiên của loại 'đối tượng' có thể được tìm thấy (bạn thiếu một chỉ thị sử dụng hoặc tham chiếu assembly?) –

+0

Tôi tin ' if (listBox1.Items [i] .Contains (removelistitem)) 'nên đọc' if (((string) listBox1.Items [i]). chứa (removelistitem)) '. –

+0

InvalidArgument = Giá trị '117' không hợp lệ cho 'chỉ mục'. Tên thông số: chỉ số –

0

Bạn có thể thử phương pháp này:

List<string> temp = new List<string>(); 

    foreach (string item in listBox1.Items) 
    { 
     string removelistitem = "OBJECT"; 
     if(item.Contains(removelistitem)) 
     { 
      temp.Items.Add(item); 
     } 
    } 

    foreach(string item in temp) 
    { 
     listBox1.Items.Remove(item); 
    } 

này cần được chính xác vì nó chỉ đơn giản là sao chép nội dung vào một danh sách tạm thời mà sau đó được sử dụng để xóa nó khỏi ListBox.

Mọi người khác vui lòng đề cập đến các chỉnh sửa vì tôi không chắc chắn 100% nó hoàn toàn chính xác, tôi đã sử dụng nó từ lâu rồi.

0

Câu hỏi của bạn có nghĩa là bạn sẵn sàng để thay đổi các bộ phận khác của mã này, ngay cả khi bạn không thể sửa đổi Tuyên bố SQL riêng của mình. Thay vì xóa chúng khỏi Bộ sưu tập ListBox, có thể dễ dàng loại trừ chúng ngay từ đầu. Mã này giả sử bạn đang kết nối đến SQL Server:

void PopulateListBox(ListBox listToPopulate) 
{ 
    SqlConnection conn = new SqlConnection("myConnectionString"); 
    SqlCommand cmd = new SqlCommand("spMyStoredProc", conn); 
    cmd.CommandType = CommandType.StoredProcedure; 
    SqlDataReader reader = cmd.ExecuteReader(); 
    while (reader.Read()) 
    { 
     string item = reader.GetString(0); //or whatever column is displayed in the list 
     if (!item.Contains("OBJECT_")) 
      listToPopulate.Items.Add(item); 
    } 
} 

Nhưng nếu bạn hoàn toàn quyết tâm làm điều đó theo cách này bạn nên kiểm tra câu hỏi này trên modifying an enumerable collection while iterating through it.

0

Bạn có thể thử này cũng vậy, nếu bạn không muốn để đối phó với các điều tra viên:

object ItemToDelete = null; 
foreach (object lsbItem in listbox1.Items) 
{ 
    if (lsbItem.ToString() == "-ITEM-") 
    { 
     ItemToDelete = lsbItem;         
    } 
} 

if (ItemToDelete != null) 
    listbox1.Items.Remove(ItemToDelete); 
0

Với mã này, bạn có thể loại bỏ tất cả các mục từ hộp danh sách của bạn ... Chú ý rằng bạn nên viết này mã trong sự kiện click của nút bấm của bạn:

 if (listBox1.SelectedIndex != -1) 
     { 
      listBox1.Items.RemoveAt(listBox1.SelectedIndex); 
     } 
0

bạn có thể làm điều đó trong 1 dòng, bằng cách sử dụng LINQ

listBox1.Cast<ListItem>().Where(p=>p.Text.Contains("OBJECT")).ToList().ForEach(listBox1.Items.Remove); 
0

tôi phát hiện ra cách cứng mà nếu mục listbox của bạn được giao nhiệm vụ thông qua một nguồn dữ liệu

List<String> workTables = hhsdbutils.GetWorkTableNames(); 
listBoxWork.DataSource = workTables; 

... bạn phải unbind rằng trước khi thực hiện việc loại bỏ:

listBoxWork.DataSource = null; 
for (int i = listBoxWork.Items.Count - 1; i >= 0; --i) 
{ 
    if (listBoxWork.Items[i].ToString().Contains(listboxVal)) 
    { 
     listBoxWork.Items.RemoveAt(i); 
    } 
} 

Nếu không có sự "listBoxWork.DataSource = null; "dòng, tôi đã nhận được," Giá trị không nằm trong phạm vi được mong đợi "

0
protected void lbAddtoDestination_Click(object sender, EventArgs e) 
     { 
      AddRemoveItemsListBox(lstSourceSkills, lstDestinationSkills); 
     } 
     protected void lbRemovefromDestination_Click(object sender, EventArgs e) 
     { 
      AddRemoveItemsListBox(lstDestinationSkills, lstSourceSkills); 
     } 
     private void AddRemoveItemsListBox(ListBox source, ListBox destination) 
     { 
      List<ListItem> toBeRemoved = new List<ListItem>(); 
      foreach (ListItem item in source.Items) 
      { 
       if (item.Selected) 
       { 
        toBeRemoved.Add(item); 
        destination.Items.Add(item); 
       } 
      } 
      foreach (ListItem item in toBeRemoved) source.Items.Remove(item); 
     } 
0

Yo u có thể sử dụng đoạn mã sau quá:

foreach (var item in listBox1.Items.Cast<string>().ToList()) 
{ 
    string removelistitem = "OBJECT"; 
    if (item.Contains(removelistitem)) 
    { 
     listBox1.Items.Remove(item); 
    } 
} 
0
for (int i = 0; i < listBox1.Items.Count; i++) 
    { 
     if (textBox1.Text == listBox1.Items[i].ToString()) 
     { 
      jeElement = true; 
      break; 
     } 
    } 
    if (jeElement) 
    { 
     label1.Text = "je element"; 
    } 
    else 
    { 
     label1.Text = "ni element"; 
    } 
    textBox1.ResetText(); 
    textBox1.Focus(); 

} 

private void Form1_KeyDown(object sender, KeyEventArgs e) 
{ 
    if (e.Alt == true && e.KeyCode == Keys.A) 
    { 
     buttonCheck.PerformClick(); 
    } 
} 

}

Các vấn đề liên quan