2

SelectedIndicesリストボックスのプロパティがいつ変更されるかを通知するために使用できるイベントはありますか?アイテムの特定のプロパティ値に基づいて、リストボックス内のアイテムの選択を解除したい。aが変更されたときに機能するイベントをフックしましたが、複数選択のためにプロパティが変更さSelectedIndexれたときにどのように機能するかわかりません。SelectedIndices

private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
{
     Curve curItem = (Curve)listBox1.SelectedItem;
     int index = listBox1.Items.IndexOf(curItem);

     if (curItem.newName == null)
     {
          listBox1.SetSelected(index, false);
     }
}
4

3 に答える 3

3

ListBox.SelectedItemsとLINQを使用して、すべてCurvesを検索し、それらのnewName==null選択を解除できます。

private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
{
    var nullNameCurves = listBox1.SelectedItems
        .Cast<Curve>()
        .Where(c => c.newName == null)
        .ToList();
    listBox1.SelectedIndexChanged -= listBox1_SelectedIndexChanged;
    foreach (Curve curve in nullNameCurves)
        listBox1.SetSelected(listBox1.Items.IndexOf(curve), false);
    listBox1.SelectedIndexChanged += listBox1_SelectedIndexChanged;
}
于 2012-06-20T20:32:50.267 に答える
1

MSDNによると、このイベントは選択が変更されるたびに発生します。

SelectionModeプロパティがSelectionMode.MultiSimpleまたはSelectionMode.MultiExtendedに設定されている場合、選択からアイテムを削除するなど、SelectedIndicesコレクションに変更を加えると、このイベントが発生します。

つまり、基本的には、単一選択で使用するのと同じように使用できます。

サンプル:

たとえば、nullをnewNameとして持つすべてのアイテムの選択を解除する場合:

foreach (var item in listBox1.SelectedItems)
{
    if ((item as Curve).newName == null)
    {
        int index = listBox1.SelectedItems.IndexOf(item);
        listBox1.SetSelected(index, false);
    }
}

(SelectedItemsオブジェクト自体が変更されるため、foreachループ内のアイテムの選択を解除できるかどうかはわかりません。機能しない場合でも、それらのアイテムの一時リストを作成して、ループの後で選択を解除できます。)

于 2012-06-20T20:24:17.257 に答える
0
private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
    {
        Curve curItem = null;
        for (int i = 0; i < listBox1.SelectedItems.Count; i++)
        {
            curItem = (Curve)listBox1.SelectedItems[i];
            if (curItem != null)
            {
                int index = listBox1.Items.IndexOf(curItem);

                if (curItem.newName == null)
                {
                    listBox1.SetSelected(index, false);
                }
            }
        }
    }
于 2012-06-20T21:01:48.413 に答える