问题 问题理解类和列表。

状态
不接受进一步答复。

莫里

成员
已加入
2017年2月21日
留言内容
10
编程经验
Beginner
嗨,大家好!

我一直在类中使用Lists作为属性,但现在有点封闭。我想创建一个程序,在其中列出一个人和他们喜欢的电影。

<无法读取的代码已删除>

现在,使用上面的代码,我试图创建一个集合,在该集合中,我有一个用户使用多部电影,并且这样做了,因此,如果我从“用户”列表中选择一个用户,则可以单击该按钮,它将移动电影中的所有电影。在用户列表中列出该用户。

问题是我无法保留电影列表以将它们显示在另一个列表中,我尝试了很多事情,但是没有用。所以现在当klick我得到最后保存的值时,我真的不能从列表中指定任何内容,例如他自己的电影的不同用法等。

所以请任何人告诉我我应该使用什么,或者甚至在互联网上搜索,因为我似乎无法搜索正确的术语或正确的东西,还有更多问题 :欢乐:。

1.如果我使用组合框显示用户,他们是否仍附加有电影?
2.我怎样才能将项目从列表框电影放到列表中,但当时只有一个项目,我已经尝试过IF,Foreach并且它们不起作用。

谢谢您的帮助!
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,524
地点
悉尼,澳大利亚
编程经验
10+
正如JB所说,您的代码很难阅读,因为它是使用错误的格式标记发布的。不用看代码,我可以告诉您,您的类型应如下所示:
public class Movie
{
    // ...
}

public class User
{
    // ...

    private List<Movie> _movies = new List<Movie>();

    public List<Movie> Movies
    {
        get
        {
            return _movies;
        }
    }
}

或者,在最新版本中,如下所示:
public class Movie
{
    // ...
}

public class User
{
    // ...

    public List<Movie> Movies { get; } = new List<Movie>();
}

每个User对象都有一个属性,该属性是一个List<Movie>。如果确实要为“电影”列表使用单独的类型,则可以定义属于列表的类型,而不是具有列表的类型:
public class Movie
{
    // ...
}

public class MovieCollection : System.Collections.ObjectModel.Collection<Movie>
{
    // ...
}

public class User
{
    // ...

    public MovieCollection Movies { get; } = new MovieCollection();
}
微软的指南建议这样做是如果您要创建一个公共API,即供其他方使用的库,但如果所有库都在同一个项目中则不要这样做。
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,524
地点
悉尼,澳大利亚
编程经验
10+
我删除了您最近的帖子,因为它显然不可读,因此您甚至不应该提交。您只是从第1个帖子中复制并粘贴了格式错误的代码吗?从第3个帖子中可以看到,如果您从IDE将代码复制为纯文本并将其粘贴到适当的标签中,则它将变得非常可读。
 

莫里

成员
已加入
2017年2月21日
留言内容
10
编程经验
Beginner
我删除了您最近的帖子,因为它显然不可读,因此您甚至不应该提交。您只是从第1个帖子中复制并粘贴了格式错误的代码吗?从第3个帖子中可以看到,如果您从IDE将代码复制为纯文本并将其粘贴到适当的标签中,则它将变得非常可读。

哦,对不起,这似乎对我没有用。我将尝试尽快发布更清晰的代码。
 

莫里

成员
已加入
2017年2月21日
留言内容
10
编程经验
Beginner
The problem iam getting is that when i save the info about the Users in a list then attach the Items of the listbox(Movies) to that user, when i want to retrive the data, it will show the info about the last User only, so 它不断互相覆盖.
 

莫里

成员
已加入
2017年2月21日
留言内容
10
编程经验
Beginner
我怎么能一次将一个项目从列表框中移到列表中,因为foram因为我正在谈论所有项目而无法正常工作? :)
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,524
地点
悉尼,澳大利亚
编程经验
10+
The problem iam getting is that when i save the info about the Users in a list then attach the Items of the listbox(Movies) to that user, when i want to retrive the data, it will show the info about the last User only, so 它不断互相覆盖.

