2016-03-24 12 views
0

ListViewからアイテムを選択し、ボタンを押してアイテムを削除することでアイテムをリストから削除したいと考えています。このボタンは、実際のリストとリストビューの両方から削除します。私が現在持っているものは、リストビューから項目を削除しますが、実際のムービーリストリストからムービーオブジェクトを削除しません。 ListはMovieRentalSys(movieSystem.movi​​eList)と呼ばれる別のクラスにあります。 WinFormsの使用。実際のリストから選択したListViewアイテムを削除する

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 
    } 
} 

誰かがこの方法で、特にこのボタンで呼び出すことができるメソッドでこれを行う方法を知っていますか?

+2

リストにバインドされたDataGridViewを無限に簡単に使用できます。 – Plutonix

答えて

1

ここでは多くのことが起こっています。まず、あなたのMovieRentalSysメソッドがリストを返すのはあまり意味がありません。代わりに、AddMovieは、作成されたMovieオブジェクトを返す必要があります。あなたがListViewItemを作成するときに

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

さて、あなたは最後に、あなたが戻って正しい型にキャスト、タグから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 
    } 

    ... 
} 

フォームで同じアプローチをとることができますが、ムービー自体ではなくタグにムービー名のみを保存することができます。

+0

これはうまくいった。ありがとうございました。おそらくプログラムの後半に来ると思いますので、代わりに辞書を使って調べてみましょう。 –

関連する問題