1

Boxes と Files の 2 つの列を持つ ListView があります。文字列のリストに項目を追加してから、ListView にその文字列のリストを設定します。8 文字の長さのすべての項目が Boxes 列に入り、9 文字のすべての項目が Files 列に入るようにしたいと考えています。これまでのところ、for ループを使用して反復し、if else ステートメントを使用して項目を追加しようとしましたが、何か間違っているようです。これが私の現在のコードです:

public void PopulateItemsList()
    {
        BoxAndFileList.Items.Clear();
        ScanIdBox.Text = string.Empty;
        for (int i = 0; i < BoxNumberRepository._boxAndFileList.Count; i++)
        {
            var item = BoxNumberRepository._boxAndFileList.Item[i];
            if (item.Length == 8)
            {
                BoxAndFileList.Items.Insert(0, item);
            }
            else
            {
                BoxAndFileList.Items.Insert(1, item);
            }
        }
    }

リスト (_boxAndFileList) を反復処理し、Insert() を利用して項目を列の特定のインデックスに挿入しようとしています (ボックスは 0、ファイルは 1)。Item が文字列リストの正当なプロパティであることは明らかですが、VS はリストにその定義が含まれていないと言い続けています。どうすればこれを行うことができますか?また、この方法について外部からのフィードバックをまだ受け取っていないので、より良い方法があれば教えてください。

編集: BoxNumberRepository は、_boxAndFileList というリストを作成するクラスです。以下のコード:

public class BoxNumberRepository : Scan_Form
    {
        public static List<string> _boxAndFileList = new List<string>();

        public void AddItem(string item)
        {
            _boxAndFileList.Add(item);
        }

        public void Delete(string item)
        {
            _boxAndFileList.Remove(item);
        }

        public IEnumerable<string> GetAllItems()
        {
            return _boxAndFileList;
        }
    }

その提案をしてくれた Alessandro D'Andria に感謝します。それは正しかった。ただし、9 文字であっても、すべての項目が最初の列に追加されるだけです。2 番目の列に追加する 9 個のキャラクター アイテムを取得するにはどうすればよいですか?

4

2 に答える 2

1

あなたが抱えている問題は、 と の両方を同時に追加しなければならないboxことfileですlist item

編集:デカルト積を左外部結合に変更しました。

編集: コメントを追加し、構文のバグを修正しました

private List<string> _boxAndFileList = new List<string> { "12345678", "123456789", "1234", "123456778" };
public void PopulateItemsList()
{
    //clear the list
    BoxAndFileList.Items.Clear();
    //add the labels to the top of the listbox
    BoxAndFileList.Columns.Add("Boxes");
    BoxAndFileList.Columns.Add("Files");
    //set the view of the list to a details view (important if you try to display images)
    BoxAndFileList.View = View.Details;
    //clear scan id box
    ScanIdBox.Text = string.Empty;

    //get all the items whos length are 8 as well as a unique id (index)
    var boxes = _boxAndFileList.Where(b => b.Length == 8).Select((b, index) => new { index, b }).ToList();
    //get all the items whos length are NOT 8 as well as a unique id (index)
    var files = _boxAndFileList.Where(f => f.Length != 8).Select((f, index) => new { index, f }).ToList();

    //join them together on their unique ids so that you get info on both sides.
    var interim = (from f in files
                   join b in boxes on f.index equals b.index into bf
                   from x in bf.DefaultIfEmpty()
                   select new { box = (x == null ? String.Empty : x.b), file = f.f });
    //the real trick here is that you have to add 
    //to the listviewitem of type string[] in order to populate the second, third, or more column.
    //I'm just doing this in linq, but var x = new ListViewItem(new[]{"myBox", "myFile"}) would work the same
    var fileboxes = interim.Select(x => new ListViewItem(new []{ x.box, x.file})).ToArray();
    //add the array to the listbox
    BoxAndFileList.Items.AddRange(fileboxes);
    //refresh the listbox
    BoxAndFileList.Refresh();
}
于 2013-09-06T22:51:02.427 に答える