2011-08-18 96 views
0

我目前正在尝试查看用户在列表框中选择的所有文件和文件夹。在这一刻,我能够列出用户使用openfiledialogue选择了什么,但是当我尝试从列表框中删除它时,我现在正面临着问题。我试图让用户点击该文件旁边的复选框,然后按下删除键将其删除如何从列表框中删除选定的项目C#

这是我删除按钮

 private void button2_Click(object sender, EventArgs e) 
    { 
     for (int i = listView1.SelectedItems.Count - 1; i >= 0; i--) 
     { 
      listView1.Items.Remove(listView1.SelectedItems[i]); 
     } 

    } 

代码,这是将文件添加到列表框中以供参考仅仅指刚万一

private void button1_Click(object sender, EventArgs e) 
    { 

     OpenFileDialog openfiledialog = new OpenFileDialog(); 
     // Display open file dialog 
     openfiledialog.InitialDirectory = "C:\\"; 
     //openfiledialog.Multiselect = true; 
     openfiledialog.Title = "Lock File"; 
     openfiledialog.Filter = "All Files | *.*"; 
     openfiledialog.ShowDialog(); 


     if (openfiledialog.FileName != "") 
     { 

     //move through FileInfo array and store in new array of fi 
      listView1.Items.Clear(); 
      foreach (string file in openfiledialog.FileNames) 
      { 
       listView1.Items.Add(file); 
      }   
     } 

    } 

,我按下了删除按钮没有发生,我看到一些答案对谷歌使用的SelectionMode的,但是当我用,我的列表框不具备的SelectionMode的财产,并有红色的线条强调

回答

5

而不是使用listView1.SelectedItems使用listView1.CheckedItems的,改变你的button2_click到:

private void button2_Click(object sender, EventArgs e) 
     { 
      foreach (ListViewItem i in listView1.CheckedItems) 
       listView1.Items.Remove(i); 

     } 
+1

不起作用。 CheckedItems不是关于Listbox的。 –

9

您的问题是因为SelectedItems属性实际上是对Items集合的引用,您在迭代时更改集合。 试试下面的代码

listView1.BeginUpdate(); 
ArrayList vSelectedItems = new ArrayList(listView1.SelectedItems); 
foreach (string item in vSelectedItems) 
{ 
    listView1.Items.Remove(item); 
} 
listView1.EndUpdate(); 

BeginUpdate()EndUpdate()方法将优化这个动作的表现 - 在活动列表视图不会刷新本身之间的这些方法调用。

+0

仅供参考,使用'ArrayList'气馁;通用'List '类型是首选。 –

+0

@AdamRobinson如何将'listView1.SelectedItems'变成'List '? – Trev

0

试试这个

private void button2_Click(object sender, EventArgs e) 
     { 
      for(int i = 0 ; i < listView1.SelectedItems.Count; i ++) 
       listView1.Items.Remove(listView1.SelectedItems[i]); 

     } 
+1

我认为这是完全错误的。 OP的删除代码很好 - 它正确删除了*所有项目*,只是错误的 - 选中,而不是选中的项目。然而你的代码更糟糕 - 它只会删除所有选定项目的一部分(我猜想一半 - 假设'Remove()'是稳定的/确定性的),因为在每次Remove()调用之后'SelectedItems'会发生变化 - 它的Count '会有所不同,项目索引会减少'1'。 – andr

0
while (listView1.SelectedItems.Count > 0) 
{ 
    listView1.Items.Remove(listView1.SelectedItems[0]); 
} 
+0

请参阅接受的答案。你们不会在这里解决这个问题。除了OP的问题代码与您的代码完全相同 - 只能以相反的顺序进行。 – andr

-2
$x = @() 