我不知道你的意思首先适当地设计类型,然后执行您认为需要的操作,如果不起作用,请发回邮件并向我们展示您的操作,并准确告诉我们发生了什么以及与您的期望有何不同。说像"它不断互相覆盖"没有帮助,因为我们不知道什么"it"是。如果您做对了,那么它将起作用,因此您必须做错了。如果我们看不到您在做什么,那么我们就看不到这是怎么回事。
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,524
地点
悉尼,澳大利亚
编程经验
10+
我怎么能一次将一个项目从列表框中移到列表中,因为foram因为我正在谈论所有项目而无法正常工作? :)
“ foreach”是C#中唯一的循环类型吗?
 

莫里

成员
已加入
2017年2月21日
留言内容
10
编程经验
Beginner
我也尝试过for循环,没有用,或者我没有正确设置。顺便说一句,我不能用Quote进行回复,因为仅出于此原因我不能使用空间,仅在此Reply to thread中。
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,524
地点
悉尼,澳大利亚
编程经验
10+
我也尝试过for循环,没有用,或者我没有正确设置。

然后,也许要做的就是向我们展示您所做的事情,并告诉我们发生了什么。就是说,您认为通过了吗? for循环通常通过从列表中的第一个索引循环到最后一个索引来工作。但是,如果要删除项目,则列表中的最后一个索引每次将减少1。这意味着您将在循环中途开始击中无效索引。您如何看待如何改变循环来缓解这种情况?
 

莫里

成员
已加入
2017年2月21日
留言内容
10
编程经验
Beginner
然后,也许要做的就是向我们展示您所做的事情,并告诉我们发生了什么。就是说,您认为通过了吗? for循环通常通过从列表中的第一个索引循环到最后一个索引来工作。但是,如果要删除项目,则列表中的最后一个索引每次将减少1。这意味着您将在循环中途开始击中无效索引。您如何看待如何改变循环来缓解这种情况?
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Fotboll
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        int Antalspelare = 0;
        List<Player>  playerlist = new List<Player>();
        List<Match> matchlist = new List<Match>();
        List<Team> teamlist = new List<Team>();
        Team chosenteam = new Team();

        private void btnAddplayer_Click(object sender, EventArgs e)
        {
            // Add players and display them in the listbox
            Player playerinfo = new Player();
            playerinfo.Firstname = txtboxF?rnamn.Text;
            playerinfo.Surname = txtboxEfternamn.Text;
            playerinfo.Number = int.Parse(txtboxNummer.Text);
            if (Antalspelare < 25)
            {
                Antalspelare++;
                playerlist.Add(playerinfo);
            }
            else
            {
                MessageBox.Show(" You can't put more players! ");
            }

            listboxPlayer.DataSource = null;
            listboxPlayer.DataSource = playerlist;
        }

        private void btnAddteam_Click(object sender, EventArgs e)
        {
            // Add a team and display it into the listbox
            Team teamname = new Team();            
            teamname.Name = txtboxTeam.Text;
            teamlist.Add(teamname);

            listboxTeam.DataSource = teamlist;
            txtboxTeam.Clear();
        }

        private void btnOk_Click(object sender, EventArgs e)
        {
            //Create a match and display it in the listbox
            Match matchsetup = new Match();

           matchsetup.Hometeam = comboHometeam.Text;
           matchsetup.Foreignteam = comboForeignteam.Text;
           matchsetup.Date = timepickerMatch.Value.ToString();

            listboxHometeam.Items.Add(matchsetup.Hometeam);
            listboxForeignteam.Items.Add(matchsetup.Foreignteam);

            matchlist.Add(matchsetup);
            listboxMatch.DataSource = null;
            listboxMatch.DataSource = matchlist;
        }

        private void btnPlayertoteam_Click_1(object sender, EventArgs e)
        {
            //Add players to a team
            Antalspelare = 0;
            chosenteam = (Team)listboxTeam.SelectedItem;
            chosenteam.Name = listboxTeam.SelectedItem.ToString();

            foreach (Player item in listboxPlayer.Items)
            {
                chosenteam.Playerteam.Add(item);
            }

            comboForeignteam.Items.Add(chosenteam.Name);
            comboHometeam.Items.Add(chosenteam.Name);

            playerlist.Clear();

            listboxPlayer.DataSource = null;
        }

        private void btnHometeam_Click(object sender, EventArgs e)
        {
        }

        private void btnForeignteam_Click(object sender, EventArgs e)
        {
        }
    }
}
 

