【问题标题】:Create list with contains method groups and execute this list创建包含方法组的列表并执行此列表
【发布时间】:2017-03-24 13:01:20
【问题描述】:

为了更好地解释这里是一个 GUI 屏幕截图:

(不能添加小图只链接) Screen GIU <<

这是我所有的 cmets 代码:

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;
using System.Media; // to play sounds


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

            //List View
            listView1.View = View.Details;
            listView1.FullRowSelect = true;

            // Columns CONSTRUCT
            listView1.Columns.Add("ID", 70);
            listView1.Columns.Add("Music name", 150);

            //combobox  items
            comboBox1.Items.Add("Music 1");
            comboBox1.Items.Add("Music 2");
            comboBox1.Items.Add("Music 3");
            comboBox1.Items.Add("Music 4");
            comboBox1.Items.Add("Music 5");
        }

        // ADD TO List VIEW
        private void add(int ID, string name_music)
        {
            string[] row = { Convert.ToString(ID), name_music };

            ListViewItem item = new ListViewItem(row);

            listView1.Items.Add(item);
        }

        //button to delete selected items in list view
        private void button_delete_selected_music_Click(object sender, EventArgs e)
        {
            try
            {
                listView1.SelectedItems[0].Remove();
            }
            catch { }

        }
**//EDITED :**
        // buttton to add music to list view
        int i = 0;
        private void button_add_music_Click(object sender, EventArgs e)
        {

        if (comboBox1.SelectedIndex==0)
        {
            dictOfDelegate.Add("Music 1", playmusic1);
            add(i, comboBox1.Text);
        }
        if (comboBox1.SelectedIndex == 1)
        {
            dictOfDelegate.Add("Music 2", playmusic2);
            add(i, comboBox1.Text);
        }
        if (comboBox1.SelectedIndex == 2)
        {
            dictOfDelegate.Add("Music 3", playmusic3);
            add(i, comboBox1.Text);
        }
        if (comboBox1.SelectedIndex == 3)
        {
            dictOfDelegate.Add("Music 4", playmusic4);
            add(i, comboBox1.Text);
        }
        if (comboBox1.SelectedIndex == 4)
        {
            dictOfDelegate.Add("Music 5", playmusic5);
            add(i, comboBox1.Text);
        }

        }

        // button to start music
        private void button_start_music(object sender, EventArgs e)
        {

        }


        // Voids with music :
        public void playmusic1()
        {

            SoundPlayer audio = new SoundPlayer(Music_PLayer.Properties.Resources.playsound1);
            audio.Play();
        }
        public void playmusic2()
        {
            SoundPlayer audio = new SoundPlayer(Music_PLayer.Properties.Resources.playsound2);
            audio.Play();
        }
        public void playmusic3()
        {
            SoundPlayer audio = new SoundPlayer(Music_PLayer.Properties.Resources.playsound3);
            audio.Play();

        }
            public void playmusic4()
            {
                SoundPlayer audio = new SoundPlayer(Music_PLayer.Properties.Resources.playsound4);
                audio.Play();
            }
            public void playmusic5()
            {
                SoundPlayer audio = new SoundPlayer(Music_PLayer.Properties.Resources.playsound5);
                audio.Play();
            }
                public delegate void PlayMusic();
// EDITED 
        Dictionary<string, PlayMusic> dictOfDelegate = new Dictionary<string, PlayMusic>();

        void CreateList()
        {
        dictOfDelegate.Add("Music 1", playmusic1);
        dictOfDelegate.Add("Music 2", playmusic2);
        dictOfDelegate.Add("Music 3", playmusic3);
        dictOfDelegate.Add("Music 4", playmusic4);
        dictOfDelegate.Add("Music 5", playmusic5);
        }

    void InvokeMethod(string item)
    {
        PlayMusic method = dictOfDelegate.First(x => x.Key == item).Value;

        method.Invoke();
    }
    }
}

我想从组合框中选择一首歌曲,将其添加到播放列表中,单击“开始音乐”按钮后将播放列表从上到下播放..

当您单击“将音乐添加到列表”按钮时,我想将组合框中的选定歌曲添加到列表视图。当然,通过“删除选定的音乐”按钮,我可以从列表中删除一首歌曲。

所以我必须这样做,例如,当我从组合框 (Music1) 中选择时单击按钮(将音乐添加到列表),它将显示 ID 1 音乐名称 Music 1,当单击开始音乐按钮时,它将显示执行 void playmusic1();

我知道我只是将文本从组合框添加到列表视图,但我不知道如何在那里获取方法...

我真的不知道如何编写“开始音乐”按钮(我在考虑队列)来用我的 listView1 一个一个地播放音乐。

我只需要收集或其他东西或队列。

主要问题是如何创建一个包含方法组的列表,然后执行所有此列表(如您所见,我希望有可能删除此列表中的选定元素)

如果我不解释清楚就问..

编辑...

