2013-05-11 128 views
4

此应用程序提示您打开一个文件夹。该应用程序然后查看文件夹中的所有文件并为每个(.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(); 
    } 


} 
+1

声明一个类** ExtraButtonInfo **,它包含** all **每个按钮所需的额外信息,并将** ExtraButtonInfo **的实例分配给每个Button的Tag属性。 – 2013-05-11 15:55:41

回答

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; 
     } 
    } 
+0

+1更多关于如何做到这一点,请参阅我的评论(稍微)。 – 2013-05-11 15:56:26

+0

@IAbstract我将如何去在开关柜中使用它? – 2013-05-11 16:13:28

+0

非常感谢,这个作品很棒! – 2013-05-11 16:33:06

0

多个标签是不是真的有可能,但你可以使用一个ListList<object>List<MyType>)或数组作为Tag

你也可以创建自己的类包含所有想要的信息,这将是可取的:

class MyTagInfo 
{ 
    public int Num; 
    public string Text; 
    public bool SomeMoreInfo; 
} 

与用法:

myControl.Tag = new MyTagInfo { Num = 0, Text = "Hello World!" }; 
+0

感谢您的输入! – 2013-05-11 16:34:44

0

您可以将列表存储到标签属性,允许您在其中存储多个对象。

button.Tag = new List<object>(); 
(List<object> button.Tag).Add(btnCount); 
(List<object> button.Tag).Add(soundfilepath); 
+0

未知的方法或扩展名为'Add'的类型为'object'的'Tag',或类似的东西。您应该将'Tag'投射到'List '以便将其用作列表。 – SimpleVar 2013-05-11 15:56:17

+0

标记是一个“对象”,并且必须在添加任何东西之前进行投射 – IAbstract 2013-05-11 15:56:30

+0

感谢您的提示。 – 2013-05-11 15:57:18

0

使用自定义类并将其存储在Tag财产,是这样的:

public class WaveButton 
{ 
    public int Number { get; set; } 
    public string WaveFilePath { get; set; } 
} 

..... 


button.Tag = new WaveButton() { Number = n, WaveFilePath = path } 
+0

感谢您的输入! – 2013-05-11 16:34:21

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(); 
+0

感谢您的输入! – 2013-05-11 16:35:06

+1

谢谢4你的帮助。 – 2017-10-25 17:37:43

0

我知道为时已晚,但我想出一个简单的方法来做到这一点。 刚刚加入像string join = String.join(","firstString,secondString); button.Tag = join; 字符串,并在使用前,它只是它分成两个字符串,这样

string[] split = join.Split(','); 
     string title = split[1]; 
     string link = split[0]; 

和使用字符串的标题和链接字符串,只要你喜欢。 (Y) 我不知道这是否是一种好的做法,但我正在使用它,它的工作完美。

我是新来的c#。

相关问题