2

ListView を使用するプロジェクトがあります。ユーザーはリストビュー (詳細モードで設定) から何かを選択できます。場合によっては、はい/いいえの確認を求めるメッセージ ボックスが表示されます。確認コードは、ListView または選択を変更しません。コードは SelectedIndexChanged イベント ハンドラーにあります。

問題はこれです-ポップアップを作成する選択をすると、プログラムは最初は期待どおりに動作します。マウスをリストビューに戻した瞬間に、選択がマウスの下のシンボルに変更されます (クリックせずに) - 「HoverSelect」がオンになっているように (オンになっていない場合)。これは、MessageBox のポップアップを含む選択を行った後にのみ発生します。

何かを壊したと思って、簡単なテストを書くことにしました。ハードコーディングされた値を使用してリスト ビューを作成し、次のコードを挿入しました。

 private void listView1_SelectedIndexChanged(object sender, EventArgs e)
      {

            listView1.Enabled = false;
            MessageBox.Show("Test");
            listView1.Enabled = true;

      }

選択すると、イベントが 2 回発生します。それが私の元の問題に関連しているのか、それとも単なる偶然の一致なのかはわかりません。

追加:そこにある私のテスト例では、次のことが起こります:

1 番目の選択 - 「テスト」 2 番目の選択 - 「テスト」 「テスト」 3 番目の選択 - 「テスト」 「テスト」

ですから、それは私の主な問題の別の側面だと思います。リストビューを無効/有効にするコードを削除しても違いはありません。

MessageBox と ListView を互いに「うまく機能させる」にはどうすればよいですか?

4

5 に答える 5

0

私はあなたの問題を解決すると思います:

private void listView1_ItemSelectionChanged(object sender, ListViewItemSelectionChangedEventArgs e)
    {
        if (e.IsSelected)
        {
            if (!e.Item.Selected)
            {
                e.Item.Selected = false;
            }
            MessageBox.Show("test");
        }
    }
于 2012-08-16T10:36:20.727 に答える
0

先日、同様の問題が発生し、フォーカスを削除するアクションを実行するときに奇妙な問題が発生しましたListViewListViewItem私の場合、 UIの更新された別の部分をクリックするListViewと、フォーカスが失われ、満足できなくなりました。

私の解決策は、次のことを行うことでした-次のメソッドを追加します:

private bool AllowToLoseFocus = true;

private void MyListView_Leave(object sender, EventArgs e)
{
   if(!AllowToLoseFocus)
        MyListView.Focus();
}

private void MyListView_ItemSelectionChanged(object sender, ListViewItemSelectionChangedEventArgs e)
{
    AllowToLoseFocus = false;
    //do stuff here
    AllowToLoseFocus = true;
}

おそらく最も良い解決策ではなく、あなたの場合はうまくいかないかもしれません...しかし試してみる価値があります!

于 2012-08-16T10:09:38.723 に答える
0

早速やってみて、すぐに再現しましたが、トリッキーです。解決策をお見せできます。素晴らしいものではありませんが、うまくいきます。MessageBox で代わりに 2 番目のフォームを使用し、リストビューの無効化/有効化に戻る必要があります。

private void listView1_SelectedIndexChanged(object sender, EventArgs e)
{
    if (listView1.Enabled)
    {
        listView1.Enabled = false;
        Form2 confirm = new Form2();
        confirm.FormClosed += new FormClosedEventHandler(confirm_FormClosed);
        confirm.Show();
    }
}

void confirm_FormClosed(object sender, FormClosedEventArgs e)
{
    listView1.Enabled = true;
}
于 2012-08-16T12:04:27.320 に答える
0

SelectedIndexChanged イベントは、仕様による動作であるため、2 回発生します。

ユーザーが複数選択を実行するために CTRL を押さずに項目を選択すると、コントロールは最初に前の選択をクリアします。この場合、このイベントは、以前に選択されたアイテムごとに 1 回、新しく選択されたアイテムに対して 1 回発生します。

詳細については、MSDNをご覧ください。

ホバリングの問題を再現することはできませんが、これを試してメッセージ ボックスを 1 回だけ表示することはできます (複数選択を使用しない場合にのみ機能します)。

private void listView1_SelectedIndexChanged(object sender, EventArgs e)
{
    if (listView1.SelectedItems.Count > 0)
    {
        MessageBox.Show("Test");
    }
}
于 2012-08-16T11:55:56.187 に答える
0

に設定ListView.HideSelectionfalseます。

ListView.HideSelection: コントロールがフォーカスを失ったときに、コントロール内の選択された項目を強調表示したままにするかどうかを示す値を取得または設定します。

于 2012-08-16T10:06:36.523 に答える