【问题标题】:Remove a selected ListView item from an actual List从实际列表中删除选定的 ListView 项
【发布时间】:2016-07-12 14:27:13
【问题描述】:

我希望能够通过从 ListView 中选择一个项目并点击一个按钮来删除它来从 List 中删除它。此按钮会将其从实际列表和列表视图中删除。我目前拥有的内容从 Listview 中删除了该项目,但没有从实际的 movieList 列表中删除 Movie 对象。该列表位于另一个名为 MovieRentalSys (movieSystem.movi​​eList) 的类中。使用 WinForms。

partial class MovieRentalSys
{
    public List<Movie> movieList;
    public List<Movie> reservedMovieList;
    Movie movie;

    public MovieRentalSys()
    {
        movieList = new List<Movie>();
        reservedMovieList = new List<Movie>();
    }

    //Will take movie form text as arguments to create new movie in list
    public List<Movie> AddMovie(string newMovie, string newGenre, string newActor, string newYear)
    {
        movie = new Movie(newMovie, newGenre, newActor, newYear);
        movieList.Add(movie);
        return movieList;
    }

    public List<Movie> DeleteMovie(Movie movie)
    {
        //needs to be made
    }

    public List<Movie> ReserveMovie(Movie movie)
    {
        movieList.Remove(movie);
        reservedMovieList.Add(movie);
        return reservedMovieList;
    }
}



public partial class frmMovie : Form
{
    MovieRentalSys movieSystem = new MovieRentalSys();


    public frmMovie()
    {
        InitializeComponent();
    }

    private void btnMovieBack_Click(object sender, EventArgs e)
    {
        this.Close();
    }

    private void btnAddMovie_Click(object sender, EventArgs e)
    {
        movieSystem.AddMovie(txtTitle.Text, txtGenre.Text, txtActor.Text, txtYear.Text);
        movieSystem.WriteMovieListToFile();
        ListViewItem movie = new ListViewItem(txtTitle.Text);
        movie.SubItems.Add(txtGenre.Text);
        movie.SubItems.Add(txtActor.Text);
        movie.SubItems.Add(txtYear.Text);
        lstMovies.Items.Add(movie);
    }

    private void btnDeleteMovie_Click(object sender, EventArgs e)
    {
        lstMovies.Items.Remove(lstMovies.Items[0]);
        //need method to remove movie from actual movieList
    }
}

有人知道如何使用方法,特别是可以在此按钮中调用的方法吗?

【问题讨论】:

  • 使用绑定到列表的 DataGridView 非常容易。

标签: c# winforms list listview


【解决方案1】:

所以,这里发生了很多事情。首先,您的MovieRentalSys 方法返回一个列表没有多大意义。相反,AddMovie 应该返回创建的 Movie 对象。

public Movie AddMovie(string newMovie, string newGenre, string newActor, string newYear)
{
    movie = new Movie(newMovie, newGenre, newActor, newYear);
    movieList.Add(movie);
    return movie;
}

现在,当您创建 ListViewItem 时,您可以将 Movie 引用存储在项目的 Tag

private void btnAddMovie_Click(object sender, EventArgs e)
{
    Movie movie = movieSystem.AddMovie(txtTitle.Text, txtGenre.Text, txtActor.Text, txtYear.Text);
    movieSystem.WriteMovieListToFile();
    ListViewItem movieItem = new ListViewItem(txtTitle.Text);
    movieItem.SubItems.Add(txtGenre.Text);
    movieItem.SubItems.Add(txtActor.Text);
    movieItem.SubItems.Add(txtYear.Text);
    movieItem.Tag = movie 
    lstMovies.Items.Add(movieItem);
}

最后,您可以从标签中检索Movie,将其转换回正确的类型,并将其传递给DeleteMovie

private void btnDeleteMovie_Click(object sender, EventArgs e)
{
    ListViewItem selectedItem = lstMovies.Items[0];
    lstMovies.Items.Remove(selectedItem);
    movieSystem.DeleteMovie((Movie)(selectedItem.Tag));
}

虽然以这种方式从列表中删除项目并不是很有效,因此您最好使用根据名称存储电影的字典。

partial class MovieRentalSys
{
    public Dictionary<string, Movie> movieList;

    ...

    //Will take movie form text as arguments to create new movie in list
    public Movie AddMovie(string newMovie, string newGenre, string newActor, string newYear)
    {
        movie = new Movie(newMovie, newGenre, newActor, newYear);
        movieList.Add(newMovie, movie);
        return movie;
    }

    public List<Movie> DeleteMovie(string movieName)
    {
        //needs to be made
    }

    ...
}

现在您可以在表单中采用相同的方法,但只在标签中存储电影名称而不是电影本身。

【讨论】:

  • 这很好用。谢谢你。我将改为使用字典检查,因为这可能会在程序的后面出现。
猜你喜欢
  • 2014-02-11
  • 2012-08-10
  • 2016-07-24
  • 2023-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多