代码之家  ›  专栏  ›  技术社区  ›  Jamie Keeling

用列表中的对象填充ListView<>

  •  1
  • Jamie Keeling  · 技术社区  · 15 年前

    我目前正在将控制台应用程序转换为Windows窗体应用程序。 首先,我设计应用程序是为了在将来使用GUI,所以没有太多代码需要更改。

    我有一个UserCollection类,它本身包含一个用户/成员类型的列表(成员是从用户派生的)。

    我要做的是将用户集合列表中的每个项添加到ListView,这样我就可以看到每个条目并垂直列出多个条目。

    我首先尝试使用以下方法来实现这一点:

            private void UpdatePeopleListings()
        {
            foreach (User person in newCollection)
            {
                listViewPeople.Items.Add(person.ToString());
            }
        }
    

    其中NewCollection是从主Windows窗体中的UserCollection类创建的新对象。

    我收到错误:

    foreach statement cannot operate on variables of type 'Collection.UserCollection' because 'Collection.UserCollection' does not contain a public definition for 'GetEnumerator'
    

    然后我尝试了一个小的变通方法,因此在我的用户集合中,我创建了以下方法:

            public User ReturnUser()
        {
            foreach (User person in _userCollection)
            {
                return person;
            }
            return null;
        }
    

    (u usercollection是usercollection.cs中用户/成员的列表<gt;)

    然后这样使用:

    private void UpdatePeopleListings()
        {
            listViewPeople.Items.Add(newCollection.ReturnUser().ToString());
        }
    

    虽然这确实用一个条目填充ListView,但它只填充第一个条目。 如果我要向新集合添加多个用户/成员,那么它只会重复第一个条目。

    如何正确地用集合中的所有对象填充ListView,以及如何防止它只重复一个对象。

    用户集合.cs

    ///////////////////////////////////////////////////////////
    //  UserCollection.cs
    //  Implementation of the Class UserCollection
    //  Generated by Enterprise Architect
    //  Created on:      22-Oct-2009 22:40:30
    ///////////////////////////////////////////////////////////
    
    #region Using Statements
    
    using System;
    
    using System.Collections.Generic;
    
    using System.Runtime.Serialization;
    using System.Runtime.Serialization.Formatters.Binary;
    
    using System.IO;
    
    #endregion
    
    namespace Collection
    {
        //Allows the class to be saved
        [Serializable()]
    
        public class UserCollection
        {
            #region Fields
    
            //Declares a list of type User (Which also holds derived Member objects)
            private List<User> _userCollection = new List<User>();
    
    
            //Holds number of members
            int nMember = 0;
            //Holds number of users
            int nUser = 0;
    
            #endregion
    
            #region Add Operations
    
            /// <summary>
            /// Adds a new user
            /// </summary>
            /// <param name="user"></param>
            public void AddUser(User user)
            {
                //Adds the user given in the operation parameters to the collection
                _userCollection.Add(user);
                nUser++;
    
                //Sorts the collection using the CompareTo() specified in the User class.
                _userCollection.Sort();
    
                //Console.WriteLine used for testing purposes
                //Console.WriteLine("added");
            }
    
    
            ///<summary>
            ///Adds a new Member
            ///</summary>
            /// <param name="member"></param>
            public void AddMember(Member member)
            {
                //Adds the member given in the operation parameters to the collection
                _userCollection.Add(member);
                nMember++;
    
                //Sorts the collection using the CompareTo() specified in the User class.
                _userCollection.Sort();
    
                //Console.WriteLine used for testing purposes
                //Console.WriteLine("added");
            }
    
            #endregion
    
            #region Removal Operations
    
            ///<summary>
            ///Removes a user based on FirstName,LastName and PostCode
            ///</summary> 
            /// <param name="person"></param>
            public void RemoveUser(User person)
            {
                //Only search collection for users if there is data in it
                if (_userCollection.Count > 0)
                {
                    //Create a temp list for any matched found
                    List<User> tempList = new List<User>();
    
                    foreach (User u in _userCollection)
                    {
                        //If the details stored in the collection match the details given in the search
                        if (u.FName == person.FName && u.LName == person.LName && u.PostCode == person.PostCode)
                        {
                            //Add any matches to the temp list
                            tempList.Add(u);
                        }
                        else
                        {
                            throw new ArgumentException("User not found");
                        }
                    }
    
                    //Delete any matches 
                    foreach (User u in tempList)
                    {
                        _userCollection.Remove(u);
                        //Decrement user count
                        nUser--;
                    }
                }
                else
                {
                    throw new AccessViolationException("No data in collection");
                }
            }
    
            /// <summary>
            /// Removes a user using Membership number
            /// </summary>
            /// <param name="number"></param>
            public void RemoveMember(int number)
            {
                    //Create a temp list of type Member
                    Member temp = new Member();
    
                    //Use the temp list to compare types and store all objects of type member
                    //found in the collection to it.
                    List<User> Mems = _userCollection.FindAll(delegate(User u)
                    { return u.GetType() == temp.GetType(); });
    
                    //Delete any matches
                    foreach (Member m in Mems)
                    {
                        if (m.mNum == number)
                        {
                            _userCollection.Remove(m);
                            //Decrement member count
                            nMember--;
                        }
                        else
                        {
                            throw new ArgumentException("Member not found");
                        }
                    }
            }
    
            #endregion
    
            #region Search Operations
    
            ///<summary>
            ///Returns member by Membership number
            /// </summary>
            /// 
            /// <param name="_mNumber"></param>
            public Member FindByMNo(int number)
            {
                //Create a temp list of type Member
                Member temp = new Member();
    
                //Use the temp list to compare types and store all objects of type member
                //found in the collection to it.
                List<User> Mems = _userCollection.FindAll(delegate(User u)
                { return u.GetType() == temp.GetType(); });
    
                //Return any matches found
                foreach (Member i in Mems)
                {
                    if (i.mNum == number)
                    {
                        return i;
                    }
                }
                throw new ArgumentException("Member not found");
            }
    
            ///<summary>
            ///Returns a list of Users matching details given
            ///</summary>
            /// 
            /// <param name="_fName"></param>
            /// <param name="_lName"></param>
            public List<User> FindByName(User person)
            {
                //Create a temp list to store any matches
                List<User> temp = new List<User>();
    
                //Add matches found to the temp list
                foreach (User u in _userCollection)
                {
                    if (u.LName == person.LName)
                    {
                        temp.Add(u);
                    }
                }
    
                if (temp.Count > 0)
                {
                    //Return the list that holds any matches
                    return temp;
                }
    
                throw new ArgumentException("User not found");
            }
    
            public User ReturnUser()
            {
                foreach (User person in _userCollection)
                {
                    return person;
                }
                return null;
            }
    
            #endregion
    
            #region Edit Operations
    
            ///<summary>
            ///Edits a members membership expiry
            ///</summary>
            /// 
            /// <param name="member"></param>
            public void EditMemStatus(int member, DateTime newDate)
            {
                    //Create a temp list of type Member
                    Member temp = new Member();
    
                    //Use the temp list to compare types and store all objects of type member
                    //found in the collection to it.
                    List<User> Mems = _userCollection.FindAll(delegate(User u)
                    { return u.GetType() == temp.GetType(); });
    
                    //Search for the member that matches the number given in the parameter
                    foreach (Member m in Mems)
                    {
                        if (m.mNum == member)
                        {
                            //Replace the match with the new expiry
                            m.mExp = newDate;
                        }
                        else
                        {
                            throw new ArgumentException("Date cannot be changed");
                        }
                    }
            }
    
            #endregion
    
            #region I/O Operations
    
            public bool SaveData()
            {
                try
                {
                    //Open the stream using the Data.txt file
                    using (Stream stream = File.Open("Data.txt", FileMode.Create))
                    {
                        //Create a new formatter
                        BinaryFormatter bin = new BinaryFormatter();
                        //Copy data in collection to the file specified earlier
                        bin.Serialize(stream, _userCollection);
                        bin.Serialize(stream, nMember);
                        bin.Serialize(stream, nUser);
                        //Close stream to release any resources used
                        stream.Close();
                    }
                    return true;
                }
                catch (IOException ex)
                {
                    throw new ArgumentException(ex.ToString());
                }
            }
    
            public bool LoadData()
            {
                //Check if file exsists, otherwise skip
                if (File.Exists("Data.txt"))
                {
                    try
                    {
                        using (Stream stream = File.Open("Data.txt", FileMode.Open))
                        {
                            BinaryFormatter bin = new BinaryFormatter();
    
                            //Copy data back into collection fields
                            _userCollection = (List<User>)bin.Deserialize(stream);
                            nMember = (int)bin.Deserialize(stream);
                            nUser = (int)bin.Deserialize(stream);
                            stream.Close();
    
                            //Sort data to ensure it is ordered correctly after being loaded
                            _userCollection.Sort();
                            return true;
    
                        }
                    }
                    catch (IOException ex)
                    {
                        throw new ArgumentException(ex.ToString());
                    }
                }
                else
                {
                    //Console.WriteLine present for testing purposes
                    Console.WriteLine("\nLoad failed, Data.txt not found");
                    return false;
                }
            }
    
            #endregion
    
            #region Properties
    
            //Gets amount of Members in collection
            public int GetNMember
            {
                get
                {
                    return nMember;
                }
            }
    
            //Gets amount of Users in collectioj
            public int GetNUser
            {
                get
                {
                    return nUser;
                }
            }
    
            #endregion
    
        }//end UserCollection
    }
    

    忽略任何随机控制台的东西,我还没有完成清理。

    2 回复  |  直到 10 年前
        1
  •  3
  •   Frederik Gheysels    15 年前

    foreach不起作用,因为UserCollection类不实现IEnumerable接口。

    ListItem不是您期望的那样,因为您不了解ListView/ListViewItem的工作方式。 ListView由ListView项组成,ListView项可以由子项组成(只有当ListView的ViewStyle设置为“Report”时才显示子项)。

    使用正在使用的方法添加ListViewItem时,仅定义ListViewItem的“标题”。 这意味着,您必须使用另一个add方法的重载,即将ListViewItem对象作为参数的方法。 然后,您可以这样做:

    ListViewItem item = new ListViewItem();
    item.Text = "bar";
    item.SubItems.Add ("foo");
    item.SubItems.Add ("foo2");
    myListView.Items.Add (item);
    

    关于只向列表中添加一个项目的问题: -您只添加了一个项目…更具体地说,是添加集合本身,而不是为集合中的每个对象创建ListViewItem。

    所以你要做的是:

    • 迭代您的列表(使用foreach(意味着您必须在集合类上实现IEnumerable),或者使用for循环(但您必须确保可以使用索引器访问集合的内容,例如)
    • 为列表中存在的每个对象创建ListViewItem。

    不过,我想知道为什么您首先创建了自己的自定义用户集合。我看到您已经实现了一些特定的功能,但是……我认为有更好的解决办法。 但是,您应该实现IEnumerable接口、IList接口等…为了那个班。通过这样做,您的类将成为一个“真正的集合”,然后您可以像处理任何其他集合类一样处理它。(使用foreach迭代,或使用for循环等。)

        2
  •  0
  •   Kiquenet user385990    10 年前

    结合Frederik Gheysel的回答,实施 迭代器 也。在执行此操作时,请记住重写Equals、GetHashCode和ToString。