包含多个项目的动态列表视图

时间:2017-05-03 01:43:26

标签: c# listview dynamically-generated

所以,我一直在学校项目中工作,我需要动态地创建和添加东西到listview,第一次添加没有任何问题,但是当它即将添加第二个时它会崩溃。

这是代码:

        lvwCarros.Columns.Clear();
        ListViewItem lvi = new ListViewItem();
        int idx, idx2;
        lvwCarros.Columns.Add("Carro", 80, HorizontalAlignment.Center);
        lvwCarros.Columns.Add("Ano", 60, HorizontalAlignment.Center);
        lvwCarros.Columns.Add("Stand", 60, HorizontalAlignment.Center);
        lvwCarros.Columns.Add("Localização do Stand", 120, HorizontalAlignment.Center);
        for (idx = 0; idx < Program.Carros.Count  ; idx++)
        {
            lvi.Text = Program.Carros[idx].Marca + " " + Program.Carros[idx].Modelo;

            for (idx2 = 0; idx2 < Program.Matriculas.Count  ; idx2++)
            {
                if (Program.Carros[idx].Matricula == Program.Matriculas[idx2].ID_Matricula)
                {
                    lvi.SubItems.Add(Program.Matriculas[idx2].Ano_Emissão.ToString());
                    for (int idx3 = 0; idx3 < Program.Stands.Count; idx3++)
                    {
                        if (Program.Carros[idx].Proprietario == Program.Stands[idx3].ID_Stand)
                        {
                            lvi.SubItems.Add(Program.Stands[idx3].Nome_Stand);
                            lvi.SubItems.Add(Program.Stands[idx3].Local_Stand);
                        }
                        lvwCarros.Items.Add(lvi);
                    }
                } 
            }
        }

        lvwCarros.Visible = true;
        lvwCarros.Enabled = true;

非常感谢您提前:))

2 个答案:

答案 0 :(得分:0)

基本上你的问题是每次调用lvwCarros.Items.Add()时你的lvi都需要成为一个新对象。尝试使用“lvi = new ListViewItem(first subitem);”在那里最里面的循环顶部。您只能将每个ListViewItem对象添加到ListView一次 - 这就是您获得异常的原因。

答案 1 :(得分:0)

这是正在运行的代码。这段代码有两个问题:

  1. 每个要添加的List项都应该在for循环中实例化,因为它会创建一个新项。否则,您将一次又一次地添加相同的项目并修改所有项目的值,如果一个项目被更改,因为它们将指向相同的项目。因此,如果要创建不同的列表视图项,请在for循环中移动行ListViewItem lvi = new ListViewItem();

  2. 您正在内部for循环中添加listview项lvi,这会导致它多次添加每个listitem。这就是为什么你得到错误。将此行移到最外面的for循环中,错误就会消失。

    lvwCarros.Columns.Clear();
    
    int idx, idx2;
    lvwCarros.Columns.Add("Carro", 80, HorizontalAlignment.Center);
    lvwCarros.Columns.Add("Ano", 60, HorizontalAlignment.Center);
    lvwCarros.Columns.Add("Stand", 60, HorizontalAlignment.Center);
    lvwCarros.Columns.Add("Localização do Stand", 120, HorizontalAlignment.Center);
    for (idx = 0; idx < Program.Carros.Count  ; idx++)
    {
       /* You should initiate a new item in the loop if you want to add more*/
       ListViewItem lvi = new ListViewItem();
    
        lvi.Text = Program.Carros[idx].Marca + " " + Program.Carros[idx].Modelo;
    
        for (idx2 = 0; idx2 < Program.Matriculas.Count  ; idx2++)
        {
            if (Program.Carros[idx].Matricula == Program.Matriculas[idx2].ID_Matricula)
            {
                lvi.SubItems.Add(Program.Matriculas[idx2].Ano_Emissão.ToString());
                for (int idx3 = 0; idx3 < Program.Stands.Count; idx3++)
                {
                    if (Program.Carros[idx].Proprietario == Program.Stands[idx3].ID_Stand)
                    {
                        lvi.SubItems.Add(Program.Stands[idx3].Nome_Stand);
                        lvi.SubItems.Add(Program.Stands[idx3].Local_Stand);
                    }
    
                }
            } 
        }
        /*Moving it to outermost for loop*/
        lvwCarros.Items.Add(lvi);
    }
    
    lvwCarros.Visible = true;
    lvwCarros.Enabled = true;