我认为最好的解决方案是这段代码:

 public  List<Action> musiclist = new   List<Action>();

  // buttton to add music to list view
        int i = 0;
        private void button_add_music_Click(object sender, EventArgs e)
        {

            if (comboBox1.SelectedIndex==0)
            {

                musiclist.Add(playmusic1);
                add(i, comboBox1.Text);
            }
            if (comboBox1.SelectedIndex == 1)
            {
                musiclist.Add(playmusic2);
                add(i, comboBox1.Text);

            }
            if (comboBox1.SelectedIndex == 2)
            {
                musiclist.Add(playmusic3);
                add(i, comboBox1.Text);
            }
            if (comboBox1.SelectedIndex == 3)
            {
                musiclist.Add(playmusic4);
                add(i, comboBox1.Text);
            }
            if (comboBox1.SelectedIndex == 4)
            {
                musiclist.Add(playmusic5);
                add(i, comboBox1.Text);
            }
        }
   private void button_to_Start_music_Click(object sender, EventArgs e)
    {
        foreach (Action func in musiclist)
        {
            func();
        }

    }

【问题讨论】:

  • 你不需要排队方法调用,一个Queue的声音ID就足够了

标签: c# list methods


【解决方案1】:

在我看来这不是最好的方法,无论如何你可以在字典中使用委托。

public delegate void PlayMusic();

Dictionary<string, PlayMusic> dictOfDelegate = new Dictionary<string, PlayMusic>();

void CreateList()
{        
    dictOfDelegate.Add("Music 1", playmusic1);
    dictOfDelegate.Add("Music 2", playmusic2);
    ...
}

void InvokeMethod(string item)
{
    PlayMusic method = dictOfDelegate.First(x => x.Key == item).Value;

    method.Invoke();
}

【讨论】:

  • 感谢您的帮助,我已将您的代码添加到主代码中,请看第一篇文章。无论如何,你能检查一下我做对了吗?我编辑了我的 button_add_music 请也看一下。当我添加例如:音乐 1 和音乐 1 时,我遇到了麻烦,它显示了一个错误,无法将 2 相同的音乐添加到我的列表中。第二个问题是我应该如何正确编写我的 button_start_music 。你能帮一点忙吗?还是谢谢你。
  • 不要使用 Linq First 方法从字典中获取委托。请改用PlayMusic method = dictOfDelegate[item];
【解决方案2】:

您可以制作一首班级歌曲和一个列表,您可以随时从中添加或删除内容。

    int queueSize = 0;
    int queueCurrent = 0;
    List<Song> toPlay = new List<Song>();
    class Manager
    {
        public void addSong(Song add)
        {
            toPlay.add(add);
            queueSize++;
        }
        public void removeSong(int remove)
        {
            toPlay.RemoveAt(remove)
            queueSize--;
        }
        public void playSong(int index)
        {
            Song play = toPlay[index]
            WMPLib.WindowsMediaPlayer songPlayer = new WMPLib.WindowsMediaPlayer();
            songPlayer.URL = play.FilePath;
            wplayer.Controls.Play();
        }
    }
    class Song
    {
        string FilePath;
        string Name;
        int Index;
        public Song(string name, int index)
        {
            Name = name;
            Index = index;
        }
    }

当然,这需要更多的代码,但这应该可以解决您的问题。如果您有任何问题或看到任何修改,请在 cmets 中告诉我。

编辑:OP 正在为每首歌曲寻找硬编码方式,所以就在这里。另外,我不建议其他寻求相同答案的人这样做。

    class Songs
    {
       public void songOne()
       {
           string name = "songOne";
           string path = "C:/songs/songone/
           playSong(path);
       }
       public void songOne()
       {
           string name = "songTwo";
           string path = "C:/songs/songtwo/
           playSong(path);
       }
       // And all the other songs
       public void playSong(string path)
       {
           WMPLib.WindowsMediaPlayer songPlayer = new WMPLib.WindowsMediaPlayer();
            songPlayer.URL = path;
            wplayer.Controls.Play();
       }
    }

【讨论】:

  • 是的,我可以按照你说的那样做,但我想通过方法做到这一点,所以每首歌都有自己的方法,就像我的例子一样。我想以这种方式而不是另一种方式这样做。你告诉我用一种方法播放歌曲。我只想通过这种方式做到这一点。您还有其他解决方案可以按照我的意愿进行操作吗?
  • 你为什么要给每首歌它自己的方法?这是一种标准的面向对象的做事方式。硬编码一切确保它会工作,但你失去了所有的灵活性。如果您正在寻找一种硬编码方式,我可以在答案中告诉您。
  • 我有另一个包含 20 个方法的程序。每种方法都有不同的一切等。这个程序的重点是像我在这个程序中所说的那样制作航点。我只需要你知道我该怎么做?
  • 我把歌曲硬编码进去了。
  • 查看主题已编辑。我只是创建一个新的方法列表。并且可以按歌曲设置每首歌曲。但是你知道我怎样才能删除一首歌吗?通过单击按钮从列表中删除我想删除这首歌。你知道我的意思。
猜你喜欢
  • 2021-10-28
  • 2019-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-29
  • 2015-01-06
  • 1970-01-01
相关资源
最近更新 更多