2011-12-08 5 views
0

詳細リストのListViewアイテムでチェックされた各アイテムを削除しようとしています。私はチェックしながらエントリを削除したくないのですが、エントリを削除するために値を使うボタンに値を渡します。ListViewでItemCheckedのEventHandlerを作成するにはどうすればよいですか?

私は少し遊んでいますが、私はいくつかの問題に出くわしました。まず第一に、これを実行してイベントハンドラを作成することはできません:lvPC.ItemChecked += new EventHandler(CheckedState);これはエラー:No overload for 'CheckedState' matches delegate 'System.EventHandler'を引き起こします。

第2に、アイテムのIDを取得するにはどうすればよいですか?これを言うと、追加されたエントリごとにIDがありますが、テーブルビューには追加されません。意味どのIDを削除すべきかをどのように決定するのですか?

private void CheckedState 
    (object sender, System.Windows.Forms.ItemCheckEventArgs e) 
{ 
    ListView.CheckedListViewItemCollection 
     checkedItems = lvPC.CheckedItems; 

    string items; 

    foreach (ListViewItem item in checkedItems) 
    { 
     items = item + ", "; 
     MessageBox.Show(items); 
    } 

    if (e.CurrentValue == CheckState.Unchecked) 
    { 
    } 
    else if ((e.CurrentValue == CheckState.Checked)) 
    { 
    } 
} 

これは私が3種類のリストビューにデータを挿入しています方法です:

using (OleDbDataReader read = command.ExecuteReader()) 
{ 
    // Checking if there is any data in the file. 
    if (read.HasRows) 
    { 
     // Reading information from the file. 
     while (read.Read()) 
     { 
      if (security.DecryptAES(read.GetString(1), 
       storedAuth.Password, storedAuth.UserName) 
        == "PC Password") 
      { 
       PC = new ListViewItem(""); 
       PC.SubItems.Add(security.DecryptAES 
        (read.GetString(5), storedAuth.Password, 
         storedAuth.UserName)); 
       PC.SubItems.Add(security.DecryptAES 
        (read.GetString(6), storedAuth.Password, 
         storedAuth.UserName)); 

       lvPC.Items.Add(PC); 
      } 
      else if (security.DecryptAES(read.GetString(1), 
       storedAuth.Password, storedAuth.UserName) 
        == "Web Site Password") 
      { 
       Web = new ListViewItem(""); 
       Web.SubItems.Add(security.DecryptAES 
        (read.GetString(2), storedAuth.Password, 
         storedAuth.UserName)); 
       Web.SubItems.Add(security.DecryptAES 
        (read.GetString(5), storedAuth.Password, 
         storedAuth.UserName)); 
       Web.SubItems.Add(security.DecryptAES 
        (read.GetString(6), storedAuth.Password, 
         storedAuth.UserName)); 

       lvWeb.Items.Add(Web); 
      } 
      else if (security.DecryptAES(read.GetString(1), 
       storedAuth.Password, storedAuth.UserName) 
        == "Serial Code") 
      { 
       Serial = new ListViewItem(""); 
       Serial.SubItems.Add(security.DecryptAES 
        (read.GetString(3), storedAuth.Password, 
         storedAuth.UserName)); 
       Serial.SubItems.Add(security.DecryptAES 
        (read.GetString(4), storedAuth.Password, 
         storedAuth.UserName)); 

       lvSerialCode.Items.Add(Serial); 
      } 
     } 
    } 
} 

答えて

1

まず、イベントのための署名が正しくありません。それは次のようになります。

void CheckedState(object sender, System.Windows.Forms.ItemCheckedEventArgs e) 

第二に、あなたが追加し、各ListViewItemTagプロパティを設定することができます。

item.Tag = 1; 

次にあなたがチェックされた項目を見たとき、これを参照します。

更新

は、初期応答でCheckedStateイベントの割り当てを逃しました。それは次のようになります。

lvPC.ItemChecked += new ItemCheckedEventHandler(CheckedState); 
+0

...私はそれが最初の答えではないと知っているが、それはあなたの質問の両方に答えるし、助けは「+ =新しいEventHandlerの(CheckedState)lvPC.ItemChecked;」依然としてエラーが発生します。 – HelpNeeder

+0

@HelpNeeder:申し訳ありませんが、元の応答にそれを含めるのを忘れてしまいました。回答が更新されました。 –

+0

ああ!ありがとう!プロパティからEventHandlerを作成することもできます。しかし私はそれをプログラム的にやりたい。 – HelpNeeder

1

私はあなたの質問を誤解するかもしれませんが、あなたは、単にボタンのクリックでチェックされた項目を削除したい場合は、私はあなたがどの項目を追跡するためにItemCheckedイベントに耳を傾ける必要はないと思いますチェック

代わりに、ボタンをクリックし、ListViewから削除されてチェックされた項目によってちょうどループ:

private void button1_Click(object sender, EventArgs e) 
{ 
    foreach (ListViewItem item in listView1.CheckedItems) 
    { 
     listView1.Items.Remove(item); 
    } 
} 

あなただけがチェックされている特定の項目を削除したい場合は、上記のループでは、見てcompetent_techが示唆するように、テキストに格納されている値またはアイテムのtagを使用して、アイテムを削除するかどうかを決定します。

+0

この音は良いです。私はこれを試してみましょう。 – HelpNeeder

+0

ListViewからアイテムを削除する以外にも、データベースファイルからエントリを削除する必要があります。私はこれを行うことによって、データベースファイルから項目IDを選択する方法がわかりません。しかし、これは私が必要とした半分の答えです。 +1。 – HelpNeeder

+0

@HelpNeederの場合、@competent_techは答えの残りの半分を提供したと思います:ListViewにデータを入力するときにIDをアイテムの 'Tag'に格納し、チェックしたアイテムを削除してデータベースから削除するときに使用します。あなたがほとんどそこにいるような音:) –

1
void CheckedState(object sender, System.Windows.Forms.ItemCheckedEventArgs e) 

lvPC.ItemChecked += new ItemCheckedEventHandler(CheckedState); 

ソリューションの一部ですが、IDの取得に、私は、あなたが小さなオブジェクトを作成することをお勧めしますするBindingListにそれらを追加し、リストビューにそれをバインドします。

Visual Studioでは、+=の部分を入力してから、「新しいハンドラ」部分に1回、呼び出すメソッドに対して1回、「タブ」を2回押すだけで、EventHandlerの不一致の問題を回避できます。あなたのためにそれをすべて作成してください。

利点は、あなたがしたいオブジェクトに「e.Item」からチェックされた項目をキャストし、必要であれば、単純に、バインディングリストから削除して、データベースの除去を行うべきであるということです。

希望これは

+0

私はそのダブルタブを試してみました。 – HelpNeeder

関連する問題