莫里

成员
已加入
2017年2月21日
留言内容
10
编程经验
Beginner
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Fotboll
{
    public class Player 
    {
        public int Warning { get; set; }
        public string Surname { get; set; }
        public string Firstname { get; set; }
        public int Number { get; set; }

        public Player()
        {
        }
        
        public override string ToString()
        {
            return Firstname + " " + Surname + " " + Number;
        }
    }
}
 

莫里

成员
已加入
2017年2月21日
留言内容
10
编程经验
Beginner
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Fotboll
{
    public class Player 
    {
        public int Warning { get; set; }
        public string Surname { get; set; }
        public string Firstname { get; set; }
        public int Number { get; set; }

        public Player()
        {
        }

        public override string ToString()
        {
            return Firstname + " " + Surname + " " + Number;
        }
    }
}
 
Last edited:

莫里

成员
已加入
2017年2月21日
留言内容
10
编程经验
Beginner
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Fotboll
{
    public class Match 
    {
        public string Date { get; set; }
        public int Stadium { get; set; }
        public string Hometeam { get; set; }
        public string Foreignteam { get; set; }

        public override string ToString()
        {
            return Hometeam + " - " + Foreignteam + Environment.NewLine + "  "+Date;
        }
    }
}
 

莫里

成员
已加入
2017年2月21日
留言内容
10
编程经验
Beginner
因此,这就是我当前的代码,我张贴了表格和类,我使用了电影示例,因为我必须将所有名称都更改为英语,最后我才将其张贴在此处,但是概念是相同的。

我想创建一个程序,其中我有两个列表,一个列表用于团队,另一个列表用于玩家,然后我希望能够将那些玩家保存到一个团队中,以便在创建比赛时,我可以从中获取所有玩家该团队进入列表框。

所以设置看起来像这样
捕获.png


在左侧,您具有团队和球员列表框,在右侧,您具有比赛列表框和我要用来在这些列表框之间移动球员的四个列表框,例如,ListboxHometeam将有25个球员,那么我只能移动11个他们到Hometeam2旁边的列表框中。

我对这个版本有很多问题。

1.当我在组合框之一(主队或外援队)中选择某个球队时,我不知道如何使程序向我显示特定球队的球员。

2.我不能只在不同列表之间移动一个项目,也不能在列表和列表框之间移动,因为我正在使用数据源,但是我尝试了其他方法,它们使工作变得更加困难,或者弄乱了整个程序。

3.我想添加一个保存选项来保存比赛,这样,当我关闭程序时,所有内容都会保存到一个文件中,因此当我再次打开它时,我可以看到比赛,从而能够与玩家等重新开始比赛。我想我知道如何保存到文件,但我只是想将此添加为en额外的细节。


希望这次我能给您足够的信息,这样我可能会从您那里得到一些想法或反馈!

谢谢!
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,524
地点
悉尼,澳大利亚
编程经验
10+
我们不会在这一线程中解决世界上的所有问题。请关注。请将每个主题归为一个主题,将每个主题归为一个主题。在此线程中,请就一个特定的问题寻求帮助,并仅发布与该问题相关的代码,并且请不要在代码中包含成堆的空白,因为这只会增加阅读难度。
 
