我有一个列表视图,显示已加载数据集中的文本。 我需要删除列表框中列出的不需要的单词。 如何在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;
答案 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