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