C#用户控制按钮单击可将项目从表单1添加到列表框

C#用户控制按钮单击可将项目从表单1添加到列表框,c#,visual-studio,C#,Visual Studio,我正在开发一个C#应用程序,在youtube上搜索歌曲名称(使用youtube api)并显示数据,我有一个自定义歌曲项(UserControl),并将它们添加到FlowLayoutControl。我在UserControl中添加了一个“Favorite”按钮,我需要它将自己添加到另一个FlowLayoutControl中,这是我最喜欢的歌曲列表,但我无法实现,UserControl中不能有多个基类,而在Form1中添加一个公共方法并不能解决我的问题(它没有添加任何内容,用listbox尝试过,

我正在开发一个C#应用程序,在youtube上搜索歌曲名称(使用youtube api)并显示数据,我有一个自定义歌曲项(UserControl),并将它们添加到FlowLayoutControl。我在UserControl中添加了一个“Favorite”按钮,我需要它将自己添加到另一个FlowLayoutControl中,这是我最喜欢的歌曲列表,但我无法实现,UserControl中不能有多个基类,而在Form1中添加一个公共方法并不能解决我的问题(它没有添加任何内容,用listbox尝试过,但什么都没有)。 我真的被困在这里了,如果有人能提出一些建议,我会非常感激的

这是我的歌曲

[Serializable]
public partial class SongItem : UserControl,Form
{
    private String songName = "Song Name";
    private String artistName = "Artist Name";
    private Image thumbNail;
    private String length;
    private int maxLengthSongName = 25;
    private int maxLengthArtistName = 25;
    private Color colorHoverOn = Color.FromArgb(53,53,53);
    private Color colorNormal = Color.FromArgb(53,53,53);
    private SongData songData;
    public SongItem()
    {
        InitializeComponent();
        this.MouseClick += Control_MouseClick;
        MouseEvents(this);
    }
    private void SongItem_Load(object sender, EventArgs e)
    {
        try
        {
            LoadData();
        }
        catch { }
        LoadDataToUI();

    }

    #region GettersAndSetters

    public int MaxLengthSongName
    {
        get { return maxLengthSongName; }
        set { maxLengthSongName = value; }
    }
    public int MaxLengthArtistName
    {
        get { return maxLengthArtistName; }
        set { maxLengthArtistName = value; }
    }

    public Color ColorHoverOn
    {
        get { return colorHoverOn; }
        set { colorHoverOn = value; }
    }
    public Color ColorNormal
    {
        get { return colorNormal; }
        set { colorNormal = value; }
    }

    public SongData SongData {
        get{return songData; }
        set { songData = value; } 
    }
    #endregion

    public void LoadData()
    {
        songName = songData.SongName;
        artistName = songData.ArtistName;
        thumbNail = songData.ThumbNail;
        length = songData.Length;
    }

    void MouseEvents(Control container)
    {
        foreach (Control c in container.Controls)
        {
            c.MouseEnter += (s, e) => SongItem_MouseEnter(e);
            c.MouseLeave += (s, e) => SongItem_MouseLeave(e);
            c.MouseClick += Control_MouseClick;
            MouseEvents(c);
        };
    }


    private void SongNameLbl_MouseHover(object sender, EventArgs e)
    {
        if (songName.Length > maxLengthSongName) {
            toolTip1.SetToolTip(songNameLbl, songName);
        }
    }

    private void ArtistNameLbl_MouseHover(object sender, EventArgs e)
    {
        if (artistName.Length > maxLengthArtistName) {
            toolTip1.SetToolTip(artistNameLbl, artistName);
        }
    }

    private void SongNameLbl_Click(object sender, EventArgs e)
    {
        Clipboard.SetText(artistName + " " +songName);
    }

    #endregion

    #region CurrentlySelected
    public event EventHandler<EventArgs> WasClicked;

    private void Control_MouseClick(object sender, MouseEventArgs e)
    {
        var wasClicked = WasClicked;
        if (wasClicked != null)
        {
            WasClicked(this, EventArgs.Empty);
        }
        IsSelected = true;
    }

    private bool _isSelected;
    public bool IsSelected
    {
        get { return _isSelected; }
        set
        {
            _isSelected = value;
            this.BorderStyle = IsSelected ? BorderStyle.FixedSingle : BorderStyle.None;
        }
    }
    #endregion


    private void Fovourite_Click(object sender, EventArgs e)
    {
        Main newMain = new Main();
       // newMain.AddSongToFavorite();
        newMain.listBox1.Items.Add("Test");
    }
}
消息显示,但没有其他内容

我从另一个类添加了SongItem

 public partial class SongList : FlowLayoutPanel
{
    public SongList()
    {
        InitializeComponent();
        SongList_Load();
    }

    private void SongList_Load()
    {
        this.AutoScroll = true;
        this.FlowDirection = FlowDirection.TopDown;
        this.AutoSize = false;
        this.WrapContents = false;
    }

    public async void AddSong(String songName) {
        SongData song = await YoutubeSearch.GetSongInfo(songName);
       // SongData song = XmlSerialization.ReadFromXmlFile<SongData>(Application.StartupPath + @"\test.txt");
        SongItem songItem = new SongItem { SongData = song };
        songItem.WasClicked += UsersGrid_WasClicked;
        this.Controls.Add(songItem);
    }
公共部分类歌曲列表:FlowLayoutPanel
{
公共歌曲列表()
{
初始化组件();
歌曲列表_Load();
}
私有void歌曲列表_Load()
{
this.AutoScroll=true;
this.FlowDirection=FlowDirection.TopDown;
this.AutoSize=false;
this.WrapContents=false;
}
公共异步void AddSong(字符串songName){
SongData song=wait YoutubeSearch.GetSongInfo(songName);
//SongData song=XmlSerialization.ReadFromXmlFile(Application.StartupPath+@“\test.txt”);
SongItem SongItem=new SongItem{SongData=song};
songItem.WasClicked+=UsersGrid\u WasClicked;
this.Controls.Add(songItem);
}

我通过创建EventHandler解决了这个问题

总的来说,我创造了这个公共空间

public void FavoriteWasClicked(object sender, EventArgs e) {
        if (sender is SongItem)
        {
            songList2.AddSong(((SongItem)sender).SongData);
        }
    }
在我添加的Form1加载上(songList1是Form1设计器中已经添加的FlowLayoutPanel)

我将这一行添加到我创建的FlowLayoutPanel类中

 public event EventHandler<EventArgs> List_FavoriteWasClicked;
现在在SongItem上,我创建了自定义事件

public event EventHandler<EventArgs> FavoriteWasClicked;

现在,当我按下按钮将一首歌曲添加到喜欢/喜欢的列表时,它实际上正在添加它。

您如何在Form1中安装SongItem?另外,您如何传递试图传递listbox1之类的UI对象?使用提供的代码,您似乎正在创建一个新的单独表单。我编辑了问题,我不想创建另一个表单,是吗我只是在Google上搜索如何编辑其他表单中的元素,但这是一条死胡同。
 public event EventHandler<EventArgs> List_FavoriteWasClicked;
 public void AddSong(SongData song)
    {
        SongItem songItem = new SongItem { SongData = song };
        songItem.FavoriteWasClicked += List_FavoriteWasClicked; ()
        this.Controls.Add(songItem);
    }
public event EventHandler<EventArgs> FavoriteWasClicked;
 FavoriteWasClicked(this, EventArgs.Empty);