已加入
2011年4月23日
留言内容
177
地点
密歇根州兰辛;美国
编程经验
10+
@金西尼
您应该向上滚动,看看我为什么张贴您所说的内容"世界问题",到目前为止,从dame论坛上一无所获,他们要求我发布我的代码以及我的问题,并准确描述我希望使用dame程序,但是您知道它到底是什么...


顺便说一句,您真的需要努力处理自己的态度,这些人不是来这里寻求帮助的,而这个论坛不是最好的,也不是唯一的,所以对像我这样的新手要友好一点,他们只是想学习如何###### 程序。
让我们退后一步,分析代码中的所有情况,首先,您发布有关将电影添加到一个人的收藏中的信息,但是发布的所有代码都与运动队和拥有运动员有关,基本上是相同的作为一个拥有电影的人的事情,但是像这样切换上下文是一件令人困惑的事情。
但是回到代码,我看到了您在哪里创建新的"teams"并将其添加到teams集合中,但是我看不到要向团队中添加球员的任何地方,但是您正在创建一个球员并将其添加到Players集合中,但是代码中没有团队分配。这让我们试图退后一步,弄清楚您的代码真正发生了什么,这一切都很令人困惑,这可能就是jmc变得有些混乱的原因。

因此,我要做的是退后一步,甚至不考虑Form(所有ListBoxes和所有内容都在其中),而是考虑类以及每个类与其他类之间的关系。我将从ya的团队和球员开始,您可能需要两个类别,一个至少具有以下属性的球员:名字和姓氏。然后,您将需要一个有关团队信息的类,其中包含一个团队名称,也许他们来自哪个国家/地区以及一个球员集合[清单<Player>()],那么主要的代表将只是一个球队列表[List<Team>()],并且在ComboBox(或ListBox)中选择了一支球队时,它将通过循环玩家集合在标签中显示名称,并在ComboBox或ListBox中显示玩家列表,当您添加新玩家时,要先选择一个团队,您就不需要表单上的球员列表,因为每个团队都可以使用该列表。
然后,您可以在所有内容之上添加比赛项目,在那里您至少有两个已建立的团队,什么都没有。

从概念上讲,这一切有意义吗?
 
已加入
2011年4月23日
留言内容
177
地点
密歇根州兰辛;美国
编程经验
10+
让我们退后一步,分析代码中的所有情况,首先,您发布有关将电影添加到一个人的收藏中的信息,但是发布的所有代码都与运动队和拥有运动员有关,基本上是相同的作为一个拥有电影的人的事情,但是像这样切换上下文是一件令人困惑的事情。
但是回到代码,我看到了您在哪里创建新的"teams"并将其添加到teams集合中,但是我看不到要向团队中添加球员的任何地方,但是您正在创建一个球员并将其添加到Players集合中,但是代码中没有团队分配。这让我们试图退后一步,弄清楚您的代码真正发生了什么,这一切都很令人困惑,这可能就是jmc变得有些混乱的原因。

因此,我要做的是退后一步,甚至不考虑Form(所有ListBoxes和所有内容都在其中),而是考虑类以及每个类与其他类之间的关系。我将从ya的团队和球员开始,您可能需要两个类别,一个至少具有以下属性的球员:名字和姓氏。然后,您将需要一个有关团队信息的类,其中包含一个团队名称,也许他们来自哪个国家/地区以及一个球员集合[清单<Player>()],那么主要的代表将只是一个球队列表[List<Team>()],并且在ComboBox(或ListBox)中选择了一支球队时,它将通过循环玩家集合在标签中显示名称,并在ComboBox或ListBox中显示玩家列表,当您添加新玩家时,要先选择一个团队,您就不需要表单上的球员列表,因为每个团队都可以使用该列表。
然后,您可以在所有内容之上添加比赛项目,在那里您至少有两个已建立的团队,什么都没有。

从概念上讲,这一切有意义吗?
另外,我创建了一个示例项目,显示了我上面所说的内容。
 

附件

  • FotbollExample.zip
    26.4 KB · Views: 37
状态
不接受进一步答复。
最佳 底部