此应用程序会提示您打开文件夹。然后,应用程序查看文件夹中的所有文件,并为每个(.wav)文件生成一个按钮。我的意图是按下按钮时播放(.wav)文件。
因为它是我动态创建按钮。我使用button.Tag
发送按钮编号,但我希望发送另一个保存wav文件完整路径的对象。我有伪添加它但是,我知道你不能像我一样添加两个button.Tag
。所以我的问题是如何实现这一点。
public partial class Form1 : Form
{
public SoundPlayer Sound1;
public static int btnCount = 0;
public Form1()
{
InitializeComponent();
SetFolderPath();
}
private void Form1_Load(object sender, EventArgs e)
{
}
public void addDynamicButton(string folder, string fileName)
{
btnCount++;
string soundfilepath = folder + "\\" + fileName + ".wav";
Button button = new Button();
button.Location = new Point(20, 30 * btnCount + 10);
button.Size = new Size(300, 23);
button.Text = fileName;
button.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
button.UseVisualStyleBackColor = true;
button.Click += new EventHandler(btnDynClickEvent);
button.Tag = btnCount;
button.Tag = soundfilepath;
this.Controls.Add(button);
}
void btnDynClickEvent(object sender, EventArgs e)
{
Button button = sender as Button;
if (button != null)
{
switch ((int)button.Tag)
{
case 1:
Sound1 = new SoundPlayer((string)button.Tag);
Sound1.Play();
break;
}
}
}
public void SetFolderPath()
{
FolderBrowserDialog folder = new FolderBrowserDialog();
folder.Description = "Select the sound file Folder";
if (textBox1.Text.Length > 2)
{
folder.SelectedPath = textBox1.Text;
}
else
{
folder.SelectedPath = @"C:\";
}
if (folder.ShowDialog() == DialogResult.OK)
{
textBox1.Text = folder.SelectedPath;
string[] files = Directory.GetFiles(folder.SelectedPath, "*.wav", SearchOption.AllDirectories);
int count = files.Length;
richTextBox1.Text = count.ToString() + " Files Found";
foreach (string file in files)
{
string fileName = Path.GetFileNameWithoutExtension(file);
addDynamicButton(folder.SelectedPath, fileName);
}
}
}
private void btnOpenFolder(object sender, EventArgs e)
{
SetFolderPath();
}
}
答案 0 :(得分:3)
我建议将一个专门的对象存储在Tag
属性中:
class WaveDetailTag {
public FileInfo WaveFile {get; set;}
public int ButtonId {get; set;}
}
实现:
// ...
button.Tag = new WaveDetailTag() {
WaveFile = new FileInfo(soundfilepath),
ButtonId = btnCount
};
// ...
<强>更新强>
在switch-case
中使用:
Button button = sender as Button;
if (button != null)
{
var waveDetail = (WaveDetailTag)button.Tag;
switch (waveDetail.ButtonId)
{
case 1:
Sound1 = new SoundPlayer(waveDetail.WaveFile.FullName);
Sound1.Play();
break;
}
}
答案 1 :(得分:1)
你应该设置像
这样的标签button.Tag= new {Count = btnCount, FileName=soundFfilepath);//anonymouse type
当您想要检索价值时,您可以使用动态
int count=((dynamic)button.Tag).Count;
string filename=((dynamic)button.Tag).FileName;
或
int count=(int) button.Tag.GetType().GetProperty("Count").GetValue(obj, null);
string filename= button.Tag.GetType().GetProperty("FileName").GetValue(obj, null).ToString();
<小时/> 您还可以为第二个解决方案
创建一个新方法
object GetValueByProperty(object obj,string propName)
{
return obj.GetType().GetProperty(propName).GetValue(obj, null);
}
只需使用
即可致电int count=(int) GetValueByProperty(button.Tag,"Count");
string filename=GetValueByProperty(button.Tag,"FileName");.ToString();
答案 2 :(得分:0)
多个标签不太可能,但您可以使用List
(List<object>
或List<MyType>
)或数组作为Tag
。
您还可以创建自己的类以包含所有想要的信息,这将是更可取的:
class MyTagInfo
{
public int Num;
public string Text;
public bool SomeMoreInfo;
}
用法:
myControl.Tag = new MyTagInfo { Num = 0, Text = "Hello World!" };
答案 3 :(得分:0)
您可以将List存储到Tag属性中,该属性允许您在其中存储多个对象。
button.Tag = new List<object>();
(List<object> button.Tag).Add(btnCount);
(List<object> button.Tag).Add(soundfilepath);
答案 4 :(得分:0)
使用自定义类并将其存储在Tag
属性中,例如:
public class WaveButton
{
public int Number { get; set; }
public string WaveFilePath { get; set; }
}
.....
button.Tag = new WaveButton() { Number = n, WaveFilePath = path }
答案 5 :(得分:0)
我知道它太晚了,但我想出了一个简单的方法。
只需加入b''
b''
b'001304'
b''
b''
b'001304'
等字符串
在使用它之前,只需将它分成两个字符串,如下所示
string join = String.join(","firstString,secondString);
button.Tag = join;
并根据需要使用字符串标题和字符串链接。 (Y) 我不知道这是不是一个好习惯,但我正在使用它,它工作得很完美。
我是c#的新手。