[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") 
[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing") 

$objForm = New-Object System.Windows.Forms.Form 
$objForm.Text = "hello first" 
$objForm.Size = New-Object System.Drawing.Size(600,600) 
$objForm.StartPosition = "CenterScreen" 

$objForm.KeyPreview = $True 

$objForm.Add_KeyDown({if ($_.KeyCode -eq "Enter") 
    { 
     foreach ($objItem in $objListbox.SelectedItems) 
      {$x += $objItem} 
     $objForm.Close() 
    } 
    }) 

$objForm.Add_KeyDown({if ($_.KeyCode -eq "Escape") 
    {$objForm.Close()}}) 

$OKButton = New-Object System.Windows.Forms.Button 
$OKButton.Location = New-Object System.Drawing.Size(10,250) 
$OKButton.Size = New-Object System.Drawing.Size(85,30) 
$OKButton.Text = "Start Check" 

$MoveRight = New-Object System.Windows.Forms.Button 
$MoveRight.Location = New-Object System.Drawing.Size(200,80) 
$MoveRight.Size = New-Object System.Drawing.Size(70,20) 
$MoveRight.Text = ">>" 

$objForm.Controls.Add($MoveRight) 


$MoveRight.Add_Click(
    { 
     foreach ($objItem in $objListbox.SelectedItems) 
      {[void] $objListbox2.Items.Add($objItem)} 


      $selectedItems = $objListbox.SelectedItems; 

if ($objListbox.SelectedIndex -ne -1) 
{ 
    for ($i = $selectedItems.Count - 1; $i -ge 0; $i--){$objListbox.Items.Remove($SelectedItems[$i])} 
} 
}) 

$MoveLeft = New-Object System.Windows.Forms.Button 
$MoveLeft.Location = New-Object System.Drawing.Size(200,120) 
$MoveLeft.Size = New-Object System.Drawing.Size(70,20) 
$MoveLeft.Text = "<<" 

$objForm.Controls.Add($MoveLeft) 

$MoveLeft.Add_Click(
    { 

     foreach ($objItem in $objListbox2.SelectedItems) 
      {[void] $objListbox.Items.Add($objItem) 
     } 


      $selectedItems = $objListbox2.SelectedItems; 

if ($objListbox2.SelectedIndex -ne -1) 
{ 
    for ($i = $selectedItems.Count - 1; $i -ge 0; $i--){$objListbox2.Items.Remove($SelectedItems[$i])} 
} 

}) 

$Clearconsole = New-Object System.Windows.Forms.Button 
$Clearconsole.Location = New-Object System.Drawing.Size(505,320) 
$Clearconsole.Size = New-Object System.Drawing.Size(70,20) 
$Clearconsole.Text = "Clr console" 

$objForm.Controls.Add($Clearconsole) 

$Clearconsole.Add_Click(
    { 
    $outputBox.Clear() 

    }) 

$MoveAll = New-Object System.Windows.Forms.Button 
$MoveAll.Location = New-Object System.Drawing.Size(200,160) 
$MoveAll.Size = New-Object System.Drawing.Size(70,20) 
$MoveAll.Text = "ALL" 

$objForm.Controls.Add($MoveAll) 


$MoveAll.Add_Click(
    { 
     foreach ($objItem in $objListbox.Items) 
      {[void] $objListbox2.Items.Add($objItem)} 


$objListbox.Items.Clear() 
    $outputBox.text="test" 
    }) 

$objLabel = New-Object System.Windows.Forms.Label 
$objLabel.Location = New-Object System.Drawing.Size(10,320) 
$objLabel.Size = New-Object System.Drawing.Size(280,20) 
$objLabel.Text = "Console Window" 
$objForm.Controls.Add($objLabel) 

$outputBox = New-Object System.Windows.Forms.TextBox 
$outputBox.Location = New-Object System.Drawing.Size(10,350) 
$outputBox.Size = New-Object System.Drawing.Size(565,200) 
$outputBox.MultiLine = $True 

$outputBox.ScrollBars = "Vertical" 

$objForm.Controls.Add($outputBox) 

$OKButton.Add_Click(
    { 
     foreach ($objItem in $objListbox.SelectedItems) 
      {$x += $objItem} 
     $objForm.Close() 
    }) 

$objForm.Controls.Add($OKButton) 

$objLabel = New-Object System.Windows.Forms.Label 
$objLabel.Location = New-Object System.Drawing.Size(10,20) 
$objLabel.Size = New-Object System.Drawing.Size(280,20) 
$objLabel.Text = "Please make a selection from the list below:" 
$objForm.Controls.Add($objLabel) 

$objListbox = New-Object System.Windows.Forms.Listbox 
$objListbox.Location = New-Object System.Drawing.Size(10,40) 
$objListbox.Size = New-Object System.Drawing.Size(160,20) 

$objListbox.SelectionMode = "MultiExtended" 

[void] $objListbox.Items.Add("a") 
[void] $objListbox.Items.Add("b") 
[void] $objListbox.Items.Add("c") 
[void] $objListbox.Items.Add("d") 
[void] $objListbox.Items.Add("e") 

$objListbox.Height = 200 
$objListBox.Sorted = $True 
$objForm.Controls.Add($objListbox) 
$objForm.Topmost = $True 

$objListbox2 = New-Object System.Windows.Forms.Listbox 
$objListbox2.Location = New-Object System.Drawing.Size(315,40) 
$objListbox2.Size = New-Object System.Drawing.Size(160,20) 

$objListbox2.SelectionMode = "MultiExtended" 

$objListbox2.Height = 200 
$objListBox2.Sorted = $True 
$objForm.Controls.Add($objListbox2) 
$objForm.Topmost = $True 

$objForm.Add_Shown({$objForm.Activate()}) 
[void] $objForm.ShowDialog() 

$x 
+1

这将是很好的解释为什么这是解决方案 –

+0

该代码似乎不解释如何使用它的用户的问题。总是建议在代码示例之前添加说明 – Prem