如何从delphi中的listview中删除列表框项(文本)?

时间:2016-05-08 08:58:13

标签: delphi

我有一个列表视图,显示已加载数据集中的文本。 我需要删除列表框中列出的不需要的单词。 如何在delphi中做到这一点?我试图将项目转换为listview中的文本,但代码对我不起作用.. 这是我写的:

var
counter,k : Integer; //counters

begin
  counter := 0;
  k:=0;

  while counter <= listview1.Items.Count do
    for k := 0 to Listbox1.items.Count-1 do
      if listview1.Items.item[counter].Caption=listbox1.items[k]  then
      begin
        listview1.Items.item[counter].Delete;
        inc(counter)
      end;
end;

2 个答案:

答案 0 :(得分:3)

代码有多重问题:

  • 当您找到匹配项时,您只会递增counter,因此 如果你没有,那么循环就不会终止。

  • 您在while循环的头部使用<=,这会导致 自您访问以来最后一次迭代中的访问冲突 ListView中带有n个元素的第(n + 1)个元素。

  • 如果在迭代时修改ListView,则必须这样做 从后面到前面迭代。假设您找到了匹配项 ListView的第一项,你将删除它,和 ListView1.Items[counter]将是索引为counter+1的项目 先前。您可以通过更改迭代的顺序来避免这种情况 (因为删除元素不会影响后续迭代),如果找到匹配则会中断。

此外,非关键,但编码风格的问题:

  • 您不必为for循环初始化循环变量(和 编译器应该暗示在第2行中分配给k的值是 从未使用过,你不应该忽视)

  • 如果您要执行已知的迭代次数,就像您一样 在外部循环中,通常需要使用for循环。

  • 您访问这些项目看起来有点奇怪,尽管可能 作品。

TL; DR,在这里我将如何编写代码:

procedure TForm1.Button2Click(Sender: TObject);
  var counter,k: integer;
begin
  for counter := ListView1.Items.Count-1 downto 0 do
    for k := 0 to ListBox1.items.Count-1 do
      if ListView1.Items[counter].Caption = ListBox1.Items[k] then
      begin
        ListView1.Items.Delete(counter);
        Break;
      end;
end;

答案 1 :(得分:1)

您将外部计数器// event handler for ListBox private void tables_MouseDoubleClick(object sender, MouseEventArgs e) { // tables is a ListBox populated with table names int index = this.tables.IndexFromPoint(e.Location); String table_name; if (index != System.Windows.Forms.ListBox.NoMatches) { // reusing the DataTable dt.Reset(); table_name =tables.Items[index].ToString(); OracleCommand cmd = new OracleCommand(); cmd.Connection = con; // case sensitive cmd.CommandText = String.Format(@"select * from ""{0}""",table_name); cmd.CommandType = CommandType.Text; OracleDataAdapter da = new OracleDataAdapter(cmd); da.MissingSchemaAction = MissingSchemaAction.AddWithKey; da.Fill(dt); dt.TableName = table_name; label7.Text = table_name; // these three lines don't actually accomplish anything in this case table.DataSource = null; table.Rows.Clear(); table.DataSource = dt; // uncommenting these lines produces the expected behavior //DataGridViewColumn c = table.Columns[0]; //table.Sort(c,System.ComponentModel.ListSortDirection.Descending); } } 增加到错误的位置。当您删除由计数器编制索引的项目时,更容易编码counter向后计数。试试这个:

counter