2017-03-23 3 views
0

私のwinformアプリケーションには、毎週の曜日のリストビューがあります。各listview(listSun、listMon、listTueなど)には、その日のタスクのリストがあります。リストを具体的に記載してアイテムを削除することはできますが、選択して機能させることはできません。c#Winformフォーム内の複数のリストビューから選択したアイテムを削除します

ユーザーが任意の日にアイテムをクリックできるようにし、簡単な機能で選択されているリストを特定し、選択したアイテムを削除したいとします。

ロジックImは現時点では、選択されたアイテムを削除する形式のForeach listviewです。これまでに試したコードです。

private void btnDelete_Click(object sender, EventArgs e) 
     { 

      foreach (ListView listview in this.Controls) 
      { 
       foreach (ListViewItem listitem in listview.SelectedItems) 
        listitem.Remove(); 
      } 

もちろん、これは機能しませんが、私は提案を修正したり別のルートをとっています。

+1

あなたはリストビューコントロールのすべてがthis.Controlsの要素であることを確認していますか? GroupBoxまたはパネルでListViewを作成した可能性があります。 –

+0

フォームにグループボックスまたはパネルがありません。listViewはデザイナを介してツールボックスからドラッグアンドドロップされました。 – eatumup

+0

listViewからselectedItemを削除するだけですか? –

答えて

1

これはいかがですか?

まず、Formクラスのプロパティを作成します。

private ListView selectedListView {get; set;} 

ユーザーがリストビューの1つを選択すると、それをプロパティに設定します。

// ListView Clicked Event 
var userSelected = (ListView)sender; 
if(userSelected.SelectedItem != null) 
    selectedListView = (ListView)sender; 

selectedListをselectedListView.Items.Remove()で削除します。

+0

あなたの提案の周りに私の頭を包み込むのにはもうちょっと時間がかかりましたが、一度やってみると美しく仕上がりました。それは私が書いていないコードを整理しましたが、私は書くつもりだと思っていました。最終的には で終了します。foreach(selectedListView.SelectedItemsのListViewItem listitem) { listitem.Remove(); } ありがとうございました! – eatumup

+0

@eatumupこれは簡単にうまくいきました。 :) – Niklas

1

このエラーの理由はこれです:

foreach (ListView listview in this.Controls) 
      { 
       foreach (ListViewItem listitem in listview.SelectedItems) 
        listitem.Remove(); 
      } 

foreachループは、内部左側可変型 (この場合には、そのリストビュー)にコレクションのアイテムをキャスト。

のような異なるコントロールがラベル、グループボックスなどにあります。 foreachを試してみると、そのコントロールコレクション内のラベルにヒットすると、foreachループはラベルをlistviewに追加し、失敗します。

あなたがして、あなたのthis.Controlsのforeachを置き換えることにより、LINQのビットでこれを修正することができます:

foreach (ListView listview in this.Controls.OfType<Control>(). 
Where(c => c.GetType() == typeof(ListView))) 
{ 
     foreach (ListViewItem listitem in listview.SelectedItems) 
     listitem.Remove(); 
} 
+0

ありがとうございます。私はあなたのコメントを読んでいるので、1年か2年前のようなグループボックスのボタンで同様のことにつまずくことは覚えています。あまりにも頻繁に書いてはいけません...しかし、最終的にはTypeOfを指定しなければなりませんでした。私は構文のその部分について完全に忘れてしまった。私に思い出させてくれてありがとう – eatumup

+0

あなたは大歓迎です!あなたのコレクションを同じタイプのコレクションにすることを覚えておいてください。そうすれば、無効なキャストの例外を除いて反復することができます。 – Niklas

+0

面白いほど私はこの答えを使う必要があった別のインスタンスに遭遇しました。しかし、上記の構文は正しくはありません。このwinformsのケースではどこに存在しません。ですから、この投稿を参照して参考になる人は、ここで正しい構文である: foreachの(this.Controls.TypeOfにおけるリストビューリストビュー(リストビュー)) {foreachの(リストアイテムのListViewItem listview.SelectedItemsで) listitem.Remove()。 } – eatumup

関連する問題