2

非常に単純な質問ですが、見た目よりもはるかに難しいことが証明されると思います

フォーカスがリストビューから離れたときにリストビュー項目の選択を保持したいのですが、現時点ではhideselectionプロパティを false に設定していますが、それで問題ありません..非常に明るい灰色の選択がリストの後に残りますビューがフォーカスを失うので、私の質問は、行のテキストの色や背景の色を変更するなど、ユーザーがそれを認識できるように、そのアイテムがまだ選択されていることをどのように適切に示すことができるかということです。または、最初に選択したときに行全体が青に変わるので、強調表示したままにしますか?

インテリセンスを調べてみましたが、行、項目、または選択した項目の個々の色のプロパティについて何も見つからないようです。

選択したアイテムには独自の背景色があるため、存在する必要がありますが、どこで変更できますか?

ああ、リストビューは詳細ビューにとどまる必要があります。つまり、グーグルで見つけた唯一の方法を使用することはできません

ありがとう

4

2 に答える 2

4

複数の選択を許可せず、画像 (チェックボックスなど) を持たない ListView のソリューションを次に示します。

  1. ListView のイベント ハンドラーを設定します (この例ではlistView1という名前です)。
    • DrawItem
    • Leave (ListView のフォーカスが失われたときに呼び出されます)
  2. グローバル int 変数 (つまり、ListView を含む Form のメンバー、この例ではgListView1LostFocusItemという名前) を宣言し、値 -1 を割り当てます。
    • int gListView1LostFocusItem = -1;
  3. 次のようにイベント ハンドラーを実装します。

    private void listView1_Leave(object sender, EventArgs e)
    {
        // Set the global int variable (gListView1LostFocusItem) to
        // the index of the selected item that just lost focus
        gListView1LostFocusItem = listView1.FocusedItem.Index;
    }
    
    private void listView1_DrawItem(object sender, DrawListViewItemEventArgs e)
    {
        // If this item is the selected item
        if (e.Item.Selected)
        {
            // If the selected item just lost the focus
            if (gListView1LostFocusItem == e.Item.Index)
            {
                // Set the colors to whatever you want (I would suggest
                // something less intense than the colors used for the
                // selected item when it has focus)
                e.Item.ForeColor = Color.Black;
                e.Item.BackColor = Color.LightBlue;
    
               // Indicate that this action does not need to be performed
               // again (until the next time the selected item loses focus)
                gListView1LostFocusItem = -1;
            }
            else if (listView1.Focused)  // If the selected item has focus
            {
                // Set the colors to the normal colors for a selected item
                e.Item.ForeColor = SystemColors.HighlightText;
                e.Item.BackColor = SystemColors.Highlight;
            }
        }
        else
        {
            // Set the normal colors for items that are not selected
            e.Item.ForeColor = listView1.ForeColor;
            e.Item.BackColor = listView1.BackColor;
        }
    
        e.DrawBackground();
        e.DrawText();
    }
    

注: この解決策では、ちらつきが発生する可能性があります。これを修正するには、ListView コントロールをサブクラス化して、保護されたプロパティDoubleBufferedを true に 変更できるようにします。

public class ListViewEx : ListView
{
    public ListViewEx() : base()
    {
        this.DoubleBuffered = true;
    }
}

ツールボックスに追加できるように、上記のクラスのクラス ライブラリを作成しました。

于 2013-04-01T19:15:00.753 に答える
1

A possible solution might be this answer to an another question:

How to change listview selected row backcolor even when focus on another control?

于 2012-06-06T14:06:30.963 に答える