1

XPでListViewのグループヘッダーをクリックしても、何も起こりません。Windows 7でListViewのグループヘッダーをクリックすると、このグループのすべてのアイテムが選択されます。マシンがないため、WindowsVistaでテストできません。

Windows 7(またはVista)で導入されたグループヘッダーをクリックして、「すべて選択」を無効にするにはどうすればよいですか。

ユーザーは、グループヘッダーをクリックするだけでなく、必要に応じて複数またはすべてのアイテムを選択できるようにする必要があります。

代替のListView(ObjectListViewなど)の使用を提案しない回答をいただければ幸いです。

WPFを使用していません。

アップデート

テストとして、ListViewのマウスアップイベントでヒットテストを追加して、グループヘッダーがクリックされているかどうか、およびすべてのアイテムの選択を解除するかどうかを確認しました。

XPで実行している場合、これは目的の効果を実行します。Windows 7でも、そのグループ内のすべてのアイテムが選択されます。

アップデート2

解決策が見つかりました:私の答えを参照してください

4

3 に答える 3

6

私はそれを理解しました。

うまくいけば、誰かがこれが役に立つと思うでしょう-

MSDNのこのスレッドでは、誰かがグループヘッダーをクリックするためのイベントを作成しようとしていました。私はこれを私の目的のために次のように再利用しました(関数と定数の定義方法についてはリンクを参照してください):

public class MyListView : ListView
{
    //
    //some other code here, i.e. define constants, PInvoke, etc (see link)
    //

    protected override void WndProc(ref Message m)
    {
        //the link uses WM_LBUTTONDOWN but I found that it doesn't work
        if (m.Msg == WM_LBUTTONUP) 
        {
            LVHITTESTINFO info = new LVHITTESTINFO();

            //The LParamToPOINT function I adapted to not bother with 
            //  converting to System.Drawing.Point, rather I just made 
            //  its return type the POINT struct
            info.pt = LParamToPOINT(m.LParam);

            //if the click is on the group header, exit, otherwise send message
            if (SendMessage(this.Handle, LVM_SUBITEMHITTEST, -1, ref info) != -1)
                if ((info.flags & LVHITTESTFLAGS.LVHT_EX_GROUP_HEADER) != 0)
                    return; //*
        }
        base.WndProc(ref m);
    }
}

これにより、グループヘッダーをクリックしない限り、クリックを認識できます。追加の機能を実行したい場合は//*、イベントなどを配置できます。

より多くの機能が必要な場合は、を使用する代わりにswitchonを使用してください。m.MsgifWndProc

于 2012-08-01T09:41:10.680 に答える
1

ユーザーに複数のアイテムを選択させたくない場合は、MultiSelectプロパティをFalseに設定する必要があります。これは、Vista +と同じくらいXPでも問題になります。Shiftキーを押しながら、2番目の項目をクリックするだけです。

于 2012-05-10T12:53:23.370 に答える
0

これがあなたができることです:

listView.HeaderStyle = ColumnHeaderStyle.Nonclickable;

于 2012-05-10T10:54:22.780 に答える