0

AutoArrange=falseおよびLargeIconViewを使用して C# (VS 2008) で System Windows Forms ListView を使用しています。ユーザーがListView 内のアイテムの位置を変更できるようにし、すべての位置の変更を txt ファイルに保存します。次に、txtファイルからロードし直して、情報に問題がないことを確認しましたが、位置をListViewItemsに戻そうとしても何も変わりません。ハードコードされた値を持つ1つのアイテムだけに直接対処すると、うまくいくようです。何が起こっているのかわかりません。保存した位置を ListViewItems に戻すにはどうすればよいですか?

位置を割り当てようとしているときに ListView が確実に読み込まれるようにするために、読み込み部分をForm_Load から Form_Shown イベントに移動しましたが、この問題は解決しませんでした。listViewItem の位置は保存された位置に変わりませんが、デフォルトの位置合わせのようになります。autoarrange が false に設定されていることを確認しましたが、ここでできることは何も見つかりませんでした。多分あなたは知っていますか?たぶん、別の設定が役割を果たすのでしょうか?

これを1つのアイテムにだけ行うと、問題なく変更されますが、ロードされた値は適用されません。

listView1.Items[0].Position = new Point(300, 400);

ここで、値を ListViewItem の .Tag にロードし、POINT-Data を取得します。POINT-Data は有効であり、実際に存在することを確認しました。しかし、それはどういうわけか機能しません。アイテムはデフォルトの配置のまま配置され、位置は変わりません。

private void Form1_Shown(object sender, EventArgs e)
    {
        foreach (ListViewItem LVI in listView1.Items)
        {
            Point PNT1 = (Point)LVI.Tag;
            int x = PNT1.X;
            int y = PNT1.Y;
            LVI.Position = new Point(x, y);
        }
    }

さらにテストした後の更新: ListView に約 25000 項目を追加するので、AddRange Methodを使用します。AddRange メソッドは、以前に ListViewItems のList内のすべての ListViewItems に設定された私の位置をドロップするようです。AddRange を使用すると、このアイテムは .Add-Method の位置が保持された状態で 1 ~ 2 分以内に追加されますが、.Add だけを使用することはできませ。Microsoft のバグがここにあるようです。代わりに何ができますか?.Add-Method は論外です。項目を追加すると、ここでは 1 ~ 2 分ではなく 1 時間 47 分かかります。

List<ListViewItem> L1 = new List<ListViewItem>();
//...Load data from file - the data is valid loaded (checked / debugged)
 ListViewItem LV1 = new ListViewItem();
            LV1.Tag = P1;
            LV1.Text = Text1;
            LV1.ImageKey = Name1;
            LV1.ToolTipText = ToolTip1;
            LV1.ForeColor = ForeColor1;
            LV1.BackColor = BackColor1;
            LV1.Position = Position1; //here comes the problem, that seems to be lost
            L1.Add(LV1);
            //listView1.Items.Add(LV1); //this would work but it is to slow - AddRange required
        }
        listView1.Items.AddRange(L1.ToArray()); //here the position seems to get lost
4

2 に答える 2

0

ここで行っているのは、各アイテムを取得して X/Y 値を取得し (既にリストに追加されている場合)、同じ X/Y 値をそれに割り当てて戻すことであり、結果としてネットはありません。変化する。

ファイルからポイント データをロードし、それをビュー内のアイテムに割り当てる必要があります。例えば:

for(int I = 0; I < listView1.Items.Count(); I++)
{
    listView1.Items[I].Position = new Point(GetYourXForIndex(I),GetYourYForIndex(I));
}

GetYourXForIndex(int)指定されたインデックスの適切な X 値を返す、定義した関数はどこにありますか。についても同じですGetYourYForIndex(int)

于 2013-10-16T19:02:47.197